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.

[参考译文] LP-MSPM33C321A:MSPM33C321A 与 MSPM0G3507 CRC 性能

Guru**** 2966500 points

Other Parts Discussed in Thread: MSPM0G3507, MSPM33C321A

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1649094/lp-mspm33c321a-mspm33c321a-vs-mspm0g3507-crc-performance

器件型号: LP-MSPM33C321A
Thread 中讨论的其他器件: MSPM0G3507、 MSPM33C321A

我分别在 80 和 160MHz 条件下比较了这两款器件的性能。

然而、MSPM0G3507 比 MSPM33 快几微秒

以下是我用于两个处理器的代码:

#include "ti_msp_dl_config.h"
#include <string.h>

int CalculateCRC16(uint8_t data[], int startpos, int stoppos);

uint8_t std_data[] = {'1', '2', '3', '4', '5', '6', '7', '8', '9'};
// result should be 0xe5cc, 58828

uint8_t test9[] = {
    0xFE, 0x6B, 0x28, 0x40, 0x80, 0x2B, 0x03, 0xF7, 0xD6, 0xFA, 0xFE, 0x02,
    0xFC, 0xFE, 0xBD, 0xF3, 0xFE, 0xE6, 0xFD, 0xF7, 0x24, 0xFF, 0xFF, 0xEE,
    0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xFE, 0xFF, 0x10, 0x01, 0x49, 0xF0, 0x80,
    0x2B, 0x03, 0xF7, 0xD6, 0xFA, 0xFE, 0x02, 0xFC, 0xFE, 0xCD, 0xF3, 0xFE,
    0xE6, 0xFD, 0xF7, 0x24, 0xFF, 0xFF, 0xEE, 0xFF, 0xFF, 0xEE, 0xFF, 0xFF,
    0xFE, 0xFF, 0x3B, 0xC9, 0x63, 0x14, 0x80, 0x2B, 0x03, 0xF7, 0xD6, 0xFA,
    0xFE, 0x02, 0xFC, 0xFE, 0xBC, 0xF3, 0xFE, 0xE6, 0xFD, 0xF7, 0x24, 0xFF,
    0xFF, 0xEE, 0xFF, 0xFF, 0xEE, 0xFF, 0xFF, 0xFE, 0xFF, 0xD9, 0xCC, 0xA2,
    0xD0, 0x80, 0x2B, 0x03, 0xF7, 0xD6, 0xFA, 0xFE, 0x02, 0xFC, 0xFE, 0xBC,
    0xF3, 0xFE, 0xE6, 0xFD, 0xF7, 0x24, 0xFF, 0xFF, 0xEE, 0xFF, 0xFF, 0xEE,
    0xFF, 0xFF, 0xFE, 0xFF, 0x00, 0x00, 0x71, 0x01, 0x80, 0x2B, 0x03, 0xF7,
    0xD6, 0xFA, 0xFE, 0x02, 0xFC, 0xFE, 0xCD, 0xF3, 0xFE, 0xE6, 0xFD, 0xF7,
    0x24, 0xFF, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x3F,
    0x72, 0x68, 0x80, 0x80, 0x2B, 0x03, 0xF7, 0xD6, 0xFA, 0xFE, 0x02, 0xFC,
    0xFE, 0xBC, 0xF3, 0xFE, 0xE6, 0xFD, 0xF7, 0x24, 0xFF, 0xFF, 0xEE, 0xFF,
    0xFF, 0xEF, 0xFF, 0xFF, 0xEE, 0xFF, 0x0A, 0xBA, 0x21, 0x8B, 0x80, 0x2B,
    0x03, 0xF7, 0xD6, 0xFA, 0xFE, 0x02, 0xFC, 0xFE, 0xBC, 0xF3, 0xFE, 0xE6,
    0xFD, 0xF7, 0x24, 0xFF, 0xFF, 0xEE, 0xFF, 0xFF, 0xEF, 0xFF, 0xFF, 0xEE,
    0xFF, 0x04, 0x0D, 0x99, 0x02, 0x80, 0x2B, 0x03, 0xF7, 0xD6, 0xFA, 0xFE,
    0x02, 0xFC, 0xFE, 0xCD, 0xF3, 0xFE, 0xE6, 0xFD, 0xF7, 0x24, 0xFF, 0xFF,
    0xEE, 0xFF, 0xFF, 0xEF, 0xFF, 0xFF, 0xEE, 0xFF, 0xD9, 0x77, 0xC7, 0x06,
    0x80, 0x2B, 0x03, 0xF7, 0xD6, 0xFA, 0xFE, 0x02, 0xFC, 0xFE, 0xBC, 0xF3,
    0xFE, 0xE6, 0xFD, 0xF7, 0x24, 0xFF, 0xFF, 0xEE, 0xFF, 0xFF, 0xEF, 0xFF,
    0xFF, 0xEE, 0xFF, 0x02, 0xC1, 0xE3, 0x1A, 0x80, 0x2B, 0x03, 0xF7, 0xD6,
    0xFA, 0xFE, 0x02, 0xFC, 0xFE, 0xCC, 0xF3, 0xFE, 0xE6, 0xFD, 0xF7, 0x24,
    0xFF, 0x01, 0x01, 0x01, 0x80, 0x0A, 0xBA, 0xB6, 0x62, 0xBD};
