如何使用STM32F4的BootLoader和APP程序

一.概念扫盲

1.IAP

IAPIn Application Programming的首字母缩写,IAP是用户自己的程序在运行过程中对User Flash的部分区域进行烧写,目的是为了在产品发布后可以方便地通过预留的通信口对产品中的固件程序进行更新升级。

通常在用户需要实现IAP功能时,即用户程序运行中作自身的更新操作,需要在设计固件程序时编写两个项目代码,第一个项目程序不执行正常的功能操作,而只是通过某种通信管道(USBUSART)接收程序或数据,执行对第二部分代码的更新;第二个项目代码才是真正的功能代码

2.Bootloader

在上述IAP的概念中,bootloader就是其第一个项目程序。bootloader主要实现的功能:从串口、USB等媒介接收数据;存储和搬运数据;程序跳转等功能。

3.App程序

IAP概念中,对第二个项目代码的一种称呼


Stm32的bootloader和App的编写注意事项

1、 怎么分配bootloader和app的地址空间

2、 怎么得到升级软件数据并写入flash

3、 怎么从bootloader跳转到app

4、 怎么设置App的中断向量

5、 App中怎么生成bin文件

6、程序执行的流程


1、怎么分配bootloader和app的地址空间


图1 STM32 Flash分区情况

(1)分配地址

我使用的是STM32F407,它的Flash的大小是512K,所以我把它分成如下所示:

0x08000000 ---0x08010000分配给bootloader使用,大小是64k

0x08010000----0x0801F000分配给第一个APP的使用,大小是124k

0x0801FC00----0x0801FFFF 分配给user_flag和其它标志使用

(2)在keil中设置ROM的大小

A、BootLoader中ROM大小的设置


B、App中设置ROM的大小



2、怎么得到升级软件数据并写入flash

在我的程序是通过串口接收数据,然后调用iap_write_appbin(u32 appxaddr,u8 *appbuf,u32 appsize)将接收到的APP程序存放到STM32F4的FLASH中,其中appxaddr为应用程序的起始地址,appbuf是应用程序CODE,appsize是应用程序大小(字节),代码如下:

[cpp]  view plain  copy
  1. #define FLASH_APP1_ADDR     0x08010000      //第一个应用程序起始地址  

[cpp]  view plain  copy
  1. if(applenth)//串口接收数据长度  
  2.             {  
  3.                 printf("开始更新固件...\r\n");      
  4.                 LCD_ShowString(30,210,200,16,16,"Copying APP2FLASH...");  
  5.                 if(((*(vu32*)(0X20001000+4))&0xFF000000)==0x08000000)//判断是否为0X08XXXXXX.  
  6.                 {      
  7.                     iap_write_appbin(FLASH_APP1_ADDR,USART_RX_BUF,applenth);//更新FLASH代码     
  8.                     LCD_ShowString(30,210,200,16,16,"Copy APP Successed!!");  
  9.                     printf("固件更新完成!\r\n");    
  10.                 }else   
  11.                 {  
  12.                     LCD_ShowString(30,210,200,16,16,"Illegal FLASH APP!  ");         
  13.                     printf("非FLASH应用程序!\r\n");  
  14.                 }  
  15.             }else   
  16.             {  
  17.                 printf("没有可以更新的固件!\r\n");  
  18.                 LCD_ShowString(30,210,200,16,16,"No APP!");  
  19.             }  
  20.             clearflag=7;//标志更新了显示,并且设置7*300ms后清除显示    

