【工具使用】STM32CubeMX-CRC配置

news2024/10/1 23:39:59

一、概述

    无论是新手还是大佬,基于STM32单片机的开发,使用STM32CubeMX都是可以极大提升开发效率的,并且其界面化的开发,也大大降低了新手对STM32单片机的开发门槛。
    本文主要讲述STM32芯片的CRC外设配置及CRC校验的一些基础知识。CRC也有一些软件算法的实现,但现在大部分芯片都内置了硬件算法,不用白不用,而且最近因为校验了几百k的文件,发现用软件校验速度是个瓶颈,所以还是试一下硬件CRC的速度(手册里写了只要4个指令周期就可以计算一次CRC)。

二、软件说明

    STM32CubeMX是ST官方出的一款针对ST的MCU/MPU跨平台的图形化工具,支持在Linux、MacOS、Window系统下开发,其对接的底层接口是HAL库,另外习惯于寄存器开发的同学们,也可以使用LL库。STM32CubeMX除了集成MCU/MPU的硬件抽象层,另外还集成了像RTOS,文件系统,USB,网络,显示,嵌入式AI等中间件,这样开发者就能够很轻松的完成MCU/MPU的底层驱动的配置,留出更多精力开发上层功能逻辑,能够更进一步提高了嵌入式开发效率。
    演示版本 6.7.0

三、CRC简介

    循环冗余校验(Cyclic Redundancy Check, CRC)是一种根据网络数据包或计算机文件等数据产生简短固定位数校验码的一种信道编码技术,主要用来检测或校验数据传输或者保存后可能出现的错误。它是利用除法及余数的原理来作错误侦测的。

  • CRC相关参数

在这里插入图片描述

数据位宽:如CRC-8、CRC-16、CRC-32,后面的数字表示的是CRC的数据位宽,目前Modbus/RTU使用的是CRC-16。
初始值:用于计算的CRC初始值,因为CRC是循环计算的,所以可以分段计算,只要把初值设置成上一次计算的CRC输出结果即可。
多项式:正序的多项式,省略最高位1,即数据高位在左,低位在右时为正序。如Modbus的正序模型 x16+x15+x2+1(1x16+1x15+0x14+0x13+0x12+0x11+0x10+0x9+0x8+0x7+0x6+0x5+0x4+0x3+1x2+0x1+1x0),二进制为1 1000 0000 0000 0101,省略最高位1,转换为十六进制为0x8005。
逆多项式:倒序的多项式,即数据高位在右,低位在左为倒序。0x8005的逆多项式即为0xA001。
输出异或值:用于在输出CRC结果之前进行异或计算的值。

  • CRC计算步骤(以Modbus/RTU的CRC计算为例)
  1. 预置16位寄存器为十六进制0xFFFF(即全为 1),称此寄存器为CRC寄存器;
  2. 把第一个8位数据与16位CRC寄存器的低位相异或,把结果放于CRC寄存器;
  3. 检测相异或后的CRC寄存器的最低位,若最低位为1,CRC寄存器先右移1位,再与多项式A001H进行异或;若为0,则CRC寄存器右移1位,无需与多项式进行异或。
  4. 重复步骤3,直到右移8次,这样整个8位数据全部进行了处理;
  5. 重复步骤2到步骤4,进行下一个8位数据的处理,直到需要处理的字节数据都处理完;
  6. 最后得到的CRC寄存器即为CRC-16校验码。

四、功能配置

    首先我们要先明确好学习CRC配置的目标——实现一个Modbus/RTU的CRC校验接口函数,刚好前面写了那么多Modbus的文章,这里就来实践一下,Modbus/RTU中使用的正是CRC校验。先贴上现在使用的CRC校验算法源码。

/* CRC校验函数,返回值是CRC校验值 */
uint16_t MBCrcCalc(const uint8_t *data,  /* 需要校验的数据 */
					uint16_t length)     /* 校验数据的长度 */
{
    uint8_t i;
    uint16_t crc_value = 0xFFFF;
    
    while (length --)
    {
        crc_value ^= (uint16_t)*(Data ++);
        for (i = 7; i >= 0; i --)
        {
        	crc_value = (crc_value & 0x0001) ?  ((crc_value >> 1)^0xa001) : (crc_value >> 1);
        }
    }
    
    return crc_value;
}

    首先使能激活CRC功能,看相关配置里可以配置数据位宽、初始值、多项式等这些信息的,那就根据Modbus的标准进行配置。
在这里插入图片描述

在这里插入图片描述

    根据上文CRC的基本参数原理,我们这里对Modbus-CRC进行如下设置,下面是LL库的代码实现。

