历史上的今天
返回首页

历史上的今天

今天是:2024年10月14日(星期一)

正在发生

2019年10月14日 | STM32F4 IAP升级 Bootloader程序+上位机下载程序源码

2019-10-14 来源:eefocus

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_USARTIAP_Download_USARTobjDebug中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的安装目录ARMBIN40文件夹下。通过下一步设置,可以在MDK编译成功之后,调用fromelf.exe (注意,MDK的安装路径,我的路径D:Keil_v5ARMARMCCbin),根据当前工程pbdr.axf,生成一个pbdr.bin文件。存放在OBJ文件夹下。在得到.bin文件后,我们只需要将这个bin文件通过串口传送给单片机,即可执行代码的下载以及升级。


五、下载验证:

将JTDO(PB4)与GND短接,上电后,LED灯D6开始闪烁,说明进入下载更新状态。

丝印见PB-20背面。

通过TTL转usb连上电脑端串口,打开IAP更新软件(打开应用程序IAP_Download_USARTIAP_Download_USARTobjDebug文件夹中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.         u8 t;

  25.         

  26.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2

  27.         delay_init(168);  //初始化延时函数

  28.         uart_init(115200);                //初始化串口波特率为115200

  29.         

  30.         LED_Init();                                        //初始化LED 

  31.         Button_Switch_DFU_Init();                //初始化跳转APP程序接口

  32.         

  33.         while(1)

  34.         {

  35.                         t++;

  36.                         delay_ms(10);

  37.                         if(t==30)

  38.                         {

  39.                                 LED0=!LED0;                  //D6闪烁 等待更新状态

  40.                                 t=0;

  41.                         }                        

  42.                         if(GET_BUTTON_STATE != 0x00)        //悬空进入更新进程

  43.                         {                                        

  44.                                 if(((*(vu32*)(FLASH_APP1_ADDR+4))&0xFF000000)==0x08000000)   //判断是否为0X08XXXXXX.

  45.                                 {         

  46.                                         USART_Cmd(USART2, DISABLE);                                //失能串口2 ,防止跳转到App程序时死机                                        

  47.                                         iap_load_app(FLASH_APP1_ADDR);                             //执行FLASH APP代码                

  48.                                 }else 

  49.                                 {

  50.                                         printf("非FLASH应用程序,无法执行!rn");           

  51.                                 }

  52.                         }

  53.                 }                        

  54. }



 


推荐阅读

史海拾趣

DMEL Inc公司的发展小趣事

为了提升产品质量和用户体验,DMEL Inc不断加大对生产过程的管控力度。公司引进了先进的生产设备和管理系统,建立了严格的质量检测体系。同时,DMEL Inc还加强了与供应商的合作,确保原材料的质量和供应的稳定性。这些措施的实施,使得DMEL Inc的产品质量得到了显著提升,赢得了消费者的信赖和好评。

Custom LeatherCraft Manufacturing Co Inc公司的发展小趣事

CLC非常重视客户服务。他们设立了专门的客户服务部门,为客户提供咨询、售后支持和定制服务。无论客户遇到什么问题或需求,CLC都会尽全力解决和满足。这种贴心的服务赢得了客户的信任和忠诚,也促进了品牌的持续发展。

Brand-Rex公司的发展小趣事

Brand-Rex的综合布线产品在国家重大项目上得到了广泛应用。例如,昌北国际机场作为中国干线机场,其总建筑面积达到96616平方米。该项目于2010年9月中标,2011年5月22日竣工并投入使用。整个系统均采用了Brand-Rex的CAT6PLUS全系列铜缆和光纤产品,充分展示了Brand-Rex在大型项目中的技术实力和产品可靠性。此外,Brand-Rex还参与了其他多个重要项目的布线工作,为国家基础设施的建设做出了积极贡献。

FOCI Fiber Optic Communications Inc公司的发展小趣事

除了在欧洲和中国市场取得显著成就外,Brand-Rex还积极拓展全球市场。其亚太区总部设在澳大利亚墨尔本市,大中国区办事处分别设在北京、上海及香港,东南亚办事处设在新加坡。这些布局使得Brand-Rex能够更好地服务全球客户,满足不同地区的市场需求。同时,Brand-Rex还积极寻求与全球知名企业的合作机会,通过战略合作和技术交流不断提升自身的竞争力和创新能力。

综上所述,Brand-Rex在电子行业中的发展是一个充满挑战和机遇的过程。凭借其卓越的技术、优质的产品和全球市场的布局,Brand-Rex不断壮大并成为行业内的佼佼者。未来,随着全球电子行业的不断发展,Brand-Rex有望继续保持其领先地位,并为全球客户提供更加优质的产品和服务。

