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.

[参考译文] TMS320F28027:C2000闪存 API 问题

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/565650/tms320f28027-c2000-flash-api-questions

器件型号:TMS320F28027

大家好!

我正在使用闪存 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 时序将错误。

    此致、

    曼诺伊

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