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.

[FAQ] [参考译文] [常见问题解答]如何在 SYS/BIOS 工程中使用 C2000Ware 文件?

Guru**** 1831610 points
Other Parts Discussed in Thread: C2000WARE
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/989425/faq-how-do-i-use-c2000ware-files-in-a-sys-bios-project

主题中讨论的其他器件:C2000WARE

如何在同一项目中使用 C2000Ware 头文件和库以及 SYS/BIOS?

C2000培训视频:https://training.ti.com/search-catalog/field_language/ZH-CN?keywords=C2000&start%5Bdate%5D=&end%5Bdate%5D=

C2000培训小程序码

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    项目配置

    要创建使用 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 中复制的文件:

    包含选项和预定义符号:

       

    此外、请检查其他选项、如链接资源/路径变量、处理器选项和各种链接器选项。

    需要注意的一些事项:

    • 在上面的示例中、我使用了 C2000Ware 示例中的闪存链接器命令文件、并删除了原始的 cmd 文件。 您可以选择其中一个、但如果您同时选择这两个选项、它们将会发生冲突。
    • 我没有复制 CodeStartBranch.asm 文件--引导模块"Enable boot from flash"选项将用于相同的目的。 同样、如果您尝试同时保留这两个错误、则可能会出现链接器错误。
    • 默认情况下、C28x SYS/BIOS 示例使用 COFF。 如果需要、您可以将 ABI 设置更改为 EABI。

    复制完所有适当的文件和构建选项后、请尝试构建。 如果段丢失(如.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 项目的更多详细信息、请参阅此 常见问题解答主题

    组合了 SYS/BIOS"最小值"和 C2000Ware led_ex1_blinky 示例源代码:

    /*
     *  ======== 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);
    }