主题中讨论的其他器件:C2000WARE
如何在同一项目中使用 C2000Ware 头文件和库以及 SYS/BIOS?
C2000培训小程序码
This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
要创建使用 C2000Ware 器件支持文件的 SYS/BIOS 工程、通常建议从 SYS/BIOS 示例或模板工程开始、并向其中添加对 C2000Ware 的支持。 器件的 device_support/下的 C2000Ware 中 /docs/目录中、有一个固件开发用户指南、其中包含有关创建新的非 SYS/BIOS 项目的分步说明。 许多相同的指令可用于指导您完成哪些文件、路径变量、包含路径目录、预定义符号等...需要添加到您选择作为起点的 SYS/BIOS 项目中。
另一个选项是导入现有的 C2000Ware 示例并将其用作源代码、您可以将上述项目复制到 SYS/BIOS 工程中。 我在下面展示 了 SYS/BIOS"最小"模板项目(请参阅此处有关导入 SYS/BIOS 示例和模板的说明)、其中我已将 F2837xD driverlib 和其他器件支持文件集成到该项目中。 具体的文件和设置将因您的器件和起始示例而异。
在 Project Explorer 中复制的文件:
包含选项和预定义符号:
此外、请检查其他选项、如链接资源/路径变量、处理器选项和各种链接器选项。
需要注意的一些事项:
复制完所有适当的文件和构建选项后、请尝试构建。 如果段丢失(如.binit)或不适合默认范围、则可能需要解决一些链接器错误。 如果您不熟悉如何编辑链接器命令文件、 请参阅此文档以了解入门信息。
如果您在 SYS/BIOS 生成的 linker.cmd 文件中遇到链接器错误、这可能与"闪存函数"设置相关。 打开项目的.cfg 文件并编辑引导模块设置以使用.cmd 文件中定义的 RAM 和闪存范围名称。 在我的示例中、我将我的加载/运行存储器与.cmd 文件用于.TI.ramfunc 的存储器相匹配。 在 cfg 脚本中、它如下所示:
boot.loadSegment ="FLASHD PAGE = 0";
Boot.runSegment ="RAMLS0 PAGE = 0";
当您开始将 C2000Ware 函数调用和头文件添加到 SYS/BIOS 项目时、需要记住一些资源注意事项。
默认情况下、SYS/BIOS 引导模块将配置 SYSCLK 速率。 如果应用程序代码也调用 Device_init()或 InitSysCtrl(),则最终可能会出现与此冗余重新配置相关的问题。 我建议在.cfg 文件中禁用此选项并使用 C2000Ware 函数来配置时钟、因为 C2000Ware 更新频率更高、并且具有最新的时钟配置过程。 请注意、您仍需要告知 BIOS SYSCLK 频率是多少、以便可以准确配置其时钟节拍。 在 cfg 脚本中、它如下所示:
boot.configureClocks = false;
bios.cpufreq.lo = 200000000;
SYS/BIOS 引导模块还能够配置闪存包装程序-启用闪存、设置等待状态等。 与 SYSCLK 配置一样、注意只使用一种方法来执行此配置、从而避免引导模块代码和 C2000Ware 代码之间可能出现的冗余或冲突。
SYS/BIOS 的 Hwi 模块应用于管理中断。 因此、您通常不应在应用程序中编写代码来配置 PIE 矢量表、PIE 寄存器或与中断相关的 CPU 寄存器、并存在覆盖 Hwi 模块所需配置的风险。 示例包括 Interrupt_initVectorTable()、Interrupt_register()或 InitPieVectTable()等函数。 相反、为中断创建 Hwi、并在需要进行更新时调用 SYS/BIOS Hwi 模块函数。
请注意、虽然 SYS/BIOS 将配置 PIE 和 CPU 寄存器、但它不知道外设级中断寄存器/位(SPICTL.SPIINTENA、ETSEL.INTEN 等)。 您仍需要在代码中执行这些配置。 还记得、与常规非 BIOS ISR 不同、Hwi 函数不需要__interrupt 关键字。
SYS/BIOS 时钟模块使用器件的 CPU 定时器之一来运行其系统节拍。 同样、如果您使用的是时间戳模块、它也可能使用另一个 CPU 计时器。 如果您需要在应用中使用 CPU 计时器、请确保其中一个模块尚未使用 CPU 计时器。
有关 SYS/BIOS 定时器使用和其他 C28x 特定 SYS/BIOS 项目的更多详细信息、请参阅此 常见问题解答主题。
/* * ======== main.c ======== */ #include <xdc/std.h> #include <xdc/runtime/System.h> #include <ti/sysbios/BIOS.h> #include <ti/sysbios/knl/Task.h> #include "device.h" /* * ======== taskFxn ======== */ Void taskFxn(UArg a0, UArg a1) { for(;;) { // // Turn on LED // GPIO_writePin(DEVICE_GPIO_PIN_LED1, 0); // // Delay for a bit. // Task_sleep(500); // // Turn off LED // GPIO_writePin(DEVICE_GPIO_PIN_LED1, 1); // // Delay for a bit. // Task_sleep(500); } } /* * ======== main ======== */ Int main() { /* * use ROV->SysMin to view the characters in the circular buffer */ System_printf("enter main()\n"); // // Initialize device clock and peripherals // Device_init(); // // Initialize GPIO and configure the GPIO pin as a push-pull output // Device_initGPIO(); GPIO_setPadConfig(DEVICE_GPIO_PIN_LED1, GPIO_PIN_TYPE_STD); GPIO_setDirectionMode(DEVICE_GPIO_PIN_LED1, GPIO_DIR_MODE_OUT); BIOS_start(); /* does not return */ return(0); }