// 0x62BD = 25277



int main(void) {
  volatile int std_checksum __attribute__((unused));


  SYSCFG_DL_init();
  
  std_checksum = CalculateCRC16(std_data, 0, 8);
  // std_checksum = CalculateCRC16(test9, 0, 307);

  
  while (1) {
    DL_GPIO_setPins(GPIO_LEDS_PORT, GPIO_LEDS_FAIL_LED_PIN);

    SYSCFG_DL_CRCP_init();

    /*
    for (int i = 0; i < 308; i++) {
      DL_CRCP_feedData8(CRCP0, test9[i]);
    }
    */
    

    memcpy(CRCP0_S->CRCIN_IDX, test9, 308);

    std_checksum = DL_CRCP_getResult16(CRCP0);
    

    //std_checksum = CalculateCRC16(test9, 0, 307);
    
    //delay_cycles(1000);

    DL_GPIO_clearPins(GPIO_LEDS_PORT, GPIO_LEDS_FAIL_LED_PIN);

    delay_cycles(100000);
  }
}

int CalculateCRC16(uint8_t data[], int startpos, int stoppos) {
  int polynomial = 0x1021; // 0001 0000 0010 0001  (0, 5, 12)
  int crc = 0x1D0F;        // 0x1D0F;

  for (int ijk = startpos; ijk <= stoppos; ijk++) {
    int b = (int)(data[ijk] & 0xFF);
    for (int jkl = 0; jkl < 8; jkl++) {
      bool bit = ((b >> (7 - jkl) & 1) == 1);
      bool c15 = ((crc >> 15 & 1) == 1);
      crc <<= 1;
      if (c15 ^ bit)
        crc ^= polynomial;
    }
  }

  crc = crc & 0x0000FFFF; // Bottom 16 bits only.

  return crc;
}

我还附上了项目文件。  

CRC 测试 File.zip 

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

    注意:这与设置最高速度时钟的示例工程的默认编译器选项相同。

    仅供参考:

    MSPM33C321A:6.8us

    MSPM0G3507:4.5us

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

    尊敬的 Keith:

    MSPM33C321A 时钟树限制了某些外设。 这最好显示在数据表方框图中: ti.com/lit/slasfb6

    CRC 块限制为 80MHz、如橙色所示。 我预计这就是它们具有相似结果的原因。

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

    谢谢、您当然是对的。

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

    时钟是否限制为 80MHz 或 MCLK/2? 即、如果我在 32MHz 上运行 CPU、CRC 是否限制为 16?

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

    尊敬的 Keith:  

    否、您应该能够以不同的频率运行 CRC。 只有当 SYSPLL 以高于 80MHz 的频率运行时、才应启用此功能