主题中讨论的其他器件:C2000WARE
工具/软件:Code Composer Studio
我为 launchad F280049C 编写了 sci (UART)代码。
当我从 RAM 运行时、代码工作正常。 但是、当我将 ACTIVE 设置为 Flash_Lib 时、TX 仍然工作、RX 停止工作。
当从闪存运行时、调用函数 SCI_getRxFIFOStatus 始终为零。 但它在从 RAM 运行时工作正常。
感谢您的任何建议。
最棒的
Zong
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.
工具/软件:Code Composer Studio
我为 launchad F280049C 编写了 sci (UART)代码。
当我从 RAM 运行时、代码工作正常。 但是、当我将 ACTIVE 设置为 Flash_Lib 时、TX 仍然工作、RX 停止工作。
当从闪存运行时、调用函数 SCI_getRxFIFOStatus 始终为零。 但它在从 RAM 运行时工作正常。
感谢您的任何建议。
最棒的
Zong
Zong、
在 C2000Ware 中基于闪存的链接器 cmd 文件中、您可以注意到有一个名为.TI.ramfunc 的段-这有一个不同的加载地址和运行地址。 您可以使用闪存作为加载地址、使用 RAM 作为运行地址。 通过将 ISR 映射到此段、您可以将 ISR 加载到闪存中、但从 RAM 执行 ISR -链接器使用运行 RAM 地址执行。 在调用/使用应用程序中的函数之前,用户应用程序应调用 memcpy()以将内容从闪存复制到 RAM。 这样、您可以在执行 ISR 时消除闪存等待状态损失-这允许 CPU 有更多的带宽来执行所有 ISR (在其他 ISR 占用 CPU 带宽的情况下、建议这样做)。
请查看 C2000Ware 示例。 示例:C000Ware_3_02_00_00\driverlib\f28004x\examples\flashapi_ex1_program_autoecc.c
在此文件中、您可以看到 Example_CallFlashAPI (void)映射到.TI.ramfunc 段、如下所示:
#ifdef __cplusplus
#pragma CODE_SECTION (".TI.ramfunc");
其他
#pragma CODE_SECTION (example_CallFlashAPI、".TI.ramfunc");
#endif
空示例_CallFlashAPI (空)
在链接器 cmd 文件中、您可以看到 .TI.ramfunc 段具有不同的加载(闪存)和运行(RAM)地址。
组
{
.TI.ramfunc
{-l F021_API_F28004x_FPU32.lib}
}LOAD = FLASH_BANK0_SEC1、
运行= RAMLS03、
load_start (_RamfuncsLoadStart)、
load_size (_RamfuncsLoadSize)、
load_end (_RamfuncsLoadEnd)、
run_start (_RamfuncsRunStart)、
run_size (_RamfuncsRunSize)、
run_end (_RamfuncsRunEnd)、
PAGE = 0、ALIGN (4)
在示例 main()中,您可以看到 Device_init()调用 memcpy(),以将.TI.ramfunc 内容从闪存复制到 RAM。
//
//主函
//
void main (void)
{
//
//初始化设备时钟和外设
//将闪存初始化代码从闪存复制到 RAM
//将闪存 API 从闪存复制到 RAM
//配置闪存等待状态、回退功率模式、性能特性和 ECC
//
device_init();
您还可以访问 https://e2e.ti.com/support/microcontrollers/c2000/f/171/t/878674
谢谢、此致、
Vamsi