您好!
在我的引导加载程序中、我希望利用嵌入式 CRC 控制器计算应用程序映像的 CRC、然后再跳转到该映像。
我认为具有 DMA 的自动模式将是最快的。
TI 能否提供计算大闪存区域单个 CRC 的示例代码? (假设应用程序映像大于1 MB)
我想生成单个 CRC、而不是每个1Kb 的多个 CRC 等
提前感谢您
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.
您好!
在我的引导加载程序中、我希望利用嵌入式 CRC 控制器计算应用程序映像的 CRC、然后再跳转到该映像。
我认为具有 DMA 的自动模式将是最快的。
TI 能否提供计算大闪存区域单个 CRC 的示例代码? (假设应用程序映像大于1 MB)
我想生成单个 CRC、而不是每个1Kb 的多个 CRC 等
提前感谢您
谢谢 QJ。
我决定使用半自动 CPU 模式。 奇怪的是,我第一次计算 CRC 时,PSA_SECSIGREGL1/H1为0x0,某些值存储在 PSA_SIGREGL1/H1中。 但是、在后续计算中、PSA_SIGREGL1/H1为0x0、PSA_SECSIGREGL1/H1具有第一次计算 CRC 后在 PSA_SECSIGREGL1/H1中观察到的值。
在半自动 CPU 模式下、我知道应该读取 PSA_SECSIGREGL1/H1以获取 CRC 值。
不知道为什么 CRC 值存储在 PSA_SIGREGL1/H1中用于第一次 CRC 计算?
下面是我得到的结果:
int main()
{
。
rtiInit();
sciInit();
/**-配置 CRC */
crcInit();
sciEnableNotification (sciREG、SCI_RX_INT );
sciEnableNotification (sciREG、SCI_TX_INT );
rtiEnableNotification (rtiNOTIFICATION_COMPARE0 );
_enable_IRQ ();
。
CRC_TMS570 (START_ADDRESS、SIZE);
// PSA_SECSIGREGL1/H1为0x0,某些值存储在 PSA_SIGREGL1/H1中,例如 X 和 Y
CRC_TMS570 (START_ADDRESS、SIZE);
// PSA_SIGREGL1/H1为0x0,PSA_SECSIGREGL1/H1具有 X 和 Y
CRC_TMS570 (START_ADDRESS、SIZE);
// PSA_SIGREGL1/H1为0x0,PSA_SECSIGREGL1/H1具有 X 和 Y
}
uint64_t crc_tms570 (uint32_t start_address、uint32_t size)
{
volatile uint32_t counter = 0;
uint32_t Pcount =大小/8;
/**-设置信道模式*/
crcREG->CTRL2=0x00000000;
crcREG->CTRL2 |=(CRC_SEMI CPU);
dmaEnable();
crcREG->CTRL2 &=0xFFFFFFFCU;
crcREG->CTRL2 |= CRC_SEMI CPU;
crcREG->PCOUNT_REG1 = Pcount;
crcREG->SCOUNT_REG1 = 1;
crcChannelReset (crcREG、0);
/*-分配 DMA 请求:带有请求线的通道0 - 26 */
dmaReqAssign (DMA_CH0,26);
/*-配置 DMA 控制数据包*/
dmaConfigCtrlPacket (start_address、(uint32_t)(&(crcREG->PSA_SIGREGL1))、Pcount、ADDR_INC1、ADDR_FIXED、 AUTOINIT_ON);
/*-设置 DMA 控制数据包*/
dmaSetCtrlPacket (DMA_CH0、g_dmaCTRLPKT);
/*-将 DMA 通道设置为在软件请求时触发*/
dmaSetChEnable (DMA_CH0、DMA_SW);
while ((crcREG->BUSY & 0x1))
{
COUNTER++;
如果((计数器% 0x20000)=0)
{
dwdReset();
}
}
dmaDisable();
//首次调用此 CRC_TMS570 ()时,PSA_SECSIGREGL1/H1为0x0,某些值存储在 PSA_SIGREGL1/H1中
uint64_t CRC_ACTUAL =(((uint64) crcREG->PSA_SIGREGL1 <<32U)|(uint64) crcREG->PSA_SIGREGH1);
//但是,在此 CRC_TMS570 ()的后续调用中,PSA_SIGREGL1/H1为0x0,PSA_SECSIGREGL1/H1具有一些值
// PSA_SECSIGREGL1/H1应存储 CRC 值,无论首次或后一次调用
//那么, 为什么 CRC 值存储在 PSA_SIGREGL1/H1中以进行第一次 CRC 计算
//uint64_t CRC_ACTUAL =(((uint64) crcREG->PSA_SECSIGREGL1 << 32U)|(uint64) crcREG->PSA_SECSIGREGH1);
返回 CRC_ACTUAL;
}
我再也看不到"BAD0BAD0"模式。 但是、CRC 完成中断 有时不会触发。 请您查看 以下功能吗? 不确定我做了什么错?
int main()
{。。
crcInit();
enableCRCNotification (CrcREG、CRC_CH1_CC);
。
静态 uint64_t CRC_64 (uint32_t start_address、uint32_t size)
{
uint32_t Pcount =大小/8;
/**-设置信道模式*/
crcREG->CTRL2=0x00000000;
crcREG->CTRL2 |=(CRC_SEMI CPU);
dmaEnable();
crcREG->CTRL2 &=0xFFFFFFFCU;//通道0
crcREG->CTRL2 |= CRC_SEMI CPU;
crcREG->PCOUNT_REG1 = Pcount;
crcREG->SCOUNT_REG1 = 1;
crcChannelReset (crcREG、0);
/*-分配 DMA 请求:带有请求线的通道0 - 26 */
dmaReqAssign (DMA_CH0,26);
/*-配置 DMA 控制数据包*/
dmaConfigCtrlPacket (start_address、(uint32_t)(&(crcREG->PSA_SIGREGL1))、Pcount、ADDR_INC1、ADDR_FIXED、 AUTOINIT_OFF);
/*-设置 DMA 控制数据包*/
dmaSetCtrlPacket (DMA_CH0、g_dmaCTRLPKT);
/*-将 DMA 通道设置为在软件请求时触发*/
dmaSetChEnable (DMA_CH0、DMA_SW);
while ((dmaREG->GCTRL &(1 << 14))&&(crcREG->BUSY & 0x1));
dmaDisable();
uint64_t CRC = crcGetSectorSig (crcREG、0);
/*清除 CH1_CCIT 位*/
crcREG->status = CRC_CH1_CC;
返回 CRC;
}
静态空 dmaConfigCtrlPacket (uint32_t Sadd、uint32_t dadd、uint32_t dsize、uint8_t Add_RD_mode、uint8_t Add_WR_mode、uint8_t AIM)
{
G_dmaCTRLPKT.Sadd =添加;//源地址*/
G_dmaCTRLPKT.DADD =添加;/*目标地址*/
G_dmaCTRLPKT.CHCTRL = 0;/*通道控制*/
G_dmaCTRLPKT.FRCNT = 1;/*帧计数*/
G_dmaCTRLPKT.ELCNT = dsize;/*元素计数*/
G_dmaCTRLPKT.ELDOFFSET = 0;/*元素目标偏移量*
G_dmaCTRLPKT.ELSOFFSET = 0;/*元素目标偏移量*
G_dmaCTRLPKT.FRDOFFSET = 0;/*帧目标偏移量*
G_dmaCTRLPKT.FRSOFFSET = 0;/*帧目标偏移量*
G_dmaCTRLPKT.PORTASGN = 4;/*端口 b *
G_dmaCTRLPKT.RDSIZE = ACCESS_64_BIT;/*读取大小*
G_dmaCTRLPKT.WRSIZE = ACCESS_64_BIT;/*写入大小*
G_dmaCTRLPKT.tType = block_transfer;/* transfer type *
G_dmaCTRLPKT.ADDMODERD = ADD_RD_MODE;/*地址模式读取*
G_dmaCTRLPKT.ADDMODEWR = ADD_WR_MODE;/*地址模式写入*
G_dmaCTRLPKT.AUTOINIT = AIM;/* autocinit */
}