在工作中遇到了需要对stm32的部分flash中的代码进行写保护的需求。
一开始调查发现可以使用stm32的官方软件 stm32 stlink utility或者更新版本的stm32CubeProgrammer对指定的flash页进行写保护操作。
虽然用上面的方式可以达到目的,不过 为了生存部门的方便,我在网上搜寻能否在自动下载的时候把写保护的操作一起做了。
因为现在生产部门使用的一种正点原子出品的。离线下载器,而这种离线下载器并不支持写入 写保护命令的功能(只支持读保护)。
在紧急时刻,发现在正点原子的论坛里面,有人说已经通过代码实现了这个功能。可是并没有告诉如何实现。
于是就去官方的flash.c文件里面去搜索,果然有FLASH_Status FLASH_EnableWriteProtection(u32 FLASH_Pages) 这个函数。
接着直接调用,Flash_Pages这个入口参数使用FLASH_WRProt_Pages0to3等官方定义的宏定义。调用执行后,再用CubeProgrammer查看,并没有把相应的页设置为只读。这说明,设置失败了。看来只能一点点找问题了。
单步执行后,发现在函数 FLASH_EnableWriteProtection里面第二次调用FLASH_WaitForLastOperation这个函数的时候,返回值为 FLASH_ERROR_PG 。
又参照了,官方的PM0075 Programming manual 查看 寄存器FLASH_SR的标志位 PGERR
说明再写如内存地址的时候,这个地址并不是0xFFFF。然后再iar里面去看,果然OB->WRP1 这个地址为0x00FF,不是0xffff,
接着再找为何不是0xFFFF,难道是写入之前,要先擦除一下??,于是再写保护的函数前面增加了一个FLASH_EraseOptionBytes 的函数,
同时在网上也找到有人 这样类似的操作。
https://community.st.com/s/question/0D50X00009Xkbjh/flash-write-protection
执行过这样的两个函数后,前12页flash就不能写入了。再去用pc软件观察,验证没问题。