找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 38821|回复: 65
打印 上一主题 下一主题
收起左侧

STM32F4 IAP升级 Bootloader程序+上位机下载程序源码

  [复制链接]
跳转到指定楼层
#
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源码:
  1. /*--------------------------------------------------------------------------------------
  2. @file:    IAP_Serial
  3. @version: V1.0
  4. @author:  Shanwu.5_W && Potter_lv
  5. @Introduction : Unlock flash   load_app from serial
  6. --------------------------------------------------------------------------------------*/
  7. #include "sys.h"
  8. #include "delay.h"  
  9. #include "usart.h"   
  10. #include "led.h"  
  11. #include "stmflash.h"
  12. #include "iap.h"  

  13. void Button_Switch_DFU_Init(void)    //按键升级初始化
  14. {
  15.   GPIO_InitTypeDef GPIO_InitStructure;
  16.   RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);

  17.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
  18.   GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
  19.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
  20.   GPIO_Init(GPIOB, &GPIO_InitStructure);
  21. }
  22. #define  GET_BUTTON_STATE   GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_3)

  23. int main(void)
  24. {
  25.         u8 t;
  26.         
  27.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2
  28.         delay_init(168);  //初始化延时函数
  29.         uart_init(115200);                //初始化串口波特率为115200
  30.         
  31.         LED_Init();                                        //初始化LED
  32.         Button_Switch_DFU_Init();                //初始化跳转APP程序接口
  33.         
  34.         while(1)
  35.         {
  36.                         t++;
  37.                         delay_ms(10);
  38.                         if(t==30)
  39.                         {
  40.                                 LED0=!LED0;                  //D6闪烁 等待更新状态
  41.                                 t=0;
  42.                         }                        
  43.                         if(GET_BUTTON_STATE != 0x00)        //悬空进入更新进程
  44.                         {                                       
  45.                                 if(((*(vu32*)(FLASH_APP1_ADDR+4))&0xFF000000)==0x08000000)   //判断是否为0X08XXXXXX.
  46.                                 {         
  47.                                         USART_Cmd(USART2, DISABLE);                                //失能串口2 ,防止跳转到App程序时死机                                       
  48.                                         iap_load_app(FLASH_APP1_ADDR);                             //执行FLASH APP代码               
  49.                                 }else
  50.                                 {
  51.                                         printf("非FLASH应用程序,无法执行!\r\n");           
  52.                                 }
  53.                         }
  54.                 }                        
  55. }
复制代码



全部资料51hei下载地址:
IAP_release.rar (2.24 MB, 下载次数: 1053)


评分

参与人数 3黑币 +85 收起 理由
ag26259 + 30 绝世好帖!
hzd530 + 5 很给力!
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏24 分享淘帖 顶2 踩
回复

使用道具 举报

65#
ID:71089 发表于 2025-7-2 08:44 | 只看该作者
蟹蟹,好东西,学习了!
回复

使用道具 举报

64#
ID:25423 发表于 2024-6-3 13:35 | 只看该作者
这个非常实用,谢谢分享原理
回复

使用道具 举报

63#
ID:255796 发表于 2024-3-6 10:18 | 只看该作者
移植到stm32f103上, 跳转时卡死, 不知道什么原因
回复

使用道具 举报

62#
ID:294886 发表于 2023-12-19 10:50 | 只看该作者
已经移植到自己的程序里,仔细看逻辑,方法就行。上位机用C#写的,是没有问题的。
app程序就是用自己的程序就可以了,在里面加一行跳转代码,并在工程里面设置以下地址就行,压缩包里面的说明写的很清楚。
回复

使用道具 举报

61#
ID:813186 发表于 2023-10-18 09:42 | 只看该作者
感谢分享,最近也是有产品要用到
回复

使用道具 举报

60#
ID:87000 发表于 2022-7-14 17:51 | 只看该作者
已经研究了一下,觉得可以移植到自己的开发中。 最好有下载激活的,不是使用IO激活 IAP功能就好了。
回复

使用道具 举报

59#
ID:603888 发表于 2022-3-27 21:04 | 只看该作者
正需要这方面的资料,雪中送碳了
回复

使用道具 举报

58#
ID:316308 发表于 2021-1-28 12:54 | 只看该作者
谢谢分享,刚好要用到IAP
回复

使用道具 举报

57#
ID:219315 发表于 2021-1-27 12:14 | 只看该作者
东西不完整,缺少APP应有程序部分的代码!!!
回复

使用道具 举报

