关于使用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原理分析、教程、资料整理