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.
您好!
我正在使用 CRC64模块对文件进行集成测试。 对于较小的文件、它可以正常工作、但使用较大的文件不能按预期工作。
我想将存储器区域拆分为 int 32 KB 块(或更小的块)、然后我希望这些块的结果作为下一次计算的初始矢量。
我看不到在哪里设置初始矢量。
我在半模式和 DMA 访问中使用 CRC 模块。
有人有什么想法吗?
谢谢你
Daniel、您好!
随附的 CCS7项目可用于计算具有半 CPU 和 DMA 的 CRC。 从0x0开始从闪存读取数据、段大小为8160*32。 您可以更改 RM57器件的工程属性。
您好 QJ、
感谢您的快速响应。
我的故障曾经是或可能是在 DMA 配置中。
我已经将模式设置为帧传输模式、现在我更改为块传输模式。
示例中的闪存大小有固定大小、永远不会更改。 我的文件在大小和对齐方面是动态的。 因此、我还必须动态设置 FRCNT 和 ELCNT。 但文件大小并不总是可以被2、4、8等整除 这里的解决方案是什么? 我是否必须搜索最大的除数? 还是应将 FRCNT 设置为文件大小、并将 ELCNT 设置为1? 是否无法使用具有不同尺寸的扇区? 例如、当我将一个150KB 的文件拆分为两个64 KB 和一个26 KB 的三个扇区时。 下面我附上了我的源代码、感谢您的回答。
uint64_t crcCalc (crcBASE-t * CRC、uint32_t addr、uint32_t size){
静态 uint32_t init;
volatile uint64 u64Signature = 0;
if (init _EQ_ 0){
crcInit();
init++;
}
/*启用 DMA 模块:这将使 DMA 退出复位*/
dmaEnable();
crcConfig_t sCrcParams;
G_dmaCTRL g_dmaCTRLPKT;
/*配置 DMA 控件打包(结构是 dma.c 的一部分)*/
G_dmaCTRLPKT.Sadd = 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 =大小;/*帧计数*/
G_dmaCTRLPKT.ELCNT = 1; /*元素计数*/
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 = 1ul;/*端口 A 读取(闪存)-端口 B 写入(CRC)*
G_dmaCTRLPKT.tType = block_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_Semy_CPU;
sCrcParams.pcount = g_dmaCTRLPKT.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;
返回 u64签名;
}