当前位置: 代码迷 >> 综合 >> stm32f4 RAM中运行程序 读保护设置 - tofixer
  详细解决方案

stm32f4 RAM中运行程序 读保护设置 - tofixer

热度:0   发布时间:2023-12-21 07:55:53.0

stm32f4 RAM中运行程序 读保护设置 - tofixer

主要是为了在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.