56#
ID:118693 发表于 2020-12-20 00:24 | 只看该作者
压缩包里面的东西不完整
回复

使用道具 举报

55#
ID:525089 发表于 2020-12-9 14:11 | 只看该作者
正需要这方面的资料,看介绍还是比较详细的
回复

使用道具 举报

54#
ID:38060 发表于 2020-6-22 10:41 | 只看该作者
谢谢分享
回复

使用道具 举报

53#
ID:219315 发表于 2020-6-16 14:17 | 只看该作者
缺少APP程序部分,范例不全!!!
回复

使用道具 举报

52#
ID:297069 发表于 2020-5-2 14:40 | 只看该作者
谢谢分享
回复

使用道具 举报

51#
ID:310120 发表于 2020-4-26 10:36 | 只看该作者
收藏学习一下
回复

使用道具 举报

50#
ID:142699 发表于 2020-4-22 11:05 | 只看该作者
这个代码不完整啊,只有IAP的,APP的没有在压缩包里面啊,应该不能用才对
回复

使用道具 举报

49#
ID:707515 发表于 2020-3-13 10:51 | 只看该作者
先收藏一下,有黑币了再来下载
回复

使用道具 举报

48#
ID:496117 发表于 2020-3-4 18:33 | 只看该作者
很实用的功能,我最近打算把这个模块增加到我们仪器里面
回复

使用道具 举报

47#
ID:478812 发表于 2020-3-2 11:18 | 只看该作者
谢谢分享
回复

使用道具 举报

46#
ID:323077 发表于 2020-2-24 22:28 | 只看该作者
十分感谢!
回复

使用道具 举报

45#
ID:223752 发表于 2020-2-22 10:48 | 只看该作者
找了很久了,正找这个呢
回复

使用道具 举报

44#
ID:198045 发表于 2020-2-16 13:01 | 只看该作者

谢谢分享。
回复

使用道具 举报

43#
ID:688931 发表于 2020-1-31 11:22 | 只看该作者
请问楼主你使用的通讯协议是什么?自定义的还是使用通用的协议?
回复

使用道具 举报

42#
ID:400390 发表于 2020-1-6 16:52 | 只看该作者
非常感谢分享,让我在这个冬天非常温暖
回复

使用道具 举报

41#
ID:427398 发表于 2019-12-30 09:48 | 只看该作者
大神,板子有链接没?
回复

使用道具 举报

40#
ID:671742 发表于 2019-12-23 20:24 | 只看该作者
正需要,谢谢楼主
回复

使用道具 举报

39#
ID:668475 发表于 2019-12-19 16:17 | 只看该作者
感谢分享  找了很久
回复

使用道具 举报

38#
ID:529603 发表于 2019-12-16 20:56 | 只看该作者
看起来不错,就是没积分下载。
回复

使用道具 举报

37#
ID:58625 发表于 2019-11-26 15:37 | 只看该作者
谢谢。下载学习下
回复

使用道具 举报

36#
ID:142699 发表于 2019-11-22 11:37 | 只看该作者
这个资料非常棒!
回复

使用道具 举报

35#
ID:437137 发表于 2019-10-14 13:31 | 只看该作者
没有第三个文件夹
回复

使用道具 举报

34#
ID:486510 发表于 2019-10-13 18:39 | 只看该作者
谢谢 大佬分享
回复

使用道具 举报

33#
ID:486510 发表于 2019-10-13 18:38 | 只看该作者
谢谢大佬分享
回复

使用道具 举报

32#
ID:621745 发表于 2019-10-10 15:13 | 只看该作者
谢谢分享
回复

使用道具 举报

31#
ID:620021 发表于 2019-10-8 22:39 | 只看该作者
学习下~
回复

使用道具 举报

30#
ID:618619 发表于 2019-10-4 14:21 | 只看该作者
如果需求是 这样子如何实现:
stm32f4单片机一检测到某个触发条件,即擦除相关程序区域,而不是升级它。
回复

使用道具 举报

29#
ID:188815 发表于 2019-9-26 20:27 | 只看该作者
正好需要,谢谢大神!雪中送炭!
回复

使用道具 举报

28#
ID:531721 发表于 2019-9-12 17:38 | 只看该作者
测试时发现,只要点击连接,单片机就会卡死,断开连接后单片机又恢复正常
回复

使用道具 举报

27#
ID:531721 发表于 2019-9-12 10:20 | 只看该作者
感谢分享,研究一下分包粘包
回复

使用道具 举报

26#
ID:123058 发表于 2019-8-20 15:38 | 只看该作者
谢谢 学习一下
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表