关于使用stm32f103进行IAP功能调测试(上)

一、目的

为了更好了解IAP工作原理。
开发环境:keil 5
开发板:Stm32f103最小系统
烧录器:st-link
串口调试器 : usb-ttl (烧写flash和信息打印)

1.1 IAP原理

简单说就是实现软件升级功能,程序由bootloader(完成软件升级处理)和app(完成业务逻辑/功能实现)两个程序组成。具体原理说明可 参考博文:【IAP】STM32和GD32的IAP原理分析、教程、资料整理
在这里插入图片描述

二、bootloader + app 工程

2、创建工作空间(根据自己需要添加)

Project -> New Multi-Project Workspace…
在这里插入图片描述
选择创建好的工程文件,如果没有可先创建工程后再添加。
在这里插入图片描述

2.1、创建app 工程

为了方便测试,使用了已有的LED闪烁工程。

主函数部分内容
#define APPLICATION_ADDR  (FLASH_BASE |  0x2000)
//=============================================================================
//文件名称:main
//功能概要:主函数
//参数说明:无
//函数返回:int
//=============================================================================
int main(void)
{ 
    SCB->VTOR = APPLICATION_ADDR; //必须
    
	GPIO_Configuration();
     
    while (1)
	{
        PCout(13)=0; 
        Delay(0xfffff); 	
        PCout(13)=1;
        Delay(0xfffff);		
    }
}

2.2、创建bootloader工程

为了方便测试,在已有的LED闪烁工程进行修改。

2.2.1、bootloader引导程序(实现跳转app)
主函数部分内容
 
#define APPLICATION_ADDR							(0x08002000)

typedef  void (*pFunction)(void); 

/*!
* @brief 跳转到应用程序段
*        执行条件:无
* @param[in1] : 用户代码起始地址.
*
* @retval: 无
*/
void bootloader_to_app(uint32_t app_addr)
{ 
    
    pFunction jump_to_application;
    uint32_t jump_address;
   
    /* Check if valid stack address (RAM address) then jump to user application */
    if (((*(__IO uint32_t*)app_addr) & 0x2FFE0000 ) == 0x20000000)
    {
     /* Jump to user application */
      jump_address = *(__IO uint32_t*) (app_addr + 4);   //     程序复位地址  
    
      jump_to_application = (pFunction) jump_address;
     
      /* Initialize user application's Stack Pointer */
      __set_MSP(*(__IO uint32_t*) app_addr);
  
      jump_to_application();//跳到app程序
    }    
    
} 
//=============================================================================
//文件名称:main
//功能概要:主函数
//参数说明:无
//函数返回:int
//=============================================================================
int main(void)
{
    
    int i =0 ; 
    
	GPIO_Configuration(); 
    
    if(((APPLICATION_ADDR+4)&0xFF000000)==0x08000000) //Judge if start at 0X08XXXXXX.
	{    
        
        while (++i) //测试led闪烁
        {
            PCout(13)=0; 
            Delay(0xfffff); 	
            PCout(13)=1;
            Delay(0xfffff); 
            
            if(i > 10) 
            {
                i = 0;
                break ;			
            }
        }
        
        PCout(13)=0;  
        
		bootloader_to_app(APPLICATION_ADDR); // Jump to  APP
        
         PCout(13)=1;  
	} 

}

2.3、bootloader跳转app测试

实验现象:当程序运行时,先进入bootloader程序运行一段时间(LED灯闪烁),LED闪烁结束后,进入跳转app程序,app正常运行,LED闪烁功能会继续。如果出现LED常灭/常亮情况,说明程序出现异常,需要排查问题了。

1.3.1 bootloader 和 app 的内存地址设置

bootloader 内存起始地址0x80000000 不需要修改,内存大小设置0x2000 (8K) 。
在这里插入图片描述
app内存起始地址设置bootloader的终地址0x80002000 ,内存大小设置0x6000 (24K) 。(后面添加升级功能时可能会改变,根据自身情况设置)
在这里插入图片描述

2.3.2 合并bootloader 和app 烧录文件hex 并烧录

各编译生成hex文件,将bootloader和app 的hex文件合并成一个hex文件。
操作如下图:
在这里插入图片描述

2.4 软升级:串口接收bin文件和烧写flash(待续)

三、小结

1.boot loader 的引导程序,因为赋值错误,导致两个程序烧录后出现死机。进行仿真发现出现进入了该函数。问题追踪:参考STM32硬件错误HardFault_Handler的处理方法
在这里插入图片描述
2.注意bootloader和app 的内存分配不要出现冲突。

本次实操经验:了解IAP基本原理、bootloader与app的地址分配和调试方法。

代码:stm32f103c8t6_bootloaderTOapp

参考链接:
[1]. IAP技术原理
[2].STM32硬件错误HardFault_Handler的处理方法
[3].【IAP】STM32和GD32的IAP原理分析、教程、资料整理

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

晓啸猿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值