STM32F103RB UART IAP

本文介绍了如何在STM32F103RB微控制器上实现UART接口的In-Application Programming (IAP)。内容涵盖IAP的概念、Bootloader和UserApp的内存空间划分、Boot程序的运行流程、中断向量处理,以及Bootloader和UserApp程序的具体实现细节。通过UART IAP,可以实现不断电情况下更新Firmware。
摘要由CSDN通过智能技术生成

1. IAP介绍

在开发MCU应用时,很多时候都希望能够做到不断电就能升级Firmware,这样就能快速更新新功能或修复bug。这个时候就需要IAP功能,IAP是In Application Programming的首字母缩写,IAP是用户自己的程序在运行过程中对User Flash的部分区域进行烧写,IAP需要MCU能擦写内部Flash,并且具备软件复位功能。IAP的通信方式有很多选择,UART、SPI、IIC、USB、CAN等通信方式都可以选择,常用的可以选择UART、USB,如果需要远程升级,可以再搭配个2.4G、蓝牙等无线模块来实现OTA。这里将以ST的 NUCLEO-F103RB 开发板来实验下UART IAP的功能,开发自己的Bootloader程序。

STM32F103RB内置有官方的Bootloader程序,可以通过USART来升级,但这个Bootloader程序是无法修改的,而且进入的方式是上电时通过Boot Pin的电平来选择,不是特别方便。所以一般都会再自己实现一个Bootloader。
在这里插入图片描述

2. IAP说明

STM32F103RB内置有128K Flash Rom,可以划分为Bootloader和UserApp两个区域,Bootloader区域不会被更新,其功能是用来更新UserApp区域的,UserApp是真正的功能程序区域,用于写正常的用户程序。
Bootloader功能主要如下:
1)检查是否需要对UserApp区域进行更新
2)如果不需要更新则跳转到UserApp区域执行
3)执行更新操作,通过UART来接收数据
4)更新完成跳转到UserApp区域执行

Flash ROM空间划分

在这里插入图片描述
103RB 128K Rom空间被划分为Bootloader和UserApp两个区域,Bootloader使用0x08000000-0x08001FFF共8K的空间大小,UserApp使用0x08002000-0x0801FFFF 120K空间大小,并在最后的0x0801FFFC位置预留一个4byte空间,用来定义IAP Flag,具体值为 0x33CC55AA

Boot程序运行流程

  • 上电复位时流程
    在这里插入图片描述
    103RB正常上电是从0x08000000地址上取栈值,从0x08000004取复位向量地址的。所以上电时是从Bootloader区域开始运行。Bootloader里开始就会判断0x0801FFFC的IAP Flag值是否正确,当为0x33CC55AA 时认为UserApp程序正常,就会跳转到UserApp起始地址(0x08002004)运行,跑正常的用户程序,当IAP Flag值不为0x33CC55AA时,认为UserApp不正常,会停留在Bootloader中执行,接下来可执行UART IAP操作。

  • Bootloader UART IAP流程
    在这里插入图片描述
    Bootloader IAP Handler主要功能就是接收和解析Uart数据、擦写UserApp Rom。Uart数据的格式和大小,具体可以再定个私有的协议,配合上位机来通信,上述只是给个参考。

中断向量处理

由于IAP之架构会将MCU ROM分成两个区域运行,并相互不能干扰,但中断向量是有固定的入口,不做任何的话,中断向量都是在Bootloader区域中,此时UserApp的中断会无法正确执行,导致系统运行出错。所以需要对中断向量进行相应处理。

  • 中断向量重定位
    对于STM32F103RB来说,有相关寄存器可以设置中断向量为新的地址,所以在UserApp工程里SystemInit函数中设置VECT_TAB_OFFSET为UserApp偏移的地址,这样中断向量就会对应到UserApp的对应地址上。
// system_stm32f1xx.c -- SystemInit()
#ifdef VECT_TAB_SRAM
    SCB->VTOR = SRAM_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAM. */
#else
    SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH. */
#endif

对于像STM32F0 M0架构的MCU,没有中断向量重定向的寄存器的相关设置,但可以设置系统从SRAM来运行,
所以有一种巧妙的方法来到达向量重定义的目的,把UserApp前面中断向量相关的ROM复制到SRAM的开头来,
这样UserApp的中断也能得到正确响应。
在这里插入图片描述

  • 直接进行调用
    像M0架构的MCU,如不想改动太多,可以选择判断IAP Flag并调用相应的函数。当中断产生时,会运行Bootloader里的中断向量处理函数,在这里面再进行判断,调用相应的处理函数。下面为SysTick_Handler的处理例程,

    1. 当IAP Flag正确时,通过地址调用UserApp中的处理函数
    2. 不正确时,运行Bootloader里的处理函数

__irq void SysTick_Handler(void)
{
   
	if((*((uint32_t*)0x0801FFFC)) == 0x33CC55AA)
	{
   
		((void(*)(void))*(uint32_t *)(APP_START_ADDRESS + SYSTICK_IRQ_OFFSET))();	//UserApp Interrupt handler
	}		
	else																														
	{
   
		Boot_SysTick_Handler();			//Bootloader In
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值