STM32CRC校验入门介绍+固件库函数

    今天刚看了一点CRC校验的内容,在这里记录一下STM32F103C8T6关于CRC校验的内容,仅作入门了解。

    CRC校验通俗的来说其实就是一种验证数据的算法,跟串口通讯的奇偶校验本质上其实没有什么区别,就是复杂了一些。简单来说,就是通过你想要发送的数据,使用CRC校验算法,生成一个32位的数据,等你的数据被接收方接收到以后,接收方也使用这个CRC校验算法,将接收来的数据算一下,生成一个32位的数,拿你发送时算出来的结果,和接收后算出来的结果一比对,如果一样,那说明数据传输没问题,如果不一样,那说明数据有地方传错了。

    看一下手册:

第一条就说的是用的算法是啥,这个不用管。

第二条说的32位寄存器就是用来数据输入和读取CRC校验结果的,当你需要计算一些数据的CRC校验结果时,你只需要将数据32位、32位的传入到这个寄存器中,传完后就计算好了,需要这个结果的时候再读这个寄存器,读出来的32数就是算出来的CRC校验结果。需要注意的是,输入数据和读取结果,都用的是一个寄存器。

第三条就是计算时间。

第四条是CRC的另一个寄存器,通用的8位寄存器,这个寄存器可以用来存放一些临时数据,后面介绍有函数可以操作读写。

    上图是手册里的CRC 计算单元框图,总的流程就是数据通过AHB总线传输到数据寄存器,然后通过CEC计算得出结果,读结果的时候再通过AHB总线将结果发出去,需要注意的是,这个图中的数据寄存器(输入)和数据寄存器(输出),其实指的是同一个寄存器。

    功能描述可以看一下,需要注意的内容是,每次使用CRC校验时,需要先将这个数据寄存器进行清空,不然会影响到结果,然后如果输入的数据不足32位的话,会自动补齐到32位,最后说的那个CRC_CR指的是CRC中的控制寄存器,CRC一共有三个寄存器,前面说了两个,这是第三个,这个控制寄存器中只有1位有用,可以用来重置输入输出的32位数据寄存器。

    然后看一下相关库函数。

    下图是stm32f10x_crc.h中声明的库函数。

大概看一下:

①void CRC_ResetDR(void);

这个函数就是用来复位CRC的输入输出数据寄存器的,每次使用前要调用这个函数。

②uint32_t CRC_CalcCRC(uint32_t Data);

这个函数用来给输入输出的32位寄存器输入需要计算的值。如果数据比较长,那就一次输入32位,然后再最后一次输入后,读取这个函数的返回值,即CRC结果。

③uint32_t CRC_CalcBlockCRC(uint32_t pBuffer[], uint32_t BufferLength);

这个函数也是给输入输出的数据寄存器传数据的,返回的也是CRC校验结构。与上一个函数不同的是,这个函数可以传输数组,可以定义一个u32的数组,将数组当参数传给这个函数,函数的第二个参数是数据的长度。

④uint32_t CRC_GetCRC(void);

这个就是获取CRC结果的函数,不需要传数据。

⑤void CRC_SetIDRegister(uint8_t IDValue);

这个函数用来给通用8位寄存器写数据。

⑥uint8_t CRC_GetIDRegister(void);

这个函数用来读取通用8位寄存器的结果。

    总结:上面就是所以的函数了,在使用CRC校验时,先调用CRC_ResetDR函数,对CRC数据寄存器进行复位,再使用CalcCRC给数据寄存器传入数据,传入最后一个数据时读取寄存器数据,就可得到CRC校验结果。

作者:东拼西凑.

物联沃分享整理
物联沃-IOTWORD物联网 » STM32CRC校验入门介绍+固件库函数

发表回复