|
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工程。这里就详细介绍工程的配置和产生过程。
图1. 工程文件结构 2.2. 验证在flash中的执行 在main函数中添加一个led翻转和延时的代码,验证IAR和keil的正常执行。
修改IAR的配置文件,让其在SRAM中执行 3.1. 修改icf文件 STM3CubeMX生成的时候,会生成一个SRAM分配的ICF文件,如果没有拷贝一个stm32g431xx_flash.icf,将其改名为stm32g431xx_SRAM.icf.如果有就直接使用,如果没有请按照下面的格式修改:
▲ ICF文件差异对比 3.2. 主要将IAR中的link配置选项修改为SRAM的配置,如下图:
3.3. 同时将USER_VECT_TAB_ADDRESS和VECT_TAB_SRAM添加到系统宏定义。
3.4. 总之请注意这个中断向量表的位置是否有问题,你可以查看MCU的寄存器。
3.5. 运行验证 为了验证代码是在SRAM中运行的,我们可以先将FLASH全面擦除。然后编译下载并运行,可以看到LED在闪烁。并且你可以通过汇编窗口看到指令在SRAM运行。
也可以通过复位MCU,MCU不再运行反向验证刚刚是在SRAM中运行。因为MCU再次运行时,代码是从FLASH运行,而调试时,是调试工具将PC指针跳到SRAM中。 04 修改KEIL uVISION的配置文件,让其在SRAM中执行 4.1. 首先创建一个sct文件 一般Keil工程使用的是工配置的内存分配,而非使用sct自己配置文件。创建时,根据芯片的RAM配置,定义代码、标量和堆栈的大小,下面是一个例子:
4.2. 修改Keil的option中的link配置,主要是不使用系统配置,而选用手动修改的版本。 如下:
4.3. 修改debug选项,不使用Keil缺省的flash算法。
4.4. 添加一个脚本文件(run.ini)来加载调试axf文件到SRAM中,并且跳转到SRAM执行。 请参考下面例子:
4.5. 修改配置文件,使用这个脚本文件
4.6. 添加宏定义于keil配置中 确保中断向量表存放在SRAM,主要是USER_VECT_TAB_ADDRESS和VECT_TAB_SRAM。
4.7. 移除Keil的缺省FLASH算法
4.8. 运行验证 同样,为了验证代码是在SRAM中运行的,我们可以先将FLASH全面擦除。然后编译下载并运行,可以看到LED在闪烁。并且你可以通过汇编窗口看到指令在SRAM运行。
**小结 ** 你可以根据上面的思路将这个方法应用到STM32的其他系列上,需要注意一下几个方面: 1、在IAR中,
2、在KEIL中,相对复杂,主要几个点:
点击按钮下载《如何将全部代码放在SRAM中运行》原文档。 |
STM32C542RC开发板实现长短按键识别功能
【新品测评】STM32WL3R芯片测评,从点亮第一个LED到subGhz启动
[GPIO] 使用新型抽象开始C++嵌入式编程,从GPIO开始
STM32L562DK探索板——继续深入了解Audio Play的工作流程
STM32L562DK探索板——触摸菜单实验之触摸测试
STM32L562DK探索板——触摸菜单实验之LED闪烁
STM32L562DK探索板——给Audio Play添加音量控制功能
STM32L562DK探索板——重写Led闪烁demo
STM32L562DK探索板——触摸菜单的实验
STM32L562DK探索板——简单的显示变量函数
微信公众号
手机版