stm32f4 RAM中运行程序 读保护设置
扫描二维码
随时随地手机看文章
主要是为了在RAM中运行程序来解除读保护的。没想到ST-Link Utility 就直接可以。
ST-Link Utility:target-->options bytes-->就可以看到读保护。
解除读保护,选择 Level 0. 其他都不变(WDG_SW,nRST_STDBY,nRST_STOP都按照默认的勾上)
然后点击Apply即可。
读保护:
1:while(1)
2:{
3:PD13_Toggle;
4:Delay(0x7FFFF);
5://按键按下,切换是否读保护
6:if(is_key_toggle)
7:{
8:if(FLASH_OB_GetRDP()!=SET)//
9:{
10:printf("startRDPrn");
11:FLASH_OB_Unlock();
12:FLASH_OB_RDPConfig(OB_RDP_Level_1);
13:if(FLASH_COMPLETE!=FLASH_OB_Launch())
14:printf("RDPfailedrn");
15:else
16:printf("RDPsucceedrn");
17:FLASH_OB_Lock();
18:if(SET==FLASH_OB_GetRDP())
19:printf("RDPOKrn");
20:else
21:printf("RDPKOrn");
22:}
23:else
24:{
25:printf("startremoveRDPrn");
26:FLASH_OB_Unlock();
27:FLASH_OB_RDPConfig(OB_RDP_Level_0);
28:/*StarttheOptionBytesprogrammingprocess*/
29:if(FLASH_OB_Launch()!=FLASH_COMPLETE)
30:printf("removeRDPfailedrn");
31:else
32:printf("removeRDPsucceedrn");
33:FLASH_OB_Lock();
34:if(RESET==FLASH_OB_GetRDP())
35:printf("removeRDPOKrn");
36:else
37:printf("removeRDPKOrn");
38:}
39:is_key_toggle=0;
40:}
41:}
MDK下载到flash后,重新上电(很重要),然后按键,就可以RDP。再按一次,就可以Remove RDP.
在RAM中运行程序:搜索到一篇《在内嵌RAM中运行程序》,照着做的,有些修改。
随便建个RAM.ini
1:FUNCvoidSetup(void){
2:SP=_RDWORD(0x20000000);//SetupStackPointer
3:PC=_RDWORD(0x20000004);//SetupProgramCounter
4:_WDWORD(0xE000ED08,0x20000000);//SetupVectorTableOffsetRegister
5:}
6:
7:LOAD%LINCREMENTAL
8:Setup();//SetupforRunning
9:g,main
哈哈,其中 %L 就是你的工程.axf. 很多其他做法都是带个路径/project.axf。
而%L要简单很多。
LOAD %L INCREMENTAL
g,main 相当于MDK中的:
所以要么RAM.ini中有这两句,要么把这里两个勾 勾上。
F4,128kB,就分成 64KB+64KB吧。
为了能够RAM调试中响应中断。要加上:VECT_TAB_RAM. 我一开始就是没加,一直不能进中断。
还要注意这个地方:
网上有些说法错的,比如在RAM中运行就只能在调试模式下,不能点击那个Load按钮下载。
一切都正常的情况下,应该是这个结果:
地址 0x2000….开头
能够设断点。(RAM的这个Target和原来的那个要设置不同的.o文件位置)
Good Luck.