IAP更新操作说明 第一个文件夹:bootloader程序 第二个文件夹:上位机下载程序源码 第三个文件夹:需要更新下载的代码 第四个文件:下载工具可执行文件 第五个文件:生成的pbdr.bin文件,用于更新。 一、硬件设计:升级下载程序采用外部硬件触发的方式。 PB-20M4硬件板 预留一个IO口处理代码下载及更新的功能。 功能简介:开机前若将 PB4接口与GND用杜邦线(改进硬件后可用跳帽)短接, LED6闪烁状态,即可进入固件下载功能程序,然后等待串口输入接收APP程序(.bin文件,生成方法见后面说明、分段接收每包2K数据,进行CRC校验),在接收完APP程序包后,断开PB4与地线的连接即可进入用户程序。 用到的资源: - 指示灯DS6
- 一根短接线,优化硬件后 可用跳帽
- 串口(共地)
图一 硬件指示图 图二 串口连接
二、软件设计总共涉及三部分代码:1、Bootloader;2、Flash App;3、上位机程序 1.Bootloader; 主函数进行任务判断,以及IAP更新和跳转等各项操作。串口中断中运行数据处理,数据检测,与上位机及握手校验等任务。Bootloader大小仅16K左右。 2、Flash App; 需要下载的程序,设置flash起始地址偏移量,由bootloader串口中断中写到flash中去。在初始化的时候执行跳转,运行该代码程序。 3、上位机发送校验程序 协议如下: /*--------------------------------------------------------------------- protocol-----|#|remainSend|#|length|data[]|CRC_check ---------------------------------------------------------------------*/ IAP不是一下子把所有BIN文件都接收过来写入FLASH,而是根据自己硬件的RAM空间,把BIN文件分成若干包,如每1K,2K等传送一次,传送当中加上帧头,帧尾,CRC,及总共多少包,及这是第几包等信息封装好的数据包,每接收一包写相应FLASH,下一包对应的FLASH地址++,如此完成固件更新。
三、上位机设计:打开应用程序IAP_Download_USART\IAP_Download_USART\obj\Debug中exe文件。 或直接打开附件中IAP_Download_USART.exe应用程序 运行界面 烧录过程: 开发环境如下: VS2013上用C#设计的简单的串口应用程序,基于.net4.5。 主要代码: 详见附件。
四、IAP说明IAP(In Application Programming)即应用编程,IAP是用户自己的程序在运行过程中对User Flash的部分区域进行烧写,后期可以方便的通过预留通信口对产品进行更新升级。在实现IAP功能时,需要在设计固件程序时编写两个项目的代码,第一个项目程序(bootloader程序)不执行正常的功能操作,而是只通过某种通信方式接收程序和数据,执行对第二部分代码的更新;第二个项目代码是功能代码(APP程序)。这两部分项目代码都同时烧录在User Flash中,在芯片上电后,首先执行第一个项目的代码,进行如下操作: - 检查是否需要对第二部分代码进行更新
- 如果不需要更新,则运行第二部分代码
- 若需要更新,执行更新操
- 更新完成,执行第二部分代码
Bootloader代码必须通过其他手段,如JTAG或ISP烧录;第二部分代码使用Bootloader程序IAP功能烧录,也可以通过JTAG烧录,以后需要更新时可以通过IAP代码进行烧录。 两部分代码存放在flash不同的地址位置,从最低地址区开始存放Bootloader,在其后指定位置存放APP程序。 STM32F4的内部闪存(flash)地址起始于0x08000000,一般情况下,程序文就从此地址开始写入。此外STM32是基于Cortex-M4 内核的微控制器,其内部通过一张“中断向量表”来响应中断,程序启动后,将首先从“中断向量表”取出复位中断向量执行复位中断程序完成启动,而这张“中断向量表”的起始地址是0x08000004,当中断来临,STM32F4 的内部硬件机制亦会自动将PC 指针定位到“中断向量表”处,并根据中断源取出对应的中断向量执行中断服务程序。 IAP程序满足的要求: - 新程序必须在IAP程序之后的某个偏移量为x 的地址开始;
- 必须将新程序的中断向量表相应的移动,移动的偏移量为x;
1.程序起始地址设置方法 打开pbdr_v110工程,点击Options for Target /Target选项卡,如图一所示: 图一 Flash app target 选项卡设置 默认条件下,图中IROM1的起始地址(Start)一般为0x08000000,大小1M(Size)为0x100000。而我们设置APP程序起始地址为0X08010000,即偏移量为0x10000(64K字节),留给用户flash空间(size)是1024k-64k=960K。偏移量是定义留给bootloader程序的地址空间大小。发布者可以定义bootloader空间的大小这里我定义的是64K,偏移量为0x200的倍数即可。(本设计的bootloader只有16K左右),这里留有余量,方便bootloader以后的升级修改。 1.中断向量表的偏移设置方法 在pbdr_v110版本中在mian.c中设置如下: 完成中断向量表偏移量的设置 MDK编译默认生成.hex文件,而升级程序需要生成.bin文件。MDK自带的格式转换工具fromelf.exe,来实现.axf文件到.bin文件的转换。该工具在MDK的安装目录\ARM\BIN40文件夹下。通过下一步设置,可以在MDK编译成功之后,调用fromelf.exe (注意,MDK的安装路径,我的路径D:\Keil_v5\ARM\ARMCC\bin),根据当前工程pbdr.axf,生成一个pbdr.bin文件。存放在OBJ文件夹下。在得到.bin文件后,我们只需要将这个bin文件通过串口传送给单片机,即可执行代码的下载以及升级。
五、下载验证:将JTDO(PB4)与GND短接,上电后,LED灯D6开始闪烁,说明进入下载更新状态。 丝印见PB-20背面。 通过TTL转usb连上电脑端串口,打开IAP更新软件(打开应用程序IAP_Download_USART\IAP_Download_USART\obj\Debug文件夹中IAP_Download_USART.exe文件或直接打开附件中IAP_Download_USART.exe应用程序),打开串口即可选则发送BIN文件进行代码下载。
关闭下载窗口,断开短接线即可运行更新后的程序。
stm32 IAP Bootloader V1.4源码:
- /*--------------------------------------------------------------------------------------
- @file: IAP_Serial
- @version: V1.0
- @author: Shanwu.5_W && Potter_lv
- @Introduction : Unlock flash load_app from serial
- --------------------------------------------------------------------------------------*/
- #include "sys.h"
- #include "delay.h"
- #include "usart.h"
- #include "led.h"
- #include "stmflash.h"
- #include "iap.h"
- void Button_Switch_DFU_Init(void) //按键升级初始化
- {
- GPIO_InitTypeDef GPIO_InitStructure;
- RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
- GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
- GPIO_Init(GPIOB, &GPIO_InitStructure);
- }
- #define GET_BUTTON_STATE GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_3)
- int main(void)
- {
- u8 t;
-
- NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2
- delay_init(168); //初始化延时函数
- uart_init(115200); //初始化串口波特率为115200
-
- LED_Init(); //初始化LED
- Button_Switch_DFU_Init(); //初始化跳转APP程序接口
-
- while(1)
- {
- t++;
- delay_ms(10);
- if(t==30)
- {
- LED0=!LED0; //D6闪烁 等待更新状态
- t=0;
- }
- if(GET_BUTTON_STATE != 0x00) //悬空进入更新进程
- {
- if(((*(vu32*)(FLASH_APP1_ADDR+4))&0xFF000000)==0x08000000) //判断是否为0X08XXXXXX.
- {
- USART_Cmd(USART2, DISABLE); //失能串口2 ,防止跳转到App程序时死机
- iap_load_app(FLASH_APP1_ADDR); //执行FLASH APP代码
- }else
- {
- printf("非FLASH应用程序,无法执行!\r\n");
- }
- }
- }
- }
复制代码
全部资料51hei下载地址:
IAP_release.rar
(2.24 MB, 下载次数: 1051)
|