目录
序言
什么是IAP升级?
STM32代码启动介绍
IAP设计思路
bootloader设计
stm32内部flash分区
移植U盘底层源码
总结
序言
对于嵌入式软件开发来说:U盘离线更新固件是一种常用的更新手段。本篇文章讲述了如何通过U盘更新固件。
什么是IAP升级?
IAP,即In Application Programming,IAP是用户编写的程序运行在用户自定义的Flash部分区域进行烧写。
STM32代码启动介绍
设计IAP,首先需要对MCU的代码启动过程有个简单的认识。stm32的代码启动如下:
1. 通过BOOT1和BOOT0确定代码区域首地址,具体看用户手册有关“自举配置”这一章节;
2. 启动文件源码分析,具体的分析过程见:()
3. stm32启动步骤如下:
1. 上电复位后,从0x00000000地址取出栈顶地址赋值给MSP寄存器,即MSP=__initial_sp;
2. 从0x00000004地址取出复位程序地址赋值给PC寄存器,即PC = Reset_Handler;
3. 跳转C库到__main函数初始堆栈和代码重定位(初始化RW和ZI段),最后跳转到main函数执行应用程序。
IAP设计思路
设计思路大体分为bootloader和APP分开设计,bootloader用于检查APP区代码是否需要更新以及跳转到APP执行APP代码的功能。
bootloader设计
1. 确定bootloader和APP在flash中的首地址;
2. 首先检查是否要升级
1. 是,执行升级固件代码;
2. 否,直接跳转到APP。
注意:跳转之前要关闭所有中断,否则进入APP会出现各种问题。具体的流程图如下:
stm32内部flash分区
本篇文章以stm32f407ZGTx为例,其共有12个扇区,具体分配情况如下:
- 0-3:每扇区的大小16k;
- 4:扇区大小64k;
- 5-11:每扇区大小128k。
- 在操作内部flash时,要注意先擦除然后再4字节对齐写入否则会出错。以下所示是内部flash设计分区的情况:
stm32分区步骤说明:
- bootloader引导区:用于升级固件,引导APP跳转;
- APP区:用于存放用户功能应用代码;
- 用户参数区:用于存储用户一些参数。
移植U盘底层源码
- 下载ST官方有关U盘的底层源码:STM32_USB-Host-Device_Lib_V2.1.0(正点原子获取);
- 添加USB_Driver驱动文件,具体如下图1所示;
- 添加USB_Host大容量驱动文件,具体如下图2所示;
- 添加USB_APP使用文件,具体如下图3所示;
- MDK中c/c++添加USE_USB_OTG_FS,USE_EMBEDDED_PHY;
- 编写OTG_FS_IRQHandler中断。
图1
图2
图3
总结
上述的文章主要使用到了以下知识点:
- Flash读写操作
- U盘移植使用
通过本次总结可以加深对IAP升级的理解,为以后其他方式IAP打下良好基础。在此希望本篇文章对大家有帮助。