/* CRC校验函数,返回值是CRC校验值 */
uint16_t MBCrcCalc(const uint8_t *data,  /* 需要校验的数据 */
					uint16_t length)     /* 校验数据的长度 */
{
    /* 计算前复位一下--这个操作会清除内部存储的数据,如果需要分段计算,建议另开一个接口 */
    LL_CRC_ResetCRCCalculationUnit(CRC);
    
    /* 设置输出CRC位数--Modbus用的是CRC-16 */
    //LL_CRC_SetPolynomialSize(CRC, LL_CRC_POLYLENGTH_16B);

    /* 设置输入数据反向模式--输入按字节反向 */
    //LL_CRC_SetInputDataReverseMode(CRC, LL_CRC_INDATA_REVERSE_BYTE);

    /* 设置输出反向 */
    //LL_CRC_SetOutputDataReverseMode(CRC, LL_CRC_OUTDATA_REVERSE_BIT);

    /* 设置计算多项式--使用0x8005 */
    //LL_CRC_SetPolynomialCoef(CRC, 0x8005);

    /* 设置CRC初始值 */
    LL_CRC_SetInitialData(CRC, (uint32_t)0xFFFF);
    
    /* 循环写入计算数据--按单个字节写入 */
    while(length--)
    {
        LL_CRC_FeedData8(CRC, *Data++);
    }

	/* 获取CRC计算结果--按半字取出 */
    return LL_CRC_ReadData16(CRC);
}

    查看LL库的接口,可使用的基本就以下几个接口。

LL_CRC_ResetCRCCalculationUnit	/* 重置计算 */
LL_CRC_SetPolynomialSize/LL_CRC_GetPolynomialSize	/* 设置/获取输出CRC的数据位宽 */
LL_CRC_SetInputDataReverseMode/LL_CRC_GetInputDataReverseMode	/* 设置/获取输入数据反向模式 */
LL_CRC_SetOutputDataReverseMode/LL_CRC_GetOutputDataReverseMode	/* 设置/获取输出数据反向模式 */
LL_CRC_SetInitialData/LL_CRC_GetInitialData	/* 设置/获取CRC计算初值 */
LL_CRC_SetPolynomialCoef/LL_CRC_GetPolynomialCoef	/* 设置/获取多项式 */
LL_CRC_FeedData32/LL_CRC_FeedData16/LL_CRC_FeedData8/LL_CRC_ReadData32/LL_CRC_ReadData16/LL_CRC_ReadData8/LL_CRC_ReadData7	/* 写入计算数据/获取CRC结果 */
LL_CRC_Read_IDR/LL_CRC_Write_IDR	/* 读取/写入通用寄存器(不知道有什么用) */
LL_CRC_DeInit    /* 重置初始化 */

五、注意事项

1、国标Modbus的CRC正序多项式为0x8005,倒序多项式为0xA001。如果协议里数据是高位在左低位在右,则按正序多项式设置即可。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/397903.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【018】筛选数据(模糊筛选)_#VBA

模糊筛选1. 原因2. 参考3. VBA指令3.1 将 * 添加在 C 的两侧即可筛选所有包含 C 的值3.2 将 * 添加在 C 的前面即可筛选所有最后一个字符包含 C 的值3.3 将 * 添加在 C 的后面即可筛选所有第一个字符包含 C 的值1. 原因 此前写筛选方式,都是高级筛选或者按条件筛选…

可移植操作系统接口--POSIX

什么是POSIX POSIX(Portable Operating System Interface,可移植操作系统接口)是一个标准,它定义了操作系统接口的一系列规范。POSIX标准最初由IEEE制定,现在由Open Group维护。 POSIX标准的主要目的是为了保证不同操…

python带你成功复刻热门手机游戏——飞翔的小鸟

前言 大家早好、午好、晚好吖 ❤ ~欢迎光临本文章 飞翔的小鸟(游戏英文名:Flappy Bird) 一款由越南独立开发者开发的手机游戏,是之前非常流行的一款手机游戏 小游戏目标:让小鸟穿过管子,不要碰到任何物体…

大数据是什么?发展前景怎么样

关于大数据的解释,比较官方的定义是指无法在一定时间范围内用常规软件工具进行捕捉、管理和处理的数据集合,是需要新处理模式才能具有更强的决策力、洞察发现力和流程优化能力的海量、高增长率和多样化的信息资产。简单来说,大数据就是结构化…

CAD崩溃后自动保存的文件在哪里?

CAD崩溃后自动保存的文件在哪里?相信这个问题很多设计师小伙伴在CAD绘图过程中都曾遇到过,这也是CAD常见问题之一。本节内容小编就以浩辰CAD软件为例来给大家介绍一下软件崩溃后CAD自动保存的文件在哪里以及打开方式。 CAD崩溃后自动保存文件位置&#…

GWAS全基因组关联分析工具GAPIT最新版的安装教程与报错解决方案

