STM32开发(17)----CubeMX配置CRC

news/2024/6/3 16:50:46 标签: stm32, 单片机, 嵌入式硬件

CubeMX配置CRC

  • 前言
  • 一、什么是CRC?
  • 二、实验过程
    • 1.STM32CubeMX配置
    • 2.代码实现
      • 重载printf
    • 3.实验结果
  • 总结


前言

本章介绍使用STM32CubeMX对CRC进行配置的方法,CRC的目的是保证数据的完整性,所有的STM32芯片都内置了一个硬件的CRC计算模块,可以很方便地应用到需要进行通信的程序中。

一、什么是CRC?

循环冗余校验(英语:Cyclic redundancy check,通称“CRC”)是一种根据网上数据包或计算机文件等数据产生简短固定位数校验码的一种散列函数,主要用来检测或校验数据传输或者保存后可能出现的错误。生成的数字在传输或者存储之前计算出来并且附加到数据后面,然后接收方进行检验确定数据是否发生变化。一般来说,循环冗余校验的值都是32位的整数。由于本函数易于用二进制的计算机硬件使用、容易进行数学分析并且尤其善于检测传输通道干扰引起的错误,因此获得广泛应用。

CRC的目的是保证数据的完整性,其方法是在发送数据的后面再增加多余的若干位数据,接收方使用同样的CRC计算方法,检查接收到的数据CRC是否为0:

如果为0,则表示数据是完整的,接收方可以开开心心的去处理这个数据。
如果不为0,则表示数据不完整/出错,接收方就需要处理下这个数据(一般是丢弃/要求重发)。
那么CRC的核心算法就是如何通过一堆“发送数据”,来计算“多余的若干数据”。

CRC采用的策略是用除法求余数,这就是CRC算法的本质。

不同于十进制的除法运算,CRC用的是二进制的除法运算,二进制的除法运算,属于模二运算,模二运算的特点是:没有进位。

模二加法:0+0=0 0+1=1 1+0=1 1+1=0

模二减法:0-0=0 0-1=1 1-0=1 1-1=0

模二乘法:0x0=0 0x1=0 1x0=0 1x1=1

模二除法:是模二乘法的逆运算,参见下图示例
在这里插入图片描述
这里我们先给一个例子,我们来计算0x1C的CRC8的校验结果
在这里插入图片描述
所有的STM32芯片都内置了一个硬件的CRC计算模块,可以很方便地应用到需要进行通信的程序中,这个CRC计算模块使用常见在以太网中

二、实验过程

1.STM32CubeMX配置

选择芯片stm32f103c6t6,新建工程

在这里插入图片描述

设置时钟源,最小系统外部晶振8Mhz,作为外部高速HSE时钟源。由于没有外接外部低速晶振,这里低速时钟源选择旁路时钟源。

在这里插入图片描述

配置时钟树,这里使用官方推荐的配置

在这里插入图片描述
在这里插入图片描述
USART1的参数配置如下,波特率115200,传输数据长度为8 Bit,奇偶检验无,停止位1.其他参数默认
在这里插入图片描述

使能USART1中断
在这里插入图片描述

SYS选项卡中Debug选项选择串口(这个选项可以设置,不会有影响)
在这里插入图片描述
CRC配置
在这里插入图片描述

Code Generator中设置只拷贝使用到的库,分离.c和.h文件

在这里插入图片描述

设置好项目名称和路径,点击GENERATE CODE即可,生成后使用keil5 IDE打开。

在这里插入图片描述

2.代码实现

重载printf

C语言中的标准库中所用的标准输入输出函数,默认的输出设备是显示器,要实现串口或LCD的输出,必须重新定义标准库函数里与输出函数相关的函数。例如:printf输出到串口,需要将fputc里面的输出指向串口(重定向),方法如下:只要自己添加一个int fputc(int ch, FILE *f)函数,能够输出字符就可以了。

在usart.c文件后面添加如下代码,代码中添加了#ifdef宏定义进行条件编译,如果使用GUNC编译,则PUTCHAR_PROTOTYPE 定义为int __io_putchar(int ch)函数,否则定义为int fputc(int ch, FILE *f)函数。

/* USER CODE BEGIN 0 */
#include "stdio.h"
#ifdef __GNUC__
  /* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printf
     set to 'Yes') calls __io_putchar() */
  #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
  #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif /* __GNUC__ */