[cpp]  view plain  copy
  1. void iap_write_appbin(u32 appxaddr,u8 *appbuf,u32 appsize)  
  2. {  
  3.     u32 t;  
  4.     u16 i=0;  
  5.     u32 temp;  
  6.     u32 fwaddr=appxaddr;//当前写入的地址  
  7.     u8 *dfu=appbuf;  
  8.     for(t=0;t<appsize;t+=4)  
  9.     {                            
  10.         temp=(u32)dfu[3]<<24;     
  11.         temp|=(u32)dfu[2]<<16;      
  12.         temp|=(u32)dfu[1]<<8;  
  13.         temp|=(u32)dfu[0];      
  14.         dfu+=4;//偏移4个字节  
  15.         iapbuf[i++]=temp;         
  16.         if(i==512)  
  17.         {  
  18.             i=0;   
  19.             STMFLASH_Write(fwaddr,iapbuf,512);  
  20.             fwaddr+=2048;//偏移2048  512*4=2048  
  21.         }  
  22.     }   
  23.     if(i)STMFLASH_Write(fwaddr,iapbuf,i);//将最后的一些内容字节写进去.    
  24. }  


3、怎么从bootloader跳转到app

[cpp]  view plain  copy
  1. //跳转到应用程序段  
  2. //appxaddr:用户代码起始地址.  
  3. void iap_load_app(u32 appxaddr)  
  4. {  
  5.     if(((*(vu32*)appxaddr)&0x2FFE0000)==0x20000000) //检查栈顶地址是否合法.  
  6.     {   
  7.         jump2app=(iapfun)*(vu32*)(appxaddr+4);      //用户代码区第二个字为程序开始地址(复位地址)          
  8.         MSR_MSP(*(vu32*)appxaddr);                  //初始化APP堆栈指针(用户代码区的第一个字用于存放栈顶地址)  
  9.         jump2app();                                 //跳转到APP.  
  10.     }  
  11. }         
4、 怎么设置App的中断向量

SCB->VTOR = FLASH_BASE | 0x10000;/*中断向量表定位在FLASH_BASE(0X08000000)+0x10000处*/

  因为APP的起始地址为(0X08000000)+0x10000


5、 App中怎么生成bin文件

我们通过在 MDK 点击 Options for TargetUser 选项卡,在 After Build/Rebuild 栏,勾选 Run #1,并写入:D:\tools\mdk5.14\ARM\ARMCC\bin\fromelf.exe --bin -o ..\OBJ\RTC.bin..\OBJ\RTC.axf ,如图所示:

6、程序执行的流程


总结:

Bootloader里面主要是

1、设置bootloader和app的空间

2、接收编译好的app的bin文件,写入flash

3、实现跳转

App里面主要修改的地方是

1、 ROM起始地址和分配的空间大小

2、 重定向中断向量

3、 生成bin文件


  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
STM32F4Bootloader是一种启动引导程序,用于在STM32F4微控制器上进行固件升级和启动。STM32F4Bootloader分为原厂Bootloader和自定义Bootloader两种类型。 原厂Bootloader是由STM原厂提供的引导程序,一般用于通过串口、CAN或USB等接口进行固件的自举升级。在STM32F4中,原厂Bootloader存储在内部存储器的0x1fff 0000 - 0x1fff 77ff地址范围内,大小为30K。通过设置boot引脚,即将boot0设置为1,boot1设置为0,可以进入原厂Bootloader。然而,使用原厂Bootloader进行固件升级会覆盖原有的程序。 自定义Bootloader是用户根据需要自行开发的引导程序,用于制作IAP(In-Application Programming),实现跳转到不同的flash区域执行代码。自定义Bootloader可以满足不同的应用需求。 在STM32F4中,通常需要更改烧写首地址来加载Bootloader1、Bootloader2、APP1和APP2四份代码。可以通过在APP1中将Bootloader1、flag和Bootloader2以boot数组表的形式存在,从而简化固件的烧写过程。例如,可以使用bootflag数组存储升级运行标志和变量表偏移长度,使用bootloader1数组存储Bootloader1的代码。通过这种方式,可以在APP1中通过引用数组的方式来加载和执行Bootloader1的代码。 综上所述,stm32F4Bootloader是一种用于固件升级和启动的引导程序,可以分为原厂Bootloader和自定义Bootloader两种类型,具体使用和实现方式可以参考STM32F407的中文参考手册。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [STM32F4单片机bootloader及在线升级IAP基本原理](https://blog.csdn.net/weixin_43058521/article/details/125355343)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值