使用Keil将STM32部分程序放在RAM中运行

  1. 手动分配RAM区域,新建.sct文件,定义RAM_CODE区域,并指定其正确的起始地址和大小。
c 复制代码
; *************************************************************
; *** Scatter-Loading Description File generated by uVision ***
; *************************************************************

LR_IROM1 0x08000000 0x00010000  {    ; load region size_region
  ER_IROM1 0x08000000 0x00010000  {  ; load address = execution address
   *.o (RESET, +First)
   *(InRoot$$Sections)
   .ANY (+RO)
   .ANY (+XO)
  }
  RW_IRAM1 0x20000000 0x4000  {  ; RW data in RAM 
   .ANY (+RW +ZI)
  }
  ER_RAM_CODE 0x20004000 0x1000 {  ; Execution region in RAM for specific functions
    *.o (.RAM_CODE)
  }
}

在keil中,打开"Options for Target",选择"Linker"选项卡,手动选择新生成的.sct文件

  1. 手动标记函数:

在函数定义中使用 attribute((section(".RAM_CODE"))) 明确标记需要放置在RAM中的函数。

c 复制代码
__attribute__((section(".RAM_CODE")))
void SPI1_Nss_High(void)
{
    HAL_GPIO_WritePin(SPI1_NSS_GPIO_Port, SPI1_NSS_Pin, GPIO_PIN_SET);
}

__attribute__((section(".RAM_CODE")))
void HAL_GPIO_WritePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState)
{
  /* Check the parameters */
  assert_param(IS_GPIO_PIN(GPIO_Pin));
  assert_param(IS_GPIO_PIN_ACTION(PinState));

  if (PinState != GPIO_PIN_RESET)
  {
    GPIOx->BSRR = GPIO_Pin;
  }
  else
  {
    GPIOx->BSRR = (uint32_t)GPIO_Pin << 16u;
  }
}

3.修改启动文件,将指定代码从Flash搬运到RAM:

c 复制代码
//修改前.s启动代码
; Reset handler
Reset_Handler    PROC
                 EXPORT  Reset_Handler             [WEAK]
     IMPORT  __main
     IMPORT  SystemInit
                 LDR     R0, =SystemInit
                 BLX     R0
                 LDR     R0, =__main
                 BX      R0
                 ENDP
c 复制代码
//修改后启动代码(cortex-M3)
RAM_CODE_START    EQU 0x20004000  ; RAM????????
RAM_CODE_SIZE     EQU 0x1000      ; RAM??????
FLASH_CODE_START  EQU 0x08000000
; Reset handler
Reset_Handler    PROC
                 EXPORT  Reset_Handler             [WEAK]
     IMPORT  __main
     IMPORT  SystemInit
                                 LDR     R0, =SystemInit
                BLX     R0

                ; Copy RAM code section from Flash to RAM
                LDR     R1, =FLASH_CODE_START
                LDR     R2, =RAM_CODE_START
                LDR     R3, =RAM_CODE_SIZE
Copy_RAM_Code
                LDRB    R0, [R1], #1
                STRB    R0, [R2], #1
                SUBS    R3, R3, #1
                BNE     Copy_RAM_Code

                ; Enter the C runtime environment
                 LDR     R0, =__main
                 BX      R0
                 ENDP

如果单片机内核是cortex-m0+,修改后代码如下

c 复制代码
//修改后启动代码(cortex-M0+)
RAM_CODE_START    EQU 0x20006000  ; RAM????????
RAM_CODE_SIZE     EQU 0x1000      ; RAM??????
FLASH_CODE_START  EQU 0x00000000
; Reset handler
Reset_Handler    PROC
                 EXPORT  Reset_Handler             [WEAK]
     IMPORT  __main
     IMPORT  SystemInit
                                 LDR     R0, =SystemInit
                BLX     R0

                ; Copy RAM code section from Flash to RAM
                LDR     R1, =FLASH_CODE_START
                LDR     R2, =RAM_CODE_START
                LDR     R3, =RAM_CODE_SIZE
Copy_RAM_Code
                LDRB    R0, [R1]
                STRB    R0, [R2]
                ADDS    R1, R1, #1
                ADDS    R2, R2, #1
                SUBS    R3, R3, #1
                BNE     Copy_RAM_Code

                ; Enter the C runtime environment
                LDR     R0, =__main
                BX      R0
                ENDP
  1. 重新编译项目
    在Keil中选择"Rebuild All"来重新编译项目。
  2. 查看生成的.map文件,确保目标函数被正确放置在RAM中。
相关推荐
悠哉悠哉愿意3 天前
【单片机学习笔记】串口、超声波、NE555的同时使用
笔记·单片机·学习
Lester_11013 天前
STM32霍尔传感器输入口设置为复用功能输入口时,还能用GPIO函数直接读取IO的状态吗
stm32·单片机·嵌入式硬件·电机控制
LCG元3 天前
低功耗显示方案:STM32L0驱动OLED,动态波形绘制与优化
stm32·嵌入式硬件·信息可视化
三佛科技-187366133973 天前
120W小体积碳化硅电源方案(LP8841SC极简方案12V10A/24V5A输出)
单片机·嵌入式硬件
z20348315203 天前
STM32F103系列单片机定时器介绍(二)
stm32·单片机·嵌入式硬件
古译汉书3 天前
【IoT死磕系列】Day 7:只传8字节怎么控机械臂?学习工业控制 CANopen 的“对象字典”(附企业级源码)
数据结构·stm32·物联网·http
Alaso_shuang3 天前
STM32 核心输入、输出模式
stm32·单片机·嵌入式硬件
脚后跟3 天前
AI助力嵌入式物联网项目全栈开发
嵌入式硬件·物联网·ai编程
2501_918126913 天前
stm32死锁是怎么实现的
stm32·单片机·嵌入式硬件·学习·个人开发
z20348315203 天前
STM32F103系列单片机定时器介绍(一)
stm32·单片机