你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32G0的硬件CRC

[复制链接]
watershade 提问时间:2021-6-15 16:47 / 已解决
STM32G0系列有硬件CRC(很多其它系列好像也有),在和trinamic的步进电机驱动(比如TMC2209)通讯的时候会需要计算CRC。我其实拿STM32的硬件CRC试过,一些普通的算法,数据都是正常的。
主要是设置起始值,函数表达式,输入和输入是否需要取反,输出数据是否异或。但是TMC2209的CRC8-ATM,却没看懂应该怎么设置。(对了STM32会自动把X8去掉,但是TMC2209似乎把X8用下一个字节的数据来计算的。对CRC还是不太理解)
CRC.png
请大牛指点一下。

收藏 评论1 发布时间:2021-6-15 16:47

举报

1个回答
watershade 最优答案 回答时间:2023-10-28 17:51:06
[md]我也遇到过这个问题。按照手册种的内容,我尝试用c语言简单试了一下。

```

uint8_t test_data1[10] = { 0x01 ,0x23 ,0x45 ,0x67 ,0x89 ,0x1A ,0xBC ,0xDE ,0xF0, 0x00 };
uint8_t test_data2[10] = { 0xFE ,0xDC ,0xBA ,0x98 ,0x76 ,0x54 ,0x32 ,0x10 ,0xF8, 0x00 };

void swuart_calcCRC(uint8_t* datagram, uint8_t datagramLength)
{
    int i, j;
    uint8_t* crc = datagram + (datagramLength - 1); // CRC located in last byte of message
    uint8_t currentByte;
    *crc = 0;
    for (i = 0; i < (datagramLength - 1); i++) { // Execute for all bytes of a message
        currentByte = datagram; // Retrieve a byte to be sent from Array
        for (j = 0; j < 8; j++) {
            if ((*crc >> 7) ^ (currentByte & 0x01)) // update CRC based result of XOR operation
            {
                *crc = (*crc << 1) ^ 0x07;
            }
            else
            {
                *crc = (*crc << 1);
            }
            currentByte = currentByte >> 1;
        } // for CRC bit
    } // for message byte
}

void data_dump(uint8_t* buff, uint8_t length)
{
    printf(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>");
    for (int i = 0; i < length; i++) {
        if (i % 5 == 0) {
            printf("\r\n");
        }
        printf("%02x  ", buff);
    }
    if ( (length-1) % 5 != 0) {
        std::cout << std::endl;
    }
    printf("<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<\r\n");
}

int main()
{
    std::cout << "Hello!, It is a CRC8-ATM demo\n";

    std::cout << "data in test_data1 is: \r\n";
    swuart_calcCRC(test_data1, 10);
    data_dump(test_data1, 10);

    std::cout << "data in test_data2 is: \r\n";
    swuart_calcCRC(test_data2, 10);
    data_dump(test_data2, 10);

}
```

按照这个代码出现的结果如下:

![image.png](data/attachment/forum/202310/28/172354l9921olsr8p2vljp.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/300 "image.png")

上面的代码时官方的。那怎么配置stm32的参数呐?我们不妨先用在线工具测试一下:

![image.png](data/attachment/forum/202310/28/172516fgadgpev11xgdegn.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/300 "image.png")

总结如下:输入反转,输出不反转。(反转时LSB在前,否则MSB在前。)初始值时00,多项式是07(X8+X2+X1+X0),结果不异或。

那怎么在stm32里面配置呐?

我猜应该如下:

![image.png](data/attachment/forum/202310/28/175005x7rwdwj7al3wrbdm.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/300 "image.png")

为什么我不验证呐?因为我缺少一块开发板和micro USB线。
image.png
image.png
image.png

所属标签

相似问题

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版