STM32固件IAP升级实战

发布者:清新生活最新更新时间:2023-04-03 来源: zhihu关键字:STM32  固件  IAP升级 手机看文章 扫描二维码
随时随地手机看文章

硬件:stm32f103cbt6 软件:STM32F10x_StdPeriph_Lib_V3.5.0

1 预备知识
2 Bootloader

  • 2.1 启动流程

  • 2.2 校验跳转地址是否有效

  • 2.3 Keil 工程 IAP 的相关设置

3 Application

  • 3.1 启动流程

  • 3.2 IAP 中的引导部分

  • 3.3 关于 VTOR

  • 3.4 Keil 工程设置

4 附件

1 预备知识
基于标准外设库(STM32F10x_StdPeriph_Lib_V3.5.0)的 IAP 升级相关资料可以参考 IAP ST 官方资料汇总。

STM32 升级的三种方式:IAP,ICP,ISP;具体有什么区别可以自行 Google;

本文需要实现 STM32 的 Bootloader(后面 Bootloader/IAP 不加以区分),文件传输基于 ymodem 协议通过串口进行传输,这里参考了 ST 官方的 DEMO —— STM32F10xxx in-application programming using the USART AN2557,在此基础上做了部分修改,增加了延时启动的功能,最终可以实现想要的效果。



整体架构分为两个部分;Bootloader 和 Application,具体如下图所示;



由上图可知,STM32 内置的 Flash 被分成了两个部分,分别用来保存 Bootloader 和 Application 程序,这里有两个有两个 FLASH 起始地址 0x8000000 和 0x8003000;

为什么是 0x8000000 这个地址呢?而不是其他地址呢?这是由 M3 内核硬件上的设计就已经这么做了,人为设计好了,可以参考 M3 内核权威指南;

0x8003000 这个地址则是由我们自己来规定的,这个地址的范围必须在 0x8000000 和 0x8020000 之间,所以一般根据 Bootloader 程序的最终大小,在这范围之间取一个比较合理的值即可。如下图所示;


注意:本文使用的stm32f103cb,属于中等大小 Flash,128K = 0x20000,所以地址范围是 0x8000000~0x8020000;

2 Bootloader
2.1 启动流程
这里的 Bootloader 即为 IAP 程序,它具备以下几个功能;

支持文件传输;本文基于 ymodem 协议通过串口通讯接收或发送的 bin 文件;当然也可以通过 I2C,SPI,USB,WiFi,蓝牙等等进行文件传输;

对内置 Flash 进行读写,擦除和编程;

启动 Application 程序;

前面分析 STM32 启动文件的时候,我们可以知道,正常一个系统的启动流程,可以参考 《STM32 标准库 V3.5 启动文件 startup_stm32f10xxx.s 分析》;



由该图可以知道程序正常启动流程;以下表格一四个向量是必须的,从图中也可以了解到;



2.2 校验跳转地址是否有效
在主函数中可以看到如下程序;甚是不解和迷茫;沉思一会儿才恍然大悟;



本文中 ApplicationAddress = 0x8000000;那么*(__IO uint32_t*)ApplicationAddress)则是这个地址中所保存的值,由表格一可以知道,程序起始地址的第一个向量地址保存的栈顶的,因此,地址 0x800_0000 和 0x800_3000 中保存的值都是指向栈顶,如下图所示;



栈是在 RAM 上分配,因此 RAM 的有效范围要做一个检测,栈顶地址和 0x2FFE0000 做与运算可以推算出,要校验的 RAM 范围是 0x2000_0000—0x2001_FFFF,所以 RAM 大小是 128K,官方 DEMO 默认使用 HD 高密度系列,所以是 128K,本文是 CBT6,20K 的 RAM,则需要改成 0x2FFFB000:

计算方式:20K = 20*1024= 0x5000,0x2FFF_FFFF - (0x5000 - 1) = 0x2FFF_B000

2.3 Keil 工程 IAP 的相关设置
2.3.1 修改 Flash 地址



设置程序起始地址 0x800000 和大小 0x3000;



设置 Debug 工具烧写时 Flash 的起始地址 0x800000 和大小 0x3000;



2.3.2 使用自己的链接脚本
该项为选配,与上述配置二选一即可,如果仍然想使用自己的链接脚本,在 Option-->Linker 下将 Use Memort Layout from Target Dialog 选项勾选去掉,然后选择自己的链接脚本,如下图进行配置;



参考 ARMCC 的链接脚本编写方法,可以自己编写的 srt 文件,参考 ARM 分散加载技术;



如果用的 gcc 工具链,则要编写 gcc 的链接脚本 ld 文件;

2.3.3 下载固件
配置完成之后进行 Build,然后通过 SWD 的方式先下载固件,进行实验;

