STM32 - BOOTLOAD 基本配置

STM32 - BOOTLOAD 基本配置

这里简单介绍一下stm32 bootload的配置:

代码是通过stm32CubeMX生成,是最新的库,最主要的不一样的地方就是应用的跳转地址方式有所不同

假设单片机已经完整的获取到需要升级的 xxx.bin文件了,并写到带代码区了:

1、bootload代码部分

1.1、bootload代码部分
STM32 - BOOTLOAD 基本配置_第1张图片

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、
STM32 - BOOTLOAD 基本配置_第2张图片

2.3
system.stm32f1xx.c 设置跳转 #define VECT_TAB_OFFSET 0x00010000U

这个值需要更具2.2的跳转地址来设置
2.4、
STM32 - BOOTLOAD 基本配置_第3张图片

你可能感兴趣的:(Keil,STM32,BootLoad)