你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

实战经验 | 如何将全部代码放在SRAM中运行

[复制链接]
攻城狮Melo 发布时间:2026-10-20 14:10

01

问题描述

客户开发自己的IAP时,需要借助STM32 system bootloader烧录一个临时的代码加密的APP和IAP到SRAM中,然后通过运行临时代码解密APP和IAP,再将其烧录入FALSH中,再次上电后这个临时代码就不存在了。这样保证了APP和IAP的安全。客户要求提供一个这样通过STM32 system bootloader的串口烧录代码在SRAM中执行的例程。

0 2

代码实现

本文以比较通用的Nucleo-G431RB为例,详细介绍如何配置Keil或者IAR工程,将代码下载到RAM并进行调试。其他STM32系列芯片的配置方法类似,只需根据芯片的RAM地址和大小进行调整。本应用文档不会介绍如何使用bootloader跳转到SRAM的执行过程。

2.1. 使用STM32CUEMX生成一个IAR的工程

在这个工程中,使用基本配置,添加一个LED点灯的例子方便查看代码是否正常运行,然后生成keil uvision和IAR工程。这里就详细介绍工程的配置和产生过程。

image.png

图1. 工程文件结构

2.2. 验证在flash中的执行

在main函数中添加一个led翻转和延时的代码,验证IAR和keil的正常执行。

image.png 0 3

修改IAR的配置文件,让其在SRAM中执行

3.1. 修改icf文件

STM3CubeMX生成的时候,会生成一个SRAM分配的ICF文件,如果没有拷贝一个stm32g431xx_flash.icf,将其改名为stm32g431xx_SRAM.icf.如果有就直接使用,如果没有请按照下面的格式修改:

image.png

▲ ICF文件差异对比

3.2. 主要将IAR中的link配置选项修改为SRAM的配置,如下图:

image.png

3.3. 同时将USER_VECT_TAB_ADDRESS和VECT_TAB_SRAM添加到系统宏定义。

image.png

3.4. 总之请注意这个中断向量表的位置是否有问题,你可以查看MCU的寄存器。

image.png

3.5. 运行验证

为了验证代码是在SRAM中运行的,我们可以先将FLASH全面擦除。然后编译下载并运行,可以看到LED在闪烁。并且你可以通过汇编窗口看到指令在SRAM运行。

image.png

也可以通过复位MCU,MCU不再运行反向验证刚刚是在SRAM中运行。因为MCU再次运行时,代码是从FLASH运行,而调试时,是调试工具将PC指针跳到SRAM中。

04

修改KEIL uVISION的配置文件,让其在SRAM中执行

4.1. 首先创建一个sct文件

一般Keil工程使用的是工配置的内存分配,而非使用sct自己配置文件。创建时,根据芯片的RAM配置,定义代码、标量和堆栈的大小,下面是一个例子:

image.png

4.2. 修改Keil的option中的link配置,主要是不使用系统配置,而选用手动修改的版本。

如下:

image.png

4.3. 修改debug选项,不使用Keil缺省的flash算法。

image.png

4.4. 添加一个脚本文件(run.ini)来加载调试axf文件到SRAM中,并且跳转到SRAM执行。

请参考下面例子:

image.png

4.5. 修改配置文件,使用这个脚本文件

image.png

4.6. 添加宏定义于keil配置中

确保中断向量表存放在SRAM,主要是USER_VECT_TAB_ADDRESS和VECT_TAB_SRAM。

image.png

4.7. 移除Keil的缺省FLASH算法

image.png

4.8. 运行验证

同样,为了验证代码是在SRAM中运行的,我们可以先将FLASH全面擦除。然后编译下载并运行,可以看到LED在闪烁。并且你可以通过汇编窗口看到指令在SRAM运行。

image.png 0 5

**小结

**

你可以根据上面的思路将这个方法应用到STM32的其他系列上,需要注意一下几个方面:

1、在IAR中,

  • 你需要根据芯片的实际SRAM的情况配置ICF文件。
  • 根据具体SystemInit文件情况,选择是否需要添加两个宏(USER_VECT_TAB_ADDRESS和VECT_TAB_SRAM)到工程配置的宏定义中。
  • 另外需要将缺省的FLASH icf文件改为自己配置的SRAM icf文件。

2、在KEIL中,相对复杂,主要几个点:

  • 根据芯片的实际SRAM的情况配置自己的sct文件,并且替换keil配置中的缺省配置。
  • 去除所有的跟flash相关的算法。
  • 添加运行脚本,并且使用它。
  • 根据具体SystemInit文件情况,选择是否需要添加两个宏(USER_VECT_TAB_ADDRESS和VECT_TAB_SRAM)到工程配置的宏定义中。

点击按钮下载《如何将全部代码放在SRAM中运行》原文档。

赞 收藏 评论0 发布时间:2026-10-20 14:10

举报

0个回答

所属标签

相似技术帖

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版