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
您好!
我有一个项目、希望在后台定期检查内部闪存 CRC。我尝试了"RM48 CRC SW full-CPU 和 Semi-CPU"示例代码、该代码在所有链接器部分都低于64k 之前一直有效。
当任何链接器段(.text、.const)高于64k (crc->PCOUNT_REG1 >=8192 with ACCESS_64_BIT)时,CRC->BUSY 总是返回1,CRC 校验是残桩。
在技术手册中、我没有看到对此有任何限制。
如何解决此问题?
您好、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