世界热门:单片机Flash自检和添加CRC常见方法
2023-05-19 11:14:09 来源:strongerHuang
市面上很多基于单片机的产品都具有在线或离线升级功能,为了防止升级过程出现意外,一般我们都会对Flash程序数据进行校验,常见的就是添加 CRC 校验信息。
本文给大家讲述一下Keil和IAR中计算CRC值的方法。
Flash自检的流程
(资料图片)
Flash的自检一般分为启动时自检和程序运行时自检两个阶段。不管是哪种自检,其思路都是:
在程序编译完成后,计算整个程序的CRC值,然后将这个CRC值添加到可执行文件末尾,再将带有CRC校验值的可执行文件烧录到MCU中。程序启动后,由程序中的自检代码重新根据当前Flash内容(不包括预存的CRC校验值)计算一次CRC值,再与之前预先计算并烧录到Flash中的CRC校验值进行比较,如果一致就通过检测。
这两个自检阶段的区别就是:
程序启动自检是一次性对整个实际Flash代码范围计算出最终的CRC值;而运行时的自检,为了不影响其他程序模块的运行,计算CRC的过程是分步进行的,每次计算一部分,分多次计算出最终的CRC值。围绕Flash的自检所发生的问题可以归为两大类,一类是预先计算CRC值时和上电后计算CRC值的Flash范围设置是否一致;第二类就是预先计算CRC时和上电后计算CRC采用的CRC算法是否一致。
如何添加CRC值
下面我们主要介绍如何添加CRC校验值到可执行文件。
1、基于IAR环境
如果你使用IAR,那么添加CRC值的配置相对比较简单。通过配置IAR的CRC计算参数,自动对整个FLASH空间进行CRC计算,并将计算结果放到FLASH的末尾。
1. 修改Link文件,指定CRC值的存放位置
在Link文件中增加下面语句,指定checksum在FLASH中的存储位置。(可点击图片放大查看)
该语句指定将CRC的值放在FLASH的末尾位置,是整个FLASH空间的末尾,不是应用程序的代码末尾。这样,CRC值的位置就是固定的。不会随代码大小而变化。
在自检代码中,可以通过__checksum读取Flash中保存的CRC校验值来与重新计算的CRC值进行比较。
2. 配置Checksum页面的参数
在link文件中指定了checksum的存储位置后,还要在工程配置菜单中,配置计算CRC值的范围和参数。见下图(可点击图片放大查看):
IAR的checksum页面分为两个部分。
第一部分,也就是红线圈出的部分。定义了FLASH中需要计算CRC的范围和空闲字节填充值。这里注意要留出flash末尾存储CRC值的位置。
剩下的部分,就是对checksum计算参数的设定部分。
Checksum size:选择checksum的大小(字节数)
Alignment:指定checksum的对齐方式。一般,处理器不支持非对齐访问时有用,不填的话默认1字节对齐。
Algorithm:选择checksum的算法
Complement:是否需要进行补码计算。选择“As is”就是不进行补码计算。
Bit order:位输出的顺序。MSB first,每个字节的高位在前。LSB first,每个字节的低位在前。
Reverse byteorder within word:对于输入数据,在一个字内反转各个字节的顺序。
Initial value:checksum计算的初始化值
Checksum unit size:选择进行迭代的单元大小,按8-bit,16-bit还是32-bit进行迭代。
3. STM32CRC外设的配置
与上图IARchecksum的配置对应,STM32 CRC外设可以按以下配置:
聚= 0x4C11DB7(CRC32)
Initial_Crc = 0Xffffffff
输入/输出数据不反转
输入数据:根据实际Flash范围设定,留出CRC校验值的位置
CRC外设初始化及计算代码(可点击图片放大查看):
2、基于Keil环境
KEIL没有提供直接生成CRC值的功能,所以需要借助外部的工具计算CRC值,然后添加到可执行文件的末尾。 在X-CUBE-CLASSB软件中提供了bat文件,它会利用外部工具Srecord来生成整个Flash的CRC校验码并放在文件末尾。 这个工具同样也可以和标准外设库的ClassB库一起用。 下面我们就来看看如何在KEIL工程中利用Srecord工具来添加CRC值。
1. 安装Srecord工具
下载Srecord 工具(http://srecord.sourceforge.net )。 将srec_cat.exe,srec_cmp.exe,srec_info.exe拷贝到C:\SREC(自己新建)目录下。
2. 添加crc_gen_keil.bat及crc_load.ini文件到KEIL工程同级目录下
打开X-CUBE-CLASSB软件包中的任意KEIL工程目录,将其中crc_gen_keil.bat及crc_load.ini文件拷贝到自己的KEIL工程目录下。
crc_gen_keil.bat:利用外部工具Srecord来生成整个Flash的CRC校验码并放在文件末尾。
crc_load.ini:这个文件调试时有用,用来配置调试时导入带CRC校验码的HEX,避免对FLASH检测失败导致程序无法正常运行。
这两个文件中的内容也需要根据新工程路径进行修改:
将crc_gen_keil.bat中的TARGET_NAME和TARGET_PATH改成跟新工程一致。 否则不能成功的自动生成带CRC校验值的HEX文件。
Crc_load.ini文件中的路径和文件也要和实际的一致
3. 添加定义CRC校验码存储区域
(可点击图片放大查看)
在分散加载文件中将CHECKSUM指定在代码的末尾。和IAR不同的是,通过在分散加载文件中+last指定checksum的位置,它不是将其固定放在整个flash地址的末尾,而是放在实际代码的末尾。
(可点击图片放大查看)
4. 添加外部命令让KEIL在编译结束后,自动生成一个带CRC校验值的HEX文件
定义debug和flash download使用的HEX文件路径,使用带CRC校验值的HEX文件。
5. STM32CRC外设的配置
这里需要注意,从X-CUBE-CLASSB的软件包里拷贝出的crc_gen_keil.bat文件,里面的BYTE_SWAP设为1,也就是它在计算CRC值的时候,输入的数据,在一个字内按字节颠倒顺序。
所以直接用HAL_CRC_Calculate函数进行计算结果是不对的。可以参考下面的代码来初始化及进行计算:
(可点击图片放大查看)
或者,将crc_gen_keil.bat文件,里面的BYTE_SWAP改为0, 就可以直接调用HAL_CRC_Calculate函数进行计算了。
总结
本文介绍了基于IAR及ARMKEIL中如何添加CRC校验值的过程。在X-CUBE-CLASSB软件包中,也都可以找到对应的例程。如果在调试中,遇到FLASH CRC校验出错,也不用急。
可以从计算CRC值的范围设置是否一致和采用的CRC算法是否一致这两个方面去找原因。一定要调试看看代码实际执行的情况,比如要测试的地址范围和实际代码执行时计算的地址范围是否一样,防止因为coding错误造成检测不通过。审核编辑:汤梓红
关键词:
为你推荐
-
世界热门:单片机Flash自检和添加CRC常见方法
-
2022年中级经济师补考证书领取时间|全球新消息
-
建设银行暂停非柜面交易多久解除|全球观焦点
-
2023江苏连云港市递补考生参加连云港市连云区教育局所属学校招聘高层次人才体检通知-当前通讯
-
世界观天下!洛阳在全省率先完成2023年企业薪酬调查任务
-
全球关注:耶伦与银行业高管举行会议,警告:美债危机对美国金融体系将是灾难性的
-
南京市雨花台区邀政协委员为“数字城”建设建言献策
-
禾雀花的养殖方法 禾雀花的养殖方法和管理
-
德班世乒赛种子签表出炉,梁靖崑先碰张本智和,陈梦遇到伊藤美诚
-
当前速递!美国总统拜登批准田纳西州重大灾难声明
-
九王一后未删减全文阅读_小说九王一后-世界即时看
-
流行病学调查表中的流行性感冒最主要的传播途径是什么_流行性感冒最主要的传播途径是什么
-
现代职业教育中国实践百人论坛在深召开
-
4140万元!赣榆徐福片区挂牌新地块,计划打造40000平方米五星级酒店,火速围观~
-
东方公安成功捣毁一流动赌博窝点 抓获18人-全球聚看点
-
天天通讯!德尔股份:公司产品已经配套应用于新能源汽车,相应配套新能源汽车的产品收入约占公司2022年营业收入的4.30%
-
建筑与都市:荷兰建筑
-
南山智尚: 2022年年度股东大会决议公告
-
预埋套管规格型号大全_预埋套管
-
海外投资者连续六周净买入 日股攀升至33年来新高_环球快看
推荐内容
- 世界热门:单片机Flash自检和添加CRC常见方法
- 2022年中级经济师补考证书领取时间|全球新消息
- 建设银行暂停非柜面交易多久解除|全球观焦点
- 2023江苏连云港市递补考生参加连云港市连云区教育
- 世界观天下!洛阳在全省率先完成2023年企业薪酬调
- 全球关注:耶伦与银行业高管举行会议,警告:美债
- 南京市雨花台区邀政协委员为“数字城”建设建言献
- 禾雀花的养殖方法 禾雀花的养殖方法和管理
- 德班世乒赛种子签表出炉,梁靖崑先碰张本智和,陈
- 当前速递!美国总统拜登批准田纳西州重大灾难声明
- 九王一后未删减全文阅读_小说九王一后-世界即时看
- 流行病学调查表中的流行性感冒最主要的传播途径是
- 现代职业教育中国实践百人论坛在深召开
- 4140万元!赣榆徐福片区挂牌新地块,计划打造4000
- 东方公安成功捣毁一流动赌博窝点 抓获18人-全球
- 天天通讯!德尔股份:公司产品已经配套应用于新能
- 建筑与都市:荷兰建筑
- 南山智尚: 2022年年度股东大会决议公告
- 预埋套管规格型号大全_预埋套管
- 海外投资者连续六周净买入 日股攀升至33年来新高
- 祥符区曲兴镇:开展农业技术培训 助力乡村振兴
- 贵州公安厅交通管理局小程序 贵州公安厅交通管理
- 天天精选!在京文化和旅游重点场馆全面实现5G网络
- 秦始皇修筑的水渠的哪条河?他的目的是什么? 天
- 环球通讯!福州水上交通行业推出“信用+双随机”
- 求权力的游戏未删减版百度网盘_权力的游戏未删减
- 科大讯飞关联企业设立新公司 经营范围含物联网技
- 投资者多角度“拷问” 看好券商估值修复空间
- 厦门案例入选2023年度全国信用承诺优秀案例
- 刘国梁很用心,李隼谈国乒备战情况,为孙颖莎等所
- 摩根大通:予腾讯增持评级 目标价升至440港元
- 加快建设西部陆海新通道!重庆市发布五年行动方案
- 40个智慧城市时空大数据平台建成!开展400余项行
- 信息:“520”我们结婚吧!温州超1425对新人预约
- 创业者:创业梦想从这里启航
- 世卫组织发布指南:不应将使用非糖类甜味剂用作控
- 今日讯!楼市又“熄火”?房价还会暴涨?你可能误
- 扶优限劣 退市制度正在发挥A股市场"净化器"作用
- 小事记 | 龙光清盘呈请聆讯押后 华夏幸福下属
- 动态焦点:乙肝表面抗原携带者_乙肝表面抗原阳性是
油气
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
经济
-
中新网通辽10月18日电 (记者 张林虎)18日,记者从内蒙古自治区通辽市奈曼旗公安局获悉,国家一级保护动物--梅花鹿误入当地村民羊群,
-
中新网杭州10月18日电 (王题题 胡燕婕)云天收夏色,浅秋正渐浓。10月18日,浙江杭州市西湖游船有限公司推出的惠民多站点“西湖环湖游
-
中新网福州10月18日电 (记者 龙敏 王东明)福州市晋安区官方18日晚间通报,18日14时47分,晋安区岳峰镇化工路爱摩轮商业广场项目摩天
-
中新网兰州10月18日电 (闫姣 艾庆龙 吉翔)“红山白土头,黄河向西流。”不少人疑问,天下黄河向东流,为何甘肃永靖县这段黄河却向西
-
中新网北京10月18日电 《清华城市健康设施指数》18日在北京发布。报告成果显示,城市健康设施指数领先城市以中心城市和东部沿海城市