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中的:

image

所以要么RAM.ini中有这两句,要么把这里两个勾 勾上。

 

F4,128kB,就分成 64KB+64KB吧。

image

为了能够RAM调试中响应中断。要加上:VECT_TAB_RAM. 我一开始就是没加,一直不能进中断。

image

还要注意这个地方:

似乎右边的都要勾上才行。

网上有些说法错的,比如在RAM中运行就只能在调试模式下,不能点击那个Load按钮下载。

一切都正常的情况下,应该是这个结果:

image

地址 0x2000….开头

能够设断点。(RAM的这个Target和原来的那个要设置不同的.o文件位置)

Good Luck.

posted @ 2014-04-24 12:06  tofixer  阅读(3479)  评论(0编辑  收藏  举报