在项目中,通常会将一些需要掉电存储的数据保存在flash中,但在某些情况下存储的数据会被莫名其妙的修改或者丢失,但这种情况又很难复现。为了模拟这种情况,我们可以读出Flash数据,修改某个值以后再下载进去,不需要动程序程序部分。以下内容分为三个部分,第一是读取Flash数据,第二是修改Flash数据,第三是修改后的数据下载回单片机。
一、读取Flash数据
借助的工具是SEGGER J-Flash
硬件工具是Jlink SWD
(1)打开SEGGER J-Flash工具,点击Options选项,选择Project Settings,打开界面后,选择SWD模式,如下图所示。
(2)MCU选择你当前用的型号,最后点击确认。如下图所示。
(3)连接单片机。
(4)读取Flash数据,根据程序设定的存储页数计算出地址,就得到了要读取的范围,举例:
STM32F103VCT6的1Page是1024字节,我程序设定从第200Page开始存储
#define ParameterAddress (FLASH_BASE + (200 * 1024))
// 200 * 1024 = 0x32000
// 0x08000000 + 0x32000 = 0x08032000
所以计算出来的地址是0x08032000
按下图打开界面
输入地址,读取长度是0x1000字节
读取成功界面如下
(5)Flash数据另存为Hex文件。
注意保存为Hex
二、修改Flash数据
打开Hex文件,下图红色框中的就是存储的数据
红色框的最后一个字节是字节校验码,Hex文件的格式解析可以参考下面链接
Hex文件格式
STM32 Hex文件格式解析
程序中设定了每个数据都是32bit存储,并且是地址+数据的方式存储,以红色框第一行的程序举例
地址0x20002437,值是0x000000C8
地址0x20002837,值是0x00320032
地址0x20002C37,值是0x000007D0
地址0x20003037,值是0x000007D0
最后一个E2是校验码。
假设我现在将0x000000C8修改为0x00000064,需要重新计算校验码,校验码计算方式是
1.将这一行的所有的字节(16进制)相加求和,得到sum
2.取sum的低8bit,得到A
3.0x100-A = 校验码。
那么修改后的校验码计算过程:
Sum = 20+20+00+00+24+37+00+20+64+00+00+00+28+37+00+20+32+00+32+00+2C+37+00+20+D0+07+00+00+30+37+00+20+D0+07+00+00 = 4BA
即Sum = 0x4BA
取低8位为0xBA,则校验码为0x100-0xBA = 0x46
更改为后如下图
三、将数据烧入单片机
(1)打开hex文件
如下图所示,hex文件带地址,下图红色框的地址默认为读取的起始地址,能够加载hex文件进来,说明校验码正确,校验码错误是不能加载hex文件的,小红色框的0x64表明修改成功
(2)写入单片机flash,请确保Jlink连接着单片机
写入成功界面
最后可以通过别的手段检测到Flash中的这个数据已经被篡改了。文章来源:https://www.toymoban.com/news/detail-783876.html
其实这个读取功能还可以用于读取别人下载进单片机中程序,读取地址从0x08000000开始,然后将其下载到另外的单片机中,实现的功能是一样的。文章来源地址https://www.toymoban.com/news/detail-783876.html
到了这里,关于模拟STM32 Flash数据丢失、被串改的异常情况的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!