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.
大家好!
我正在使用闪存 API 库 将一些数据存储在 TMS320F28027器件的闪存中。CCSv6.1.1、Win8.1
我将 Flash2802x_API_Quickstart.pdf 和 Flash2802x_API_using_CCS4.0v_Readme.pdf 用作文档、 并将 Example_Flash2802x_api.c 用作模板。 闪存 API 位于片上 ROM 中、因此我不会这样做
将它们复制到 RAM 中、但从 ROM 运行。
我有一些问题:
在 .cmd 文件 DSP2802x_Headers_nonBIOS.cmd 中、用于放置变量 Flash_CallbackPtr 和 Flash_CPUScaleFactor 的段定义 是
/*** PIE Vect 表和引导 ROM 变量结构***/ 联合运行= PIE_VECT,PAGE = 1 { PieVectTableFile 组 { EMUKeyVar EMUBModeVar FlashCallbackVar//此应为@0x000D02 FlashScalingVar//此应为@0x000D04 } }
如何告知链接器放置 FlashCallbackVar 段@0x000D02和 FlashScalingVar @0x000D04、这是闪存 API 所要求的?
为什么不分别放置@0x000D02和0x000D03或其他位置?
使用 API 例程后、我必须恢复 Pie 中断矢量表、因为它被 Flash_CallbackPtr 和 Flash_CPUScaleFactor 变量"损坏"、对吧?
在 Example_Flash2802x_api.c 中的示例代码中、位于 RAM 中的函数 Example_CallFlashAPI (不是闪存):
#pragma CODE_SECTION (example_CallFlashAPI、"ramfuncs"); void example_CallFlashAPI (void) { uint16 i; uint16 Status; uint16 * Flash_ptr; //指向闪存 uint32长度中某个位置的指针; // 要编程的16位值的数量 float32版本; //浮点 UINT16版本十六进制中 API 的版本; //以十进制编码十六进制表示的 API 版本 /*----------------- ...等等... ---------------------------------------- // 版本十六进制= Flash_API 版本十六进制(); if (版本十六进制!= 0x0201) { //意外的 API 版本 //根据此信息做出决策。 asm (" ESTOP0"); } 版本= Flash_API 版本(); if (版本!=(float32) 2.01) { //意外的 API 版本 //根据此信息做出决策。 asm (" ESTOP0"); } // sectora-SECTORH 在 Flash2802x_API_Library.h Status = Flash_Erase ((sectorb|SECTORC|SECTRD)、&FlashStatus); if (Status!= STATUS_SUCCESS ){中定义 Example_Error (Status); } for (i=0;i但该函数本身不执行任何时间关键型代码。 问题是-此函数是否可以从闪存运行? 就是这样。 为什么不呢? 时间关键型 API 函数 Flash_Verify、Flash_Erase、Flash_Program 从 ROM 运行、因此这应该可以、不可以吗?
这样做的主要目的是、我不希望浪费片上 RAM 来执行该功能。
4.在 Example_Flash2802x_API.h 中的示例项目中定义了一个 PLLCR_VALUE:
/*------------------ 指定 PLLCR (PLL 控制寄存器)值。 通过删除前导双斜杠://取消注释相应的行 只应取消注释一条语句。 在调用任何之前、用户的应用必须设定 PLLCR 寄存器 闪存 API 函数。 示例:CLKIN 是一个10MHz 晶体。 用户希望有一个60MHz 的 CPU 时钟(SYSCLKOUT=60MHz)。 在这种情况下、PLLCR 必须设置为12 (0x000C) 取消注释行:#define PLLCR_VALUE 0x000C 用双斜线注释掉其余的行:// --------------------------- */ #define PLLCR_VALUE 0x000C // SYSCLKOUT =(OSCLK*12)/2 //#define PLLCR_value 0x000B // SYSCLKOUT =(OSCLK*11)/2 //#define PLLCR_value 0x000A // SYSCLKOUT =(OSCLK*10)/2 //#define PLLCR_value 0x0009 // SYSCLKOUT=(OSCLK*9)/2 //#define PLLCR_value 0x0008 // SYSCLKOUT =(OSCLK*8)/2 //#define PLLCR_value 0x0007 // SYSCLKOUT =(OSCLK*7)/2 //#define PLLCR_value 0x0006 // SYSCLKOUT =(OSCLK*6)/2 //#define PLLCR_value 0x0005 // SYSCLKOUT =(OSCLK*5)/2 //#define PLLCR_value 0x0004 // SYSCLKOUT =(OSCLK*4)/2 //#define PLLCR_value 0x0003 // SYSCLKOUT =(OSCLK*3)/2 //#define PLLCR_value 0x0002 // SYSCLKOUT =(OSCLK*2)/2 //#define PLLCR_value 0x0001 // SYSCLKOUT=(OSCLK*1)/2 //#define PLLCR_value 0x0000 // SYSCLKOUT =(OSCLK)/2 (PLL 被绕过)我先前在专有初始化代码中设置 PLLCR 寄存器。 如果在闪存 API 中使用此常量、我是否应该按上述方法操作、或者我是否可以忽略此指导?
谢谢。
1) 1) PIEVECT 的起始地址为0xD00。 当您按特定顺序对数据段进行分组时、链接器会自动按该顺序存储变量。
链接器会按如下所示的特定顺序放置变量
0xD00 - EMUKeyVar
0xD01 - EMUBModeVar
0xD02 / 0xD03 - FlashCallbackVar
0xD04 / 0xD05 - FlashScalingVar
2) 2)运行闪存 API 例程不应损坏 FlashCallbackVar / FlashScalingVar
3)示例_CallFlashAPI 函数调用闪存 API 函数。 由于闪存 API 函数不应从闪存中调用/执行、因此它已从 RAM 中运行
4) 4)如果提前定义、则应该可以。 闪存 API 算法时序基于 SYSCLK 之外的内容。 因此、请确保 SYSCLK 频率配置正确、否则闪存 API 时序将错误。
此致、
曼诺伊