当前位置: 首页 > news >正文

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

  1. 手动分配RAM区域,新建.sct文件,定义RAM_CODE区域,并指定其正确的起始地址和大小。
; *************************************************************
; *** Scatter-Loading Description File generated by uVision ***
; *************************************************************LR_IROM1 0x08000000 0x00010000  {    ; load region size_regionER_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文件在这里插入图片描述
2. 手动标记函数:
在函数定义中使用 attribute((section(“.RAM_CODE”))) 明确标记需要放置在RAM中的函数。

__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:

//修改前.s启动代码
; Reset handler
Reset_Handler    PROCEXPORT  Reset_Handler             [WEAK]IMPORT  __mainIMPORT  SystemInitLDR     R0, =SystemInitBLX     R0LDR     R0, =__mainBX      R0ENDP
//修改后启动代码(cortex-M3)
RAM_CODE_START    EQU 0x20004000  ; RAM????????
RAM_CODE_SIZE     EQU 0x1000      ; RAM??????
FLASH_CODE_START  EQU 0x08000000
; Reset handler
Reset_Handler    PROCEXPORT  Reset_Handler             [WEAK]IMPORT  __mainIMPORT  SystemInitLDR     R0, =SystemInitBLX     R0; Copy RAM code section from Flash to RAMLDR     R1, =FLASH_CODE_STARTLDR     R2, =RAM_CODE_STARTLDR     R3, =RAM_CODE_SIZE
Copy_RAM_CodeLDRB    R0, [R1], #1STRB    R0, [R2], #1SUBS    R3, R3, #1BNE     Copy_RAM_Code; Enter the C runtime environmentLDR     R0, =__mainBX      R0ENDP

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

//修改后启动代码(cortex-M0+)
RAM_CODE_START    EQU 0x20006000  ; RAM????????
RAM_CODE_SIZE     EQU 0x1000      ; RAM??????
FLASH_CODE_START  EQU 0x00000000
; Reset handler
Reset_Handler    PROCEXPORT  Reset_Handler             [WEAK]IMPORT  __mainIMPORT  SystemInitLDR     R0, =SystemInitBLX     R0; Copy RAM code section from Flash to RAMLDR     R1, =FLASH_CODE_STARTLDR     R2, =RAM_CODE_STARTLDR     R3, =RAM_CODE_SIZE
Copy_RAM_CodeLDRB    R0, [R1]STRB    R0, [R2]ADDS    R1, R1, #1ADDS    R2, R2, #1SUBS    R3, R3, #1BNE     Copy_RAM_Code; Enter the C runtime environmentLDR     R0, =__mainBX      R0ENDP
  1. 重新编译项目
    在Keil中选择“Rebuild All”来重新编译项目。
  2. 查看生成的.map文件,确保目标函数被正确放置在RAM中。
    在这里插入图片描述
http://www.lryc.cn/news/393900.html

相关文章:

  • 【MySQL8.0】 CentOS8.0下安装mysql报错权限问题的记录
  • 在内网互通的服务器中自由跳转与数据管理
  • Arcgis Api 三维聚合支持最新版API
  • 在Conda环境中高效使用Kubernetes:跨平台容器化实践指南
  • scikit-learn超参数调优 (自动寻找模型最佳参数) 方法
  • 零基础STM32单片机编程入门(八)定时器PWM输入实战含源码视频
  • spring cloud gateway客户端websocket断开连接,服务侧连接没有关闭的问题处理
  • 确认下单:购物车页面点击 去结算 按钮发起两个请求trade(显示购物车的商品信息和计算商品的总金额)findUserAddressList
  • 聚类分析方法(一)
  • Midjourney对图片细微调整和下载保存
  • Python文件写入操作
  • FPGA_GTX:简要版
  • 使用mq向队列发送消息流程
  • Git中两个开发分支merge的原理
  • 数字图像处理、机器视觉(计算机视觉)、计算图形学概念
  • Android SurfaceFlinger ——获取显示屏信息(十八)
  • QCustomPlot+ vs2022+ qt
  • Perl 语言开发(五):循环语句
  • 线性系统理论及应用GUI设计及仿真
  • RAG综述汇总
  • 智慧水利的变革之路:如何通过大数据、物联网和人工智能构建高效、智能、可持续的水利管理新模式
  • springcloud-gateway 网关组件中文文档
  • Android Gradle开发与应用Gradle详细使用
  • 软件架构的23个基本原则:构建稳健、可扩展的系统
  • 江苏省生产经营单位安全管理考核(附答案)
  • Kafka第四篇——生产数据总体概括,源码解析分区策略,数据收集器,Sender发送线程,key值
  • 二叉树的链式结构
  • 【STM32】在标准库中使用DMA
  • 多线程详解
  • 软件工程需求之:业务需求与用户需求