搜索
bottom↓
回复: 7

STM32F412解除读保护不能完全解除

[复制链接]

出130入20汤圆

发表于 2020-10-7 21:10:07 | 显示全部楼层 |阅读模式
如题,大家遇到没有,很奇怪的现象,用Jflash secure chip后,哪怕再unsecure,发现用MDK直接download程序,下载不了。要用Jflash文件夹下面带的那个Jlink STM32 Unlock程序运行一下,才能解锁。

Jflash用的V6.82,还以为是不是版本太高了。但是用下面的代码

FLASH_Unlock();

/* Unlock the option bytes block access */
FLASH_OB_Unlock();

/* Clears the FLASH pending flags */
FLASH_ClearFlag(FLASH_FLAG_EOP|FLASH_FLAG_WRPERR | FLASH_FLAG_PGAERR
                        | FLASH_FLAG_PGPERR | FLASH_FLAG_PGSERR);
                       
//设置读保护为Level1
FLASH_OB_RDPConfig(OB_RDP_Level_1);

/* Launch the option byte loading */
FLASH_OB_Launch();  
                                       
FLASH_OB_Lock();
FLASH_Lock();  

发现加密后也是一样。Jlink unsecure虽然成功,但是MDK还是下载不了。

用原子的脱机烧录器去解锁下载程序,也不行。

用FLASH_EraseAllSectors(VoltageRange_3);或者设置为保护0 FLASH_OB_RDPConfig(OB_RDP_Level_0);发现程序是擦除了,但是还是保护着,MDK还是直接下载不了。Jflash也直接烧录不进去。

是怎么回事呢?



阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入442汤圆

发表于 2020-10-7 22:10:12 来自手机 | 显示全部楼层
stm32l0需要写入指定的option byte(执行unprotect之后可以检查默认值)才能读写,否则异常。

出130入20汤圆

 楼主| 发表于 2020-10-7 23:05:29 | 显示全部楼层
wye11083 发表于 2020-10-7 22:10
stm32l0需要写入指定的option byte(执行unprotect之后可以检查默认值)才能读写,否则异常。 ...

请问写入指定的option byte是什么意思呢?

出0入442汤圆

发表于 2020-10-8 01:12:49 来自手机 | 显示全部楼层
shuiluo2 发表于 2020-10-7 23:05
请问写入指定的option byte是什么意思呢?

就是那个读保护字。

出130入20汤圆

 楼主| 发表于 2020-10-9 00:04:21 | 显示全部楼层
解决了,参考野火的代码,再用STVD查了下控制字,全部初始化掉,就可以再次下载了。

                                                FLASH_Unlock();
                                                /* 使能访问选项字节寄存器 */
                                                FLASH_OB_Unlock();
                                                                       
                                                /* 擦除用户区域 (用户区域指程序本身没有使用的空间,可以自定义)**/
                                                /* 清除各种FLASH的标志位 */  
                                                FLASH_ClearFlag(FLASH_FLAG_EOP | FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR |
                                                                                                                FLASH_FLAG_PGAERR | FLASH_FLAG_PGPERR|FLASH_FLAG_PGSERR);
                                                                                               
                                                //确保把读保护级别设置为LEVEL1,以便恢复PCROP寄存器位
                                                //PCROP寄存器位从设置为0时,必须是读保护级别由LEVEL1转为LEVEL0时才有效,
                                                //否则修改无效
                                                FLASH_OB_RDPConfig(OB_RDP_Level_1);
                                               
                                                FLASH_OB_Launch();
                                               
                                                FLASH_WaitForLastOperation();

                                                //设置为LEVEL0并恢复PCROP位                                                       
                                                //关闭PCROP模式
                                                FLASH_OB_PCROPSelectionConfig(OB_PcROP_Disable);
                                                FLASH_OB_RDPConfig(OB_RDP_Level_0);

                                                FLASH_OB_Launch();
                                               
                                                //设置其它位为默认值
                                                 //(*(__IO uint32_t *)(OPTCR_BYTE0_ADDRESS))=0x0FFFAAE9;
                                                  //(*(__IO uint16_t *)(OPTCR1_BYTE2_ADDRESS))=0x0FFF;//F42xxx和F43xxx用
                                               
                                                (*(__IO uint32_t *)(OPTCR_BYTE0_ADDRESS))=0xE3;//BOR设置为LEVEL3
                                                (*(__IO uint32_t *)(OPTCR_BYTE1_ADDRESS))=0xAA;
                                                (*(__IO uint32_t *)(OPTCR_BYTE2_ADDRESS))=0xFF;
                                                (*(__IO uint32_t *)(OPTCR_BYTE3_ADDRESS))=0x3F;
                                               
                                                FLASH_OB_Launch();
                                                //禁止访问
                                                FLASH_OB_Lock();
                                               
                                                FLASH_Unlock();

出0入0汤圆

发表于 2020-10-13 23:22:28 来自手机 | 显示全部楼层
楼上的能不能发一个写flash的例程序,最近在搞ota,折腾死了

出130入20汤圆

 楼主| 发表于 2020-10-14 17:16:01 | 显示全部楼层
lnso 发表于 2020-10-13 23:22
楼上的能不能发一个写flash的例程序,最近在搞ota,折腾死了

写STM32片内Flash吗?我是先擦除block或sector,然后一个字节一个字节直接从bin文件用写Byte的函数写Flash的。简单粗暴。

出0入0汤圆

发表于 2020-10-14 21:44:47 | 显示全部楼层
shuiluo2 发表于 2020-10-14 17:16
写STM32片内Flash吗?我是先擦除block或sector,然后一个字节一个字节直接从bin文件用写Byte的函数写Flas ...

50KB*1024,那得写多久?可以发出来我参考一下吗?
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-3-29 12:56

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表