GWAS工具GAPIT最新版 本篇笔记主要内容是GWAS分析软件GAPIT最新版的安装和使用教程,包括常见的报错以及解决方案,主要出错位置在LDheatmap、stringi、nloptr、lme4等,测试安装的环境是东方天意的ECS云服务器(Linux centos7&#x…

七、延时队列

1、延时队列的概念 队列内部是有序的,最重要的特性就体现在它的延时属性上,延时队列中的元素希望在指定时间到了以后被取出处理 延时队列就是用来存放需要在指定时间被处理的元素的队列 2、延时队列使用的场景 订单在十分钟之内未支付则自动取消 …

SAP Cloud Platform会抛弃ABAP吗

很早之前自己写的文章,重新发布一下。 别担心,该来的总会来,该走的也留不住! - 剧情概要 - SAP Cloud Platform发布已经有一段时间了,自SAP云平台发布以来,很多人担心的一个问题是:在SAP云平…

【测试】HD-G2L-IO评估板测试结果表

1. 测试对象HD-G2L-IOT基于HD-G2L-CORE V2.0工业级核心板设计,双路千兆网口、双路CAN-bus、2路RS-232、2路RS-485、DSI、LCD、4G/5G、WiFi、CSI摄像头接口等,接口丰富,适用于工业现场应用需求,亦方便用户评估核心板及CPU的性能。H…

数据分析师常见问题(1)

1).sql三种排序的区别 2).几种连接方式 3).union和union all的区别 4) .drop和delete的区别 5).有关机器学习random forest 和xgboost的区别 6) .SVM原理 SVM是在特征空间上找到最佳的分离超平面,使得训练集上的正负样…

Win10使用ssh root用户登录centos7主机

1 、用SSH root用户登录Centos主机; 2 、检查centos是否装了epel库 执行命令 rpm -qa|grep epel 没有,需要安装 yum install epel-release 3 、安装xrdp yum install xrdp 4 、安装tigervnc-server yum install tigervnc-server 5 、为用户root…

如何通过SWTO分析法,加强项目风险管理?

1、什么是SWTO分析法 SWTO分析法是态势分析法,是根据企业自身的既定内在条件,对其优势、劣势、外部机会和危险进行分析,依照矩阵形式排列,将各种因素相互匹配分析的企业战略分析方法。 通过SWTO分析法 加强项目风险管理​ …

数学小课堂:数学和哲学的互动关系(自洽的哲学思想受益于数学思维)

文章目录 引言I 数学是“有底”的学问(止于公理)II 数学对哲学的影响2.1 哲学思想受益于数学思维2.2 笛卡尔的贡献2.3 莱布尼茨的哲学思想III 哲学对数学的影响引言 数学和科学各个分支之间在方法上却具有相通性和普适性,这些通用的方法常常让很多学科同时受益,依靠数学逻…

Maven 创建项目

在我们 maven 项目中的结构为 src/main/java —— 存放项目的.java 文件 src/main/resources —— 存放项目资源文件,如 spring, hibernate 配置文件 src/test/java —— 存放所有单元测试ava 文件,如 JUnit 测试类 src/test/resources —— 测试资源文件…

跑步用入耳的好还是挂耳的、最好用的运动耳机分享

健身房经常会播放一些节奏较快的歌曲,这样能够激发大家在运动过程中的动力,所以运动时聆听音乐确实比较有效果,居家运动、室外跑步时选择运动耳机就变成了刚需,不过一款适合自己的运动耳机确实是比较难找的,首先不能影…

算法刷题总结 (四) 动态规划

算法总结4 动态规划一、动态规划1.1、基础问题11.1.1、509. 斐波那契数列1.1.2、70. 爬楼梯1.1.3、746. 使用最小花费爬楼梯1.2、基础问题21.2.1、62. 不同路径1.2.2、63. 不同路径Ⅱ1.2.3、343. 整数拆分1.2.4、96. 不同的二叉搜索树1.3、背包问题1.3.1、01背包1.3.1.1、单次选…

现代卷积神经网络之稠密连接网络(DenseNet),并对CFIAR10训练

专栏:神经网络复现目录 本章介绍的是现代神经网络的结构和复现,包括深度卷积神经网络(AlexNet),VGG,NiN,GoogleNet,残差网络(ResNet),稠密连接网络…

pikachu靶场CSRF之TOKEN绕过

简介 Pikachu靶场中的CSRF漏洞环节里面有一关CSRF TOKEN,这个关卡和其余关卡稍微有点不一样,因为表单里面存在一个刷新就会变化的token,那么这个token是否能绕过呢?接下来我们来仔细分析分析 实战过程 简单尝试 先利用任意一个…

CNCF x Alibaba云原生技术公开课 第三章 kubernetes核心概念

1、Kubernetes概念 核心功能 服务的发现与负载的均衡容器的自动装箱,我们也会把它叫做 scheduling,就是“调度”,把一个容器放到一个集群的某一个机器上Kubernetes 会帮助我们去做存储的编排,让存储的声明周期与容器的生命周期能…

SpringCloud-高级篇(一)

目录: (1)初识Sentinel-雪崩问题的解决方案 (2)服务保护Sentinel和Hystrix对比 (3)Sentinel初始-安转控制台 (4)整合微服务和Sentinel 微服务高级篇 (1&…