stm32f4 RAM中運(yùn)行程序 讀保護(hù)設(shè)置
主要是為了在RAM中運(yùn)行程序來解除讀保護(hù)的。沒想到ST-Link Utility 就直接可以。
ST-Link Utility:target-->options bytes-->就可以看到讀保護(hù)。
解除讀保護(hù),選擇 Level 0. 其他都不變(WDG_SW,nRST_STDBY,nRST_STOP都按照默認(rèn)的勾上)
然后點(diǎn)擊Apply即可。
讀保護(hù):
1:while(1)
2:{
3:PD13_Toggle;
4:Delay(0x7FFFF);
5://按鍵按下,切換是否讀保護(hù)
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中運(yùn)行程序:搜索到一篇《在內(nèi)嵌RAM中運(yùn)行程序》,照著做的,有些修改。
隨便建個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 相當(dāng)于MDK中的:
所以要么RAM.ini中有這兩句,要么把這里兩個勾 勾上。
F4,128kB,就分成 64KB+64KB吧。
為了能夠RAM調(diào)試中響應(yīng)中斷。要加上:VECT_TAB_RAM. 我一開始就是沒加,一直不能進(jìn)中斷。
還要注意這個地方:
網(wǎng)上有些說法錯的,比如在RAM中運(yùn)行就只能在調(diào)試模式下,不能點(diǎn)擊那個Load按鈕下載。
一切都正常的情況下,應(yīng)該是這個結(jié)果:
地址 0x2000….開頭
能夠設(shè)斷點(diǎn)。(RAM的這個Target和原來的那個要設(shè)置不同的.o文件位置)
Good Luck.