打印

[求助] GD32F450450 的CRC寄存器怎么用

[复制链接]
5355|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
两只袜子|  楼主 | 2021-8-21 09:40 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
有人用过CRC寄存器计算CRC吗?
/* function declarations */
/* deinit CRC calculation unit */
void crc_deinit(void);
/* reset data register to the value of initializaiton data register */
void crc_data_register_reset(void);
/* read the data register */
uint32_t crc_data_register_read(void);
/* read the free data register */
uint8_t crc_free_data_register_read(void);
/* write the free data register */
void crc_free_data_register_write(uint8_t free_data);
/* CRC calculate a 32-bit data */
uint32_t crc_single_data_calculate(uint32_t sdata);
/* CRC calculate a 32-bit data array */
uint32_t crc_block_data_calculate(uint32_t array[], uint32_t size);
这几个函数如何调用,我计算出来的CRC校验码值都是0xFFFFFFFF

使用特权

评论回复
沙发
吴斌_天毅| | 2021-8-24 11:05 | 只看该作者
void crc_init(u8 type)                          //  CRC初始化
{
    ENABLE_CRC_CLOCK;                           //  开启CRC时钟
   
    switch(type)
    {
    case CRC8_SAE_J1850:
        CRC_IDATAR = 0xFF;
        CRC_POLYR  = 0x1D;
        CRC_CTLR   = 0x11;                      //  输出数据不翻转,输入数据不翻转, 8位, 复位
        return;
    case CRC16_SANKYO:
    default:
        CRC_IDATAR = 0x0000;
        CRC_POLYR  = 0x1021;
        CRC_CTLR   = 0x09;                      //  输出数据不翻转,输入数据不翻转, 16位, 复位
        return;
    }
}

使用特权

评论回复
板凳
吴斌_天毅| | 2021-8-24 11:06 | 只看该作者
u32 crc8_calculate(u8 type, u32 len, u8 *ptr)   //  按字节(8位输入)计算CRC
{
    u32 crc;
   
    crc_init(type);
   
    while(len != 0)
    {
        CRC_INPUT_DATA_8 = *ptr++;
        len--;
    }
   
    crc = CRC_DATAR;
    return crc;
}

使用特权

评论回复
地板
吴斌_天毅| | 2021-8-24 11:06 | 只看该作者
u32 crc16_calculate(u8 type, u32 len, u16 *ptr) //  按半字(16位输入)计算CRC
{
    u32 crc;
   
    crc_init(type);
   
    while(len != 0)
    {
        CRC_INPUT_DATA_16 = *ptr++;
        len--;
    }
   
    crc = CRC_DATAR;
    return crc;
}



u32 crc32_calculate(u8 type, u32 len, u32 *ptr) //  按字(32位输入)计算CRC
{
    u32 crc;
   
    crc_init(type);
   
    while(len != 0)
    {
        CRC_INPUT_DATA_32 = *ptr++;
        len--;
    }
   
    crc = CRC_DATAR;
    return crc;
}

使用特权

评论回复
5
吴斌_天毅| | 2021-8-24 11:08 | 只看该作者
    ptr = cPcIn;
    len = cPcIn[1];                             //  接收长度
    crc = crc8_calculate(CRC8_SAE_J1850, (len-1), ptr);
    crc ^= 0xFF;
   
    if(crc != cPcIn[len-1])                     //  最后一字节为收到的CRC值
    {
        return FALSE;
    }
   

使用特权

评论回复
6
吴斌_天毅| | 2021-8-24 11:12 | 只看该作者
#define CRC16_SANKYO                    0
#define CRC8_SAE_J1850                  1
#define CRC_INPUT_DATA_8                (*(vu8* )(&CRC_DATAR))
#define CRC_INPUT_DATA_16               (*(vu16*)(&CRC_DATAR))
#define CRC_INPUT_DATA_32               CRC_DATAR
#define CRC_OUTPUT_DATA_8               (*(vu8* )(&CRC_DATAR))
#define CRC_OUTPUT_DATA_16              (*(vu16*)(&CRC_DATAR))
#define CRC_OUTPUT_DATA_32              CRC_DATAR

使用特权

评论回复
7
吴斌_天毅| | 2021-8-24 13:41 | 只看该作者
//  AHB1: 0x4002 3000 - 0x4002 33FF:  CRC
#define CRC_DATAR                   (*(vu32 *)0x40023000)   //  数据寄存器
#define CRC_FDATAR                  (*(vu32 *)0x40023004)   //  独立数据寄存器
#define CRC_CTLR                    (*(vu32 *)0x40023008)   //  控制寄存器
//#define                           (*(vu32 *)0x4002300C)   //  保留
#define CRC_IDATAR                  (*(vu32 *)0x40023010)   //  初值寄存器
#define CRC_POLYR                   (*(vu32 *)0x40023014)   //  多项式寄存器

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2054

主题

7452

帖子

10

粉丝