3 Application
3.1 启动流程
用户的 Application 需要在 IAP 启动完成后,才能正常执行;具体启动过程,比正常应用的启动多了一个 IAP 启动的过程,并最终通过 IAP 引导进入 Application;具体如下图所示;白色部分为 IAP; 灰色部分为 Application;



图中的 0x8000004+N+M 就等于 0x8003004,所以 Application 的启动地址需要进行修改,另外还有其他需要修改的地方,下面会详细指出。

3.2 IAP 中的引导部分
参考 IAP 中的引导程序;



可以发现的是 SP 的值为 0x8003000,指向栈顶,而 0x8003004 则为 ResetHander 的地址,系统会进行复位,然后开始 Application 正常启动流程;

3.3 关于 VTOR
VTOR 是向量表偏移量寄存器,它将用来告诉 CPU,从 Flash 的哪个地方去取向量地址,第一个要取的是 MSP 的值,然后就是复位向量地址 ResetHandler,如果这里设置错误,那么程序是无法正常启动的。下面是标准库中与其相关的代码片段;



所以 Application 中还需要修改 VECT_TAB_OFFSET 的值为 0x3000;

参考 M3 权威指南:
如果需要动态地更改向量表,则对于任何器件来说,向量表的起始处都必须包含以下向量:

堆栈指针(MSP)的初始值

复位向量

NMI

硬 fault 服务例程 后两者也是必需的,因为有可能在引导过程中发生这两种异常。可以在 SRAM 中开出一块空间用于存储向量表。在引导期间先填写好各向量,然后在引导完成后,就可以启用内存中的新向量表,从而实现向量可动态调整的能力。

3.4 Keil 工程设置
3.4.1 Flash 地址设置
与 IAP 工程设置类似,这里的 Application 是另一个 Keil 工程,同样的需要对 Flash 进行设置,如下图所示;



这里 Application 工程的 Flash 地址偏移了 0x3000,正是之前 Bootloader 所占用的 Flash 空间大小,这里和 VTOR 的设置也必须保持一致;



3.4.2 hex2bin
配置工程最终生成hex文件,如下图所示;



最终我们需要使用的是 bin 文件,所以,这里需要使用将 hex 文件转成 bin 文件,本文使用 hex2bin 的工具;配置工程运行之后执行转换文件的脚本;



create_bin.bat



copy_firmware.bat




最终在 Build 之后,可以在 Firmware 中找到 STM321-APP.bin,这个文件就是要用来 IAP 程序进行串口下载的程序。

3.4.3 用户程序串口下载测试
SecureCRT 软件支持 ymodem 协议,可以安装该软件,打开串口连接,设置 ymodem 的协议;打开菜单选项:Options--Session Options,配置如下;



为了便于测试,在 STM32F1-APP 进行串口发送以下信息,便于观察 APP 是否正常启动;

usart_printf(" rn STM32F1-APP start running*******************");

打开连接的串口,并根据终端提示进行操作,最终下载固件 STM32F1-APP 成功,并成功运行;



关键字:STM32  固件  IAP升级 引用地址:STM32固件IAP升级实战

上一篇:基于STM32芯片的γ能谱仪设计
下一篇:详解STM32三种低功耗模式

推荐阅读最新更新时间:2024-11-11 15:09

