查看: 1338|回复: 0
收起左侧

第十七章:CH32V103应用教程——CRC

[复制链接]

  离线 

  • TA的每日心情
    慵懒
    2021-7-23 17:16
  • 签到天数: 17 天

    [LV.4]

    发表于 2021-4-23 13:09:52 | 显示全部楼层 |阅读模式

    有人预言,RISC-V或将是继Intel和Arm之后的第三大主流处理器体系。欢迎访问全球首家只专注于RISC-V单片机行业应用的中文网站

    您需要 登录 才可以下载或查看,没有帐号?立即注册

    x
    本帖最后由 草帽王子 于 2021-9-10 16:59 编辑

    本章教程通过CH32V103 CRC计算单元对数据进行计算并验证其准确性。


    1、CRC简介及相关函数介绍

    循环冗余校验(CRC)计算单元是根据固定的生成多项式得到任一32位数据的CRC计算结果。一般用于数据存储和数据通讯领域用来核实数据的正确性。系统提供硬件CRC计算单元可以大大节省CPU和RAM资源提高效率。

    CRC 单元复位
    如果要开始一次新数据组的CRC 计算,需要复位CRC计算单元。向控制寄存器CRC_CTLR的RST位写1,硬件将复位数据寄存器,恢复初始值 0xFFFFFFFF。

    CRC计算
    CRC单元的计算是前一次CRC计算结果和新参与的数据的CRC结果。CRC_DATAR数据寄存器,对其执行写操作将送入新数据到硬件计算单元;执行读取操作,将得到最新一轮的 CRC 计算值。硬件计算时会中断系统的写操作,因此可以连续写入新的值。

    注:CRC单元是对整个32位数据进行计算,而不是逐字节计算。

    独立数据缓冲区
    CRC单元提供了一个8位独立数据寄存器CRC_IDATAR,用于应用代码临时存放1字节的数据,不受CRC单元复位影响。

    关于CH32V103 CRC具体信息,可参考CH32V103应用手册。CH32V103 CRC标准库函数具体内容如下:

    1. void CRC_ResetDR(void);
    2. uint32_t CRC_CalcCRC(uint32_t Data);
    3. uint32_t CRC_CalcBlockCRC(uint32_t pBuffer[], uint32_t BufferLength);
    4. uint32_t CRC_GetCRC(void);
    5. void CRC_SetIDRegister(uint8_t IDValue);
    6. uint8_t CRC_GetIDRegister(void);
    复制代码

    1.1、void CRC_ResetDR(void)
    功  能:重置CRC数据寄存器(DR)。
    输  入:无

    1.2、uint32_t CRC_CalcCRC(uint32_t Data)
    功  能:计算给定数据字(32位)的32位CRC。
    输  入:Data:位(32位)计算CRC数据。

    1.3、uint32_t CRC_CalcBlockCRC(uint32_t pBuffer[], uint32_t BufferLength)
    功  能:计算数据字(32位)的给定缓冲区的32位CRC。
    输  入:pBuffer:指向包含要计算的数据的缓冲区的指针。BufferLength:要计算的缓冲区长度。

    1.4、uint32_t CRC_GetCRC(void)
    功  能:返回当前的CRC值。
    输  入:无

    1.5、void CRC_SetIDRegister(uint8_t IDValue)
    功  能:在独立数据(ID)寄存器中存储8位数据。
    输  入:IDValue:要存储在ID寄存器中的8位值。

    1.6、uint8_t CRC_GetIDRegister(void)
    功  能:返回存储在独立数据(ID)寄存器中的8位数据。
    输  入:无

    以上函数在编写程序使用时直接调用即可。


    2、硬件设计

    本章教程为CRC计算,使用CH32V103内部资源,无需进行硬件连接。  


    3、软件设计

    本章教程主要用于测试CH32V103 CRC计算,其程序相对较为简单,只需在主函数中设置一组数组并调用函数对其进行计算即可。其具体程序如下:

    main.c文件
    1. #include "debug.h"

    2. /* Global define */
    3. #define Buf_Size 32

    4. /* Global Variable */
    5. u32  SRC_BUF[Buf_Size]={
    6.                         0x01020304,0x05060708,0x090A0B0C,0x0D0E0F10,
    7.                         0x11121314,0x15161718,0x191A1B1C,0x1D1E1F20,
    8.                         0x21222324,0x25262728,0x292A2B2C,0x2D2E2F30,
    9.                         0x31323334,0x35363738,0x393A3B3C,0x3D3E3F40,
    10.                         0x41424344,0x45464748,0x494A4B4C,0x4D4E4F50,
    11.                         0x51525354,0x55565758,0x595A5B5C,0x5D5E5F60,
    12.                         0x61626364,0x65666768,0x696A6B6C,0x6D6E6F70,
    13.                         0x71727374,0x75767778,0x797A7B7C,0x7D7E7F80
    14.                        };

    15. u32 CRCValue = 0;
    16. /*******************************************************************************
    17. * Function Name  : main
    18. * Description    : Main program.
    19. * Input          : None
    20. * Return         : None
    21. *******************************************************************************/
    22. int main(void)
    23. {
    24.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
    25.         Delay_Init();
    26.         USART_Printf_Init(115200);
    27.         printf("SystemClk:%d\r\n",SystemCoreClock);
    28.         printf("CRC TEST\r\n");

    29.         RCC_AHBPeriphClockCmd(RCC_AHBPeriph_CRC, ENABLE);
    30.         CRCValue = CRC_CalcBlockCRC((u32 *)SRC_BUF, Buf_Size); //CRC计算结果,计算数据字(32位)的给定缓冲区的32位CRC。
    31.         printf("CRCValue: 0x%08x\r\n",CRCValue); /*CRCValue should be 0x199AC3CA in this example*/

    32.         while(1);
    33. }
    复制代码
    main.c函数主要包括相关函数初始化以及CRC计算和结果输出。


    4、下载验证

    将编译好的程序下载到开发板并复位,串口打印情况具体如下:

    CH32V CH573单片机芯片-第十七章:CH32V103应用教程——CRCrisc-v单片机中文社区(1)
    CRC.rar附件下载
    CH32V CH573单片机芯片-第十七章:CH32V103应用教程——CRCrisc-v单片机中文社区(2) 16、CRC.rar (457.51 KB, 下载次数: 10)
    链接:https://pan.baidu.com/s/171bBv3XFrO2h31Y7BO3xzw
    提取码:ek46
    复制这段内容后打开百度网盘手机App,操作更方便哦





    上一篇:第十六章:CH32V103应用教程——BKP
    下一篇:第十八章:CH32V103应用教程——RCC
    RISCV作者优文
    全球首家只专注于RISC-V单片机行业应用的中文网站
    回复

    使用道具 举报

    高级模式
    B Color Image Link Quote Code Smilies

    本版积分规则

    关闭

    RISC-V单片机中文网上一条 /2 下一条



    版权及免责声明|RISC-V单片机中文网 |网站地图

    GMT+8, 2024-3-29 00:03 , Processed in 0.693832 second(s), 48 queries .

    快速回复 返回顶部 返回列表