1. 概念
IAP 的作用,网上其他资料已经有很多介绍了,这里放一个链接,不进行深入的介绍。本文的关注重点是Bootloader在跳转APP程序中出现的问题。
IAP的实现原理讲解以及中断向量表的偏移
2. 程序
本人主要做应用层的开发,所有Bootloader和APP程序使用的是STM32CubeMX工具生成代码后,然后进行修改。
2.1 Bootloader 程序
1. CubeMX 配置
步骤1:使用的芯片为STM32F407ZGT6
步骤2:选择时钟源(根据自己的板子进行选择)
步骤3:时钟配置
步骤4:项目配置
2. 代码(只介绍跳转函数)
完整代码
void IAP_ExecuteApp ( uint32_t ulAddr_App )
{
int i = 0;
pIapFun_TypeDef pJump2App;
if ( ( ( * ( __IO uint32_t * ) ulAddr_App ) & 0x2FFE0000 ) == 0x20000000 ) //@1 //检查栈顶地址是否合法.
{
HAL_SPI_MspDeInit(&hspi1); //@2
__HAL_RCC_GPIOB_CLK_DISABLE();
__HAL_RCC_GPIOG_CLK_DISABLE();
/* 设置所有时钟到默认状态,使用HSI时钟 */
HAL_RCC_DeInit(); //@3
__set_BASEPRI(0x20); //@4
__set_PRIMASK(1