Ememory Technology Inc公司的发展小趣事

在2022年,eMemory宣布加入英特尔晶圆代工服务加速器(Intel Foundry Services Accelerator)计划。这一合作标志着eMemory的技术得到了国际半导体巨头的认可。通过这一计划,eMemory为使用英特尔晶圆代工服务的客户提供全球领先的安全IP解决方案,进一步提升了其产品在全球市场的竞争力。

HB公司的发展小趣事

核心:Hartmann Codier GmbH一直将技术创新视为企业发展的核心动力。公司拥有一支专业的研发团队,致力于开关技术的研发与创新。通过不断的技术突破和产品升级,公司成功推出了一系列具有自主知识产权的高性能开关产品。

影响:这些创新产品不仅满足了市场对高品质、高可靠性开关的需求,还推动了整个电子行业的技术进步和产业升级。Hartmann Codier GmbH因此成为了行业内的技术引领者之一。

问答坊 | AI 解惑

一种新型雷达信号模拟器设计

摘 要:设计了一种新型雷达信号模拟器,能够提供多种特殊雷达信号,并且设置灵活方便,当用户需要时,可进行软件升级。介绍了该雷达信号模拟器的功能、特点、性能指标和研制方案,提供一种雷达信号产生的解决方法。…

查看全部问答>

基本功放问题,

我是一个才进入应用电子的学生,今年的学习是模拟电子技术,而老师的第一堂课就是这个图,要求我们今年做一个这个功放为成绩,但是我拿着这个电路是蒙的,撒意思都不懂(电容在里面干撒的...等等),麻烦大哥们给我解释这个电路(详细点)!!还有 ...…

查看全部问答>

【招聘】奥笙北京软件招聘信息(新增深圳软件技术支持职位)(论坛xdjm优先)

由于不能删帖,只能重新发一篇招聘信息了,注意哦,论坛的兄弟姐妹们优先。论坛的兄姐妹们有意可以直接发邮件给我:jandy.wang@orpheusys.com, 奥笙公司软件部门招聘信息(北京职位) 公司简介    奥笙时代科技(北京)有限公司(www. ...…

查看全部问答>

求助。。LED数码管型号问题

我想问下,下面图是电子脉搏计的图,那个四脚的LED接四个脚就可以控制0-9显示了,(仿真软件里有看到8脚和4脚的两种)但它是什么型号的LED呢?我现在想做实物要用到那种四脚的,可不知道那种到底有没有,上网查也没查到。。在下超级小白,希望各位 ...…

查看全部问答>

嵌入式安全芯片在电子产品版权保护领域的应用

PC软件的盗版一直是困扰软件行业发展的主要问题,同样,在嵌入式应用领域,随着近些年黑客技术和芯片解剖技术的发展,嵌入式系统所面临的攻击也越来越多,随之而生的防抄板技术也引起了产品设计者的重视。 有一款加密芯片ESPU0808是针对防抄设计的 ...…

查看全部问答>

WCE下的ToolTip

我最近研究WCE下的SDK编程的ToolTip的使用,发现同样的代码,VC可以正常,而EVC就是不能正常使用ToolTip,大家有任何关于WCE的ToolTip的代码不,发个来参考下。 贴上来或者发到我邮箱都可以:magic_kaoya@163.com…

查看全部问答>

不安全状态一定导致死锁状态吗?

不安全状态一定导致死锁状态吗? 不安全状态是指不存在任何一个安全序列,那最终结果将导致死锁吧, 有没可能当前处于不安全状态,有不会导致死锁呢? 我搜了搜,有的说一定会,一定说不一定,到底答案是什么?…

查看全部问答>

MSP430学习笔记之十一:RF2500库

我这几天又有点忙,不过我有空还是搞了下EZ430-RF2500 看了下库: 觉得不错唉: 首先这个库可以在任何MSP430单片机上实现,设立这个库的目地就是为了RF2500能很方便地同MSP430单片机接口 传一下我找的资料从资料来看这个库很好理解,只要修下定 ...…

查看全部问答>

求助[中断向量链接错误]

Error[e16]: Segment INTVEC (size: 0x10000 align: 0x1) is too long for segment definition. At least 0xffe0 more bytes needed. The pro××em occurred while processing the segment placement command "-Z(CODE)INTVEC=FFE0-FFFF", whe ...…

查看全部问答>