/**
  * @brief  Retargets the C library printf function to the USART.
  * @param  None
  * @retval None
  */
PUTCHAR_PROTOTYPE
{
  /* Place your implementation of fputc here */
  /* e.g. write a character to the EVAL_COM1 and Loop until the end of transmission */
  HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF);
 
  return ch;
}
/* USER CODE END 0 */
int main(void)
{
  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_CRC_Init();
  MX_USART1_UART_Init();
  /* USER CODE BEGIN 2 */

  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
		
    /* USER CODE BEGIN 3 */
	  uint32_t  CRCValue = HAL_CRC_Calculate(&hcrc, (uint32_t *)dataBuffer, BUFFER_SIZE);
    printf("\r\nCRC value:0x%X\n", CRCValue);
    if(CRCValue != uwExpectedCRCValue)
    {
      printf("\n\r CRC wrong\n\r");
    }
    else
    {
      printf("\n\r CRC right\n\r");
    }
    HAL_Delay(1000);
  }
  
  /* USER CODE END 3 */
}

3.实验结果

在这里插入图片描述

总结

本章介绍了CRC的基本使用,STM32硬件集成CRC模块,可以方便的完成CRC计算。


http://www.niftyadmin.cn/n/111327.html

相关文章

【Linux】gcc/g++/gdb的使用

🔥🔥 欢迎来到小林的博客!!       🛰️博客主页:✈️小林爱敲代码       🛰️社区 : 进步学堂       🛰️欢迎关注:👍点赞🙌收…

Netty之io.netty.util.concurrent.Promise与io.netty.util.concurrent.Future初解

目录 目标 Netty版本 Netty官方API 三者之间的关系 基本使用方法 java.util.concurrent.Future io.netty.util.concurrent.Future io.netty.util.concurrent.Promise 目标 了解io.netty.util.concurrent.Promise与io.netty.util.concurrent.Future的基本使用方法。了解…

低代码如何推动自动化未来

一项全球研究表明,企业平均每个月有60个小时的工作是手动完成的,也就是每个员工每天花3个小时完成文件归档、数据输入和报告整合,而这些工作都是可以通过自动化的方式完成的。 组织实现数字化转型的关键环节就是自动化。通过自动化&#xff…

spring spring-boot @valid @NotNull @NotEmpty 基本校验使用以及 全局异常优化集成

valid NotNull NotEmpty 一套标准的基础校验&#xff0c;可以将校验注解和附带错误信息添加到请求入参上即可完成校验&#xff0c;可以去除简单的校验代码&#xff0c;节省一定的时间和代码量 Maven 依赖 spring-boot <dependency><groupId>org.springframewor…

chatgpt到底颠覆了什么 第二部分

以第二个理由就是两个字&#xff0c;垄断。 现在谈到范式转变&#xff0c;如果首先谈的还是算法&#xff0c;那说明还没有透彻理解范式改变范式改变&#xff0c;首先要改的是什么。是什么&#xff1f;是参赛资格。 过去我相信大企业大团队聚拢了许多聪明的脑袋&#xff0c;但我…

狄克斯特拉--最短路径问题

Dijkstra’s algorithm最短路径问题算法思路代码实现最短路径问题 如下图所示&#xff0c;求解从起点到终点的最短路径。 #mermaid-svg-26k5ICvfEHYoNbf5 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-26k5ICvfEH…

LQB训练手打代码,以及演示效果01:控制LED,

任务&#xff1a; 1、控制LED&#xff0c;手打代码&#xff0c; 2、单片机上电&#xff0c;关闭所有外设LED&#xff0c;蜂鸣器&#xff0c;继电器&#xff0c;数码管&#xff1b; 3、然后LED全部一起闪烁8次&#xff0c;间隔300ms; 4&#xff0c;然后在while1里面&#xff0c…

基于java+swing+mysql员工工资管理系统

基于javaswingmysql员工工资管理系统一、系统介绍二、功能展示1.用户登陆2.员工主要功能3.管理员主要功能三、系统实现1.StudentFrame .java四、其它1.其他系统实现2.获取源码一、系统介绍 该项目功能相对完善&#xff0c;有管理员和普通用户两个角色&#xff0c;分别实现了一…