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.

[参考译文] MSP430FR6007:支持 DMA 的 32 位校验和

Guru**** 2576215 points


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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1573991/msp430fr6007-32-bit-checksum-with-dma-support

器件型号: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;
    }
}

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

    > cfg.triggerSourceSelect = DMA_TRIGGERSOURCE_23;//软件

    根据数据表 (SLASEV3A) 表 9-11 和用户指南 (SLAU367P) 表 11-2、我认为 23 的触发条件只能由 USCI 使用、即设置 DMAREQ 不会触发传输。  

    请尝试:

    > cfg.triggerSourceSelect = DMA_TRIGGERSOURCE_0;//软件