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/RM48L952:CRC SEMI CPU 64k 限制

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/861447/ccs-rm48l952-crc-semi_cpu-64k-limit

器件型号:RM48L952

工具/软件:Code Composer Studio

您好!

我有一个项目、希望在后台定期检查内部闪存 CRC。我尝试了"RM48 CRC SW full-CPU 和 Semi-CPU"示例代码、该代码在所有链接器部分都低于64k 之前一直有效。

当任何链接器段(.text、.const)高于64k (crc->PCOUNT_REG1 >=8192 with ACCESS_64_BIT)时,CRC->BUSY 总是返回1,CRC 校验是残桩。

 在技术手册中、我没有看到对此有任何限制。

如何解决此问题?

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

    您好 Laszlo、

    在这里、您将找到一个 PCOUNT = 1MB 的示例:

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

    您好、Miro、

    感谢您的快速响应。

    但该示例不起作用。  

    CRC 未配置为"自动"或"半自动"模式。 crcInit()之后,模块处于 FULL_CPU 模式。 它正在运行、但无法正常工作。

    源代码中

    使用 test_fail define ->不起作用、不使用 test_fail define ->确定。 当.text 段大于8192*64位时,会发生相同的问题。  
    恰好在"sCrcParams.pcount>8191"时

    以下是我的源代码:


    #define TEST_FAIL #ifdef TEST_FAIL #pragma RETAIN (填充) const uint8 filler [65000u]={0}; #endif void mainTest (uint8 I) { crcInit(); dmaEnable(); /*启用通道0的所有中断*/ crcEnableNotification (crcREG、 CRC_CH1_CC | CRC_CH1_FAIL | CRC_CH1_OR | CRC_CH1_UR | CRC_CH1_TO); CrcConfig_t sCrcParams; G_dmaCTRL g_dmaCTRLPKT; /*配置 DMA 控件打包(结构是 dma.c 的一部分)*/ G_dmaCTRLPKT.Sadd =_my_crc_table.recs[i].addr;//初始源地址*/ G_dmaCTRLPKT.DADD =(uint32_t)(&(crcREG->PSA_SIGREGL1));//初始目标地址*/ G_dmaCTRLPKT.CHCTRL = 0ul;/*通道控制* G_dmaCTRLPKT.RDSIZE = ACCESS_64_BIT;/*读取大小* G_dmaCTRLPKT.WRSIZE = ACCESS_64_BIT;/*写入大小* G_dmaCTRLPKT.FRCNT = 1;/*帧计数*/ G_dmaCTRLPKT.ELCNT =(_my_crc_table.recs[i].size + 7ul)/ 8ul;/*元素计数* G_dmaCTRLPKPT.ELSOFFSET = 0ul << g_dmaCTRLPKT.RDSIZE;//元素源偏移量*/ G_dmaCTRLPKPT.FRSOFFSET = 0ul << g_dmaCTRLPKT.RDSIZE;/*帧源偏移* G_dmaCTRLPKT.ELDOFFSET = 0ul << g_dmaCTRLPKT.WRSIZE;//元素目标偏移量*/ G_dmaCTRLPKPT.FRDOFFSET = 0ul << g_dmaCTRLPKPT.WRSIZE;//帧目标偏移量* G_dmaCTRLPKT.PORTASGN = 4ul;/*仅端口 B * G_dmaCTRLPKPT.tType = frame_transfer;/* transfer type */ G_dmaCTRLPKT.ADDMODERD = ADDR_INC1; /*地址模式读取*/ G_dmaCTRLPKT.ADDMODEWR = ADDR_FIXED; /*地址模式写入*/ G_dmaCTRLPKT.AUTOINIT = AUTOINIT_OFF;/*自动初始化关闭*/ sCrcParams.crc_channel = CRC_CH1; sCrcParams.mode = CRC_SEMI CPU; sCrcParams.pcount = g_dmaCTRLPPKT.ELCNT; sCrcParams.scount = 1U; sCrcParams.WDG_PRELOAD = 0U; sCrcParams.block_PRELOAD = 0U; crcChannelReset (crcREG、CRC_CH1); crcSetConfig (crcREG、&sCrcParams); /*将 DMA 控制包分配给通道0 */ dmaSetCtrlPacket (DMA_CH0、g_dmaCTRLPKT); /*触发 DMA 通道0 s/w 请求*/ dmaSetChEnable (DMA_CH0、DMA_SW); while ((dmaREG->SWCHENAS & 1ul)|(crcREG->BUSY & 1ul)) { /*等待 DMA 完成后,CRC 指示块已压缩*/ } u64Signature = crcGetSectorSig (crcREG、CRC_CH1); /*清除 CH1_CCIT 位*/ crcREG->status = CRC_CH1_CC; /*检查 CRC */ printf ("mainTest CRC[%d]"、i); if (u64Signature!=_my_crc_table.recs[i].crc_value) { printf ("错误的@地址:0x%08X\n"、_my_crc_table.recs[i].addr); } 其他 { printf ("OK\r\n"); } } int main (void) { uint32 i; while (1) { 对于(i=0;i<_my_crc_table.num_recs;i++) { mainTest(i); } }

    //#define TEST_FAIL
    #ifdef test_fail
    #pragma RETAIN (填充)
    const uint8填充器[65000u]={0};
    #endif

    int main (空)

         uint32 i;

    while (1)

    对于(i=0;i<_my_crc_table.num_recs;i++)

     mainTest(i);

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

    您好!

    很抱歉耽误你的回答。 您在这个问题上是否取得了一些进展?

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

    您好!

    问题仍然存在、但我对此采取了一种变通办法。 解决方法:不要通过 DMA->CRC 发送任何大于8191的块。  
    如果块数大于8191、请将其拆分为多个迭代:

    初始化 CRC、
    2.复位 CRC 通道、
    3.配置并发送带有 DMA 的8191块,
    4、等待 DMA 完成(不复位 CRC)、
    5.如果剩余任何块,请转至步骤3。
    6.检查 CRC 完成
    7.读出 CRC 值。

    如果您有任何其他建议、请写下。

    Laszlo Koncseg