STM32 - BOOTLOAD 基本配置
这里简单介绍一下stm32 bootload的配置:
代码是通过stm32CubeMX生成,是最新的库,最主要的不一样的地方就是应用的跳转地址方式有所不同
假设单片机已经完整的获取到需要升级的 xxx.bin文件了,并写到带代码区了:
1、bootload代码部分
1.1、bootload代码部分
1.2、
跳转到应用程序 最好放在外设(带有中断的外设)前跳转,(有网络的,放在网络初始化之前跳转)否则可能会调整不成功. 所以通常我在收到文件后先存在一个特定的空间,然后重启单片机,将文件写入到内部flash ,然后跳转
/**
* @brief 跳转到应用程序段.
* @retval AppxAddr 跳转地址
*/
void IAP_Jump_APP( uint32_t AppxAddress )
{
typedef void (*pFunction)(void);
pFunction Jump_To_Application;
uint32_t JumpAddress;
/* Check if valid stack address (RAM address) then jump to user application */
if(( (*(__IO uint32_t*)AppxAddress) & 0x2FFE0000 ) == 0x20000000 )
{
printf("\r\n Stack Address Valid. jump 0x%08X \r\n\r\n",(*(__IO uint32_t*)AppxAddress));
// 关闭所有中断
__set_PRIMASK(1);
HAL_SuspendTick();
/* Jump to user application */
JumpAddress = *(__IO uint32_t*) (AppxAddress + 4);
Jump_To_Application = (pFunction)JumpAddress;
/* Initialize user application's Stack Pointer */
__set_MSP(*(__IO uint32_t*) AppxAddress);
Jump_To_Application();
/* do nothing */
while(1){};
}
else{
printf("\r\n Stack Address Error Data = 0x%08X",(*(__IO uint32_t*)AppxAddress));
}
}
2.用户应用文件:
2.1、
int main(void)
{
/* USER CODE BEGIN 1 */
/* system.stm32f1xx.c 设置跳转 #define VECT_TAB_OFFSET 0x00010000U */
__set_PRIMASK(0);
/* USER CODE END 1 */
/* 省略 */
}
2.2、
2.3
system.stm32f1xx.c 设置跳转 #define VECT_TAB_OFFSET 0x00010000U
这个值需要更具2.2的跳转地址来设置
2.4、