在代码 对 stm32 写保护的操作

在工作中遇到了需要对stm32的部分flash中的代码进行写保护的需求。

一开始调查发现可以使用stm32的官方软件 stm32 stlink utility或者更新版本的stm32CubeProgrammer对指定的flash页进行写保护操作。

在代码 对 stm32 写保护的操作_第1张图片

在代码 对 stm32 写保护的操作_第2张图片

虽然用上面的方式可以达到目的,不过 为了生存部门的方便,我在网上搜寻能否在自动下载的时候把写保护的操作一起做了。 

因为现在生产部门使用的一种正点原子出品的。离线下载器,而这种离线下载器并不支持写入  写保护命令的功能(只支持读保护)。

在紧急时刻,发现在正点原子的论坛里面,有人说已经通过代码实现了这个功能。可是并没有告诉如何实现。

于是就去官方的flash.c文件里面去搜索,果然有FLASH_Status FLASH_EnableWriteProtection(u32 FLASH_Pages) 这个函数。

接着直接调用,Flash_Pages这个入口参数使用FLASH_WRProt_Pages0to3等官方定义的宏定义。调用执行后,再用CubeProgrammer查看,并没有把相应的页设置为只读。这说明,设置失败了。看来只能一点点找问题了。

单步执行后,发现在函数 FLASH_EnableWriteProtection里面第二次调用FLASH_WaitForLastOperation这个函数的时候,返回值为 FLASH_ERROR_PG 。

在代码 对 stm32 写保护的操作_第3张图片

又参照了,官方的PM0075    Programming manual   查看  寄存器FLASH_SR的标志位 PGERR

在代码 对 stm32 写保护的操作_第4张图片

说明再写如内存地址的时候,这个地址并不是0xFFFF。然后再iar里面去看,果然OB->WRP1 这个地址为0x00FF,不是0xffff,

接着再找为何不是0xFFFF,难道是写入之前,要先擦除一下??,于是再写保护的函数前面增加了一个FLASH_EraseOptionBytes 的函数,

同时在网上也找到有人 这样类似的操作。

https://community.st.com/s/question/0D50X00009Xkbjh/flash-write-protection

执行过这样的两个函数后,前12页flash就不能写入了。再去用pc软件观察,验证没问题。

在代码 对 stm32 写保护的操作_第5张图片

 

你可能感兴趣的:(stm32)