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("start RDP\r\n");
11: FLASH_OB_Unlock();
12: FLASH_OB_RDPConfig(OB_RDP_Level_1);
13: if(FLASH_COMPLETE != FLASH_OB_Launch())
14: printf("RDP failed\r\n");
15: else
16: printf("RDP succeed\r\n");
17: FLASH_OB_Lock();
18: if(SET==FLASH_OB_GetRDP())
19: printf("RDP OK\r\n");
20: else
21: printf("RDP KO\r\n");
22: }
23: else
24: {
25: printf("start remove RDP\r\n");
26: FLASH_OB_Unlock();
27: FLASH_OB_RDPConfig(OB_RDP_Level_0);
28: /* Start the Option Bytes programming process */
29: if (FLASH_OB_Launch() != FLASH_COMPLETE)
30: printf("remove RDP failed\r\n");
31: else
32: printf("remove RDP succeed\r\n");
33: FLASH_OB_Lock();
34: if(RESET==FLASH_OB_GetRDP())
35: printf("remove RDP OK\r\n");
36: else
37: printf("remove RDP KO\r\n");
38: }
39: is_key_toggle=0;
40: }
41: }
MDK下载到flash后,重新上电(很重要),然后按键,就可以RDP。再按一次,就可以Remove RDP.
在RAM中运行程序:搜索到一篇《在内嵌RAM中运行程序》,照着做的,有些修改。
随便建个RAM.ini
1: FUNC void Setup (void) {
2: SP = _RDWORD(0x20000000); // Setup Stack Pointer
3: PC = _RDWORD(0x20000004); // Setup Program Counter
4: _WDWORD(0xE000ED08, 0x20000000); // Setup Vector Table Offset Register
5: }
6:
7: LOAD %L INCREMENTAL
8: Setup(); // Setup for Running
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.