请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
器件型号:MSP430FR6007工具/软件:
您好、
我尝试计算支持 DMA 的 CRC32、但很遗憾、我在此例程上出现超时、有任何线索、为什么?
static uint32_t calculateCrcWithDMA(const uint8_t *data, uint16_t length)
{
// Initialize CRC32 hardware - based on TI example
const uint32_t CRC_Init = 0xFFFFFFFF;
CRC32INIRESW0 = CRC_Init & 0x0000FFFF; // Init CRC32 HW module low word
CRC32INIRESW1 = CRC_Init >> 16; // Init CRC32 HW module high word
// DMA setup
DMA_initParam cfg = {0};
cfg.channelSelect = DMA_CHANNEL_0;
cfg.transferModeSelect = DMA_TRANSFER_BLOCK;
cfg.transferSize = length;
cfg.transferUnitSelect = DMA_SIZE_SRCBYTE_DSTBYTE;
cfg.triggerSourceSelect = DMA_TRIGGERSOURCE_23; // software
cfg.triggerTypeSelect = DMA_TRIGGER_HIGH; // level
DMA_init(&cfg);
DMA_setSrcAddress(DMA_CHANNEL_0, (uintptr_t)data, DMA_DIRECTION_INCREMENT);
// For bit-reversed CRC32 (ISO3309), use CRC32DIRBW0_L as per datasheet
DMA_setDstAddress(DMA_CHANNEL_0, (uint32_t)(uintptr_t)(&CRC32DIRBW0_L), DMA_DIRECTION_UNCHANGED);
// Clear DMA interrupt flag before starting
DMA0CTL &= ~DMAIFG;
// start transfer
DMA_enableTransfers(DMA_CHANNEL_0);
DMA_startTransfer(DMA_CHANNEL_0);
// Poll for completion for testing
while (!(DMA0CTL & DMAIFG))
{
__no_operation();
}
// cleanup
DMA_disableTransfers(DMA_CHANNEL_0);
// Read CRC32 result from CRC32INIRESW0/W1 as per datasheet - these serve as both init AND result registers
uint32_t result = ((uint32_t)CRC32INIRESW1 << 16) | CRC32INIRESW0;
return result;
}
#pragma vector = DMA_VECTOR
__interrupt void DMA_ISR(void)
{
switch(__even_in_range(DMAIV, 16))
{
case 2: // DMA0IFG
__bic_SR_register_on_exit(LPM0_bits);
break;
default: break;
}
}