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.

[参考译文] CCS/TMS320F28379S:调用 WDCR 复位后触发 NMI ISR。

Guru**** 2529560 points
Other Parts Discussed in Thread: TMS320F28379S, C2000WARE

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/831628/ccs-tms320f28379s-nmi-isr-being-triggered-after-calling-wdcr-reset

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

工具/软件:Code Composer Studio

您好、

我的器件利用 TMS320F28379S 上的闪存 API。 但是、每当我调用这两行来复位微处理器时:

WdRegs.WDCR.ALL = 0x28;
WdRegs.WDCR.ALL = 0x00;

器件最终在 NMI ISR 例程中冻结。

在尝试覆盖闪存后、Flash0EccRegs 中出现几个错误、例如 ERR_STATUS 读取0x00060002。 SINGLE_ERR_ADDR_LOW 读取为0x00088008。 SINGLE_ERR_ADDR_HIGH 读取0x00088004。 下面列出了写入闪存的代码、它主要取自控制套件中的示例。

void Program_FlashAPI (void)
{
Fapi_StatusType oReturnCheck;
volatile Fapi_FlashStatusType oFlashStatus;
Fapi_FlashStatusWordType oFlashStatusWord;
UINT32 u32Index = 0;
UINT16 I = 0;

EALLOW;
PUMPREQUEST = 0x5A5A0002; //将泵所有权授予 FMC0 (Bank0)

oReturnCheck = Fapi_initiatileAPI (F021_CPU0_W0_BASE_ADDRESS、194);
if (oReturnCheck!= Fapi_Status_Success)
{Example_Error (oSecurnCheck);}

oReturnapi= Fash_Status_Success_Success_Flash








!
(Fsection_Check_FoFoFnSturapi_Check= Fost_Dion_Dion_Diftorex!(FnF)


(u32Index <(flash_SectorE_start + wors_in_flash_buffer))&&
(oReturnCheck = Fapi_Status_Success);i+= 8、u32Index+=8)
{
//
发布程序命令
//
oReturnCheck = Fapi_issueProgramming Command ((((Uint32 *、uint8)、ueEEPROM 命令/u32 *、uint8)、uinteBuffer fapi_DataOnly);
//
等待闪存程序操作完成//

while (fapi_checkFsmForReady()!= Fapi_Status_FsmReady){}
if (oReturnCheck!= Fapi_Status_Success)
{example_Error (oFlashurnCheck);}
oFlashStatus = Fapi_Status_FsmReady){= Fapi/ FAILn
!


/(// if)(/fstat/funebug (/f)



//
//验证编程值
//
// oReturnCheck = fapi_doVerify (((uint32 *) u32Index、4、flash_Sectore_start + i、&oFlashStatusWord);
//if (oReturnCheck!= fapi_Status_Success)
//{
//
检查闪存 API 文档





;//检查0xAQUEST/错误= 0xA5PURN;//检查可能的错误:// E0Xn

//
此处完成示例
//
//Example_Done ();
} 

读取闪存时也会出现几个错误、其中存储了0x0000、将读取为0x0200。 在读取闪存时、我只需使用此子例程来读取指向的信息:

void Load_Flash_Buffer (void)
{
uint16 i;
uint16 * Flash_ptr; //指向闪
存 Flash_ptr 中某个位置的指针=(uint16*) EEPROM_Copy;
for (i=0;i < 256;i++)
{
EEPROM_52. Buffer[i]=((unsigned char)* Flash_ptr)& 0xFF);
Flash_PTR++;
}

引发这些错误的原因是否具体、除了控制套件示例之外、我还应该遵循标准代码来写入和读取闪存中的某个位置?

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

    Robert、

    对闪存进行编程时、您还需要对 ECC 进行编程。 根据您的代码片段、您不会对 ECC 进行编程。  因此是误差。

    在代码中,发送到 Fapi_issueProgrammingCommand()的最后一个参数是 Fapi_DataOnly。  

    您可以改用 Fapi_AutoEccGeneration。 这将导致闪存 API 为您计算 ECC 并对其进行编程。 您可能已经注意到 C2000Ware 中提供的示例中的情况相同。

    请注意、您需要在64位或128位对齐存储器上一次对64位或128位进行编程(ECC 每64位计算一次、在单个程序函数调用中可编程的最大位数为128位)。

    您可以在以下资源中阅读有关它的更多信息:

    F2837xS 闪存 API (V1.55)参考指南链接: http://www.ti.com/lit/pdf/spnu630

    闪存 API 和 ECC wiki: http://processors.wiki.ti.com/index.php/C2000_Flash_FAQ

    如果您对此有其他疑问、请告诉我。

    谢谢、此致、

    Vamsi

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

    Vamsi、

    谢谢、Fapi_AutoEccGeneration 似乎修复了闪存读取和写入。 程序不再被捕获在 NMI ISR 中。

    但是、我尝试了几次在成功初始化后将 RESET 命令发送到微处理器的迭代。 第一次微处理器重置成功、但第二次重置似乎在我无法查看的代码中锁定微处理器。

    我调用的代码如下所述、它与接收特定 I2C 命令相关联:

    WdRegs.WDCR.ALL = 0x28;  
    WdRegs.WDCR.ALL = 0x20;  

    为了澄清、我等待初始化完成、调用此复位命令;然后等待初始化再次完成、并调用此命令、导致微处理器锁定。

    第二个微处理器复位的奇怪之处在于、WdRegs 中的 WDCR 读取0x00C0。 尽管我的命令不会影响寄存器中的"已恢复"位置。 这有什么原因吗?

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

    Robert、

    我建议在这个问题上开始一个新的主题。 我们会将其分配给 SystemControl 专家、以进一步帮助您。

    谢谢、此致、
    Vamsi