STM32待机模式学习笔记
STM32内置低功耗模式,在系统或电源复位之后,微控制器处于运行状态,当CPU不需要继续运行时,可以利用多种低功耗模式来节省功耗。例如,等待某个外部事件,用户需要更具最低电源功耗,最快速启动时间和可用的唤醒源等条件,选定一个最佳的低功耗模式。 STM32F10xxx有三种低功耗模式: ●睡眠模式(Cortex™-M3内核停止,所有外设包括Cortex-M3核心的外设,如NVIC、系统时 钟(SysTick)等仍在运行) 。 ●停止模式(所有的时钟都已停止) ●待机模式(1.8V电源关闭) 此外,在运行模式下,可以通过以下方式中的一种降低功耗: ●降低系统时钟 ●关闭APB和AHB总线上未被使用的外设时
[单片机]
<font color='red'>STM32</font>待机模式学习笔记
STM32单片机外部中断配置讲解
01 单片机外部中断简介 所谓外部中断,就是通过外部信号所引起的中断,如单片机引脚上的电平变化(高电平、低电平)、边沿变化(上升沿、下降沿)等。51单片机有5个中断源,其中有两个是外部中断,分别为INT0和INT1,INT0被分配在P3.2引脚,INT1被分配在P3.2引脚,也即是说如果使用51单片机的外部中断0,则必须将信号接在P3.2上,否则无效。 02 举例说明什么是中断 单片机在执行程序时有两种方式: 查询方式 中断方式 所谓查询方式就是单片机一遍一遍的扫描,查看所监视的目标有没有发生变化,是一种主动式的监视方法,用一个成语可以很客观的描述:守株待兔。 所谓中断方式就是单片机不主动去监视目标,而是目标主动通知单片机状态发
[单片机]
STM32嵌入式入门必看之文章
为什么要写这篇文章呢?这是一篇关于嵌入式入门的文章,因为我在进入嵌入式这个领域之前,也是遇到过非常多非常多的困难,所以呢,希望写下这篇文章,让大家看看少走弯路。 首先,我打算先列举一下大家问得最多的几个问题,然后我们一起由问题切入进行一些讨论。 问题1:我是学单片机好还是直接学STM32好??? 问题2:STM32如何才能快速入门? 问题3:为什么是STM32呢?为什么不是ARM9,ARM11呢? 下面我将逐个答复 首先问题1:我是单片机好还是直接学STM32好呢? 答:首先我们谈下目的,你学习的最终目的是能够开发产品或者成为项目经理;而目前市场上的单片机都基本用C语言了,用汇编进行开发的项目已经非常少了 在硬件接
[单片机]
STM32连接射频si4438模块
SI4438射频模块参数: 1、频率范围:425-525MHz 2、数字接收信号强度指示(RSSI) 3、64字节收发数据寄存器(FIFO) 4、跳频功能 等! 使用SI的WDS工具生成代码 1、 选择仿真模式 2、芯片选择si4438 B1模式 3、 Radio Configuration Application 4、 Select Application 1、 Select Project 选择Bidirectional packet ,双向通信模式 2、 Configure project 配置工程 Frequency and power: 频率和功率的设置, ba
[单片机]
STM32的重映射功能,以ZET6的TIM3_CH2通道从PA7->PB5为例
还需要先提的是,重映射有的可能只适用于与部分STM32芯片。 TIM3_CH2 默认是接在 PA7,可以通过重映射功能,把 TIM3_CH2映射到 PB5 上 重映射控制是由复用重映射和调试 IO 配置寄存器(AFIO_MAPR) 控制。 TIM3_REMAP 是由 这 2 个位控制的。TIM3_REMAP 重映射控制表如下: 默认条件下,TIM3_REMAP 为 00,是没有重映射的,所以 TIM3_CH1~TIM3_CH4 分别是接在 PA6、PA7、PB0 和 PB1 上的。 而我们想让 TIM3_CH2 映射到 PB5 上,则需要设置TIM3_REMAP =10,即部分重映射,这里需要注意,此时 TIM
[单片机]
<font color='red'>STM32</font>的重映射功能,以ZET6的TIM3_CH2通道从PA7->PB5为例
stm32中AMBA、AHB、APB总系介绍
AMBA(advanced microcontroller bus architecture )片上总线是由ARM公司推出的。 AMBA规范主要包括了:AHB(Advanced High-performance Bus)系统总线和 APB(Advanced Peripheral Bus) 外围总线。其中,AHB的相互连接采用了传统的带有主模块和从模块的共享总线,接口与互连功能分离,这对芯片上模块之间的互连具有重要意义。AMBA已不仅是一种总线,更是一种带有接口模块的互连体系。 基于AMBA的片上系统 一个典型的基于AMBA总线的系统框图如图3所示。 大多数挂在总线上的模块(包括处理器)只是单一属性的功能模块:主模块或者
[单片机]
<font color='red'>stm32</font>中AMBA、AHB、APB总系介绍
STM32_DAC之软件触发
stm32_DAC可以用来输出固定的电压值,有些时候需要按键可调输出的电压值。其中一种方法是使用外部中断EXTI9, 另外一种方法就是使用软件触发。 如果将DAC_InitTypeDef.DAC_Trigger设置为DAC_Trigger_None, 那么,不需要其他任何的触发源,直接使用DAC_SetChannelxData(),就可以设定输出电压的大小。如果使用了软件触发,那么,每次在使用DAC_SetChannelxData()修改输出电压后,还需要调用DAC_SoftwareTriggerCmd(),目的是使能软件触发。由于:软件触发是硬件在一个APB1时钟周期后自动关断的,于是,每次修改输出电压的值后,都要调用DAC
[单片机]
stm32的中断与事件
事件:是表示检测有一某件触发事件发生了。 中断:有某个事件发生并产生中断,并跳转到对应的中断处理程序中。 事件可以触发中断,也可以不触发 中断有可能被更优先的中断屏蔽,事件不会 事件本质上就是一个触发信号,是用来触发特定的外设模块或核心本身(唤醒). 事件只是一个触发信号(脉冲),而中断则是一个固定的电平信号
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved