/**文末附有调试成功的程序链接**/
1.如果使用外部时钟,要用25M(使用8MBootLoader程序无法正常跳转至APP,原因不清楚)
BootLoader.c(函数内不要随便添加printf调试,会出错)
#include "bootloaer.h"
void jump_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*) jump_address);
jump_to_application();
}
}
BootLoader.h
#ifndef __BOOTLOADER_H_
#define __BOOTLOADER_H_
#include "main.h"
#include "stm32f4xx.h"
typedef void (*pFunction)(void);
/*!
* @brief 跳转到应用程序段
* 执行条件:无
* @param[in1] : 用户代码起始地址.
*
* @retval: 无
*/
#define FLASH_JUMP_ADDR (0x08008000)
void jump_to_app(uint32_t app_addr);
#endif
主函数添加跳转程序:
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin);
HAL_Delay(500);
printf("BOOTLOADER灯反转中!!\r\n");
count++;
if(count == 10)
{
printf("程序正在跳转APPZ中!!\r\n");
if(((FLASH_JUMP_ADDR+4)&0xFF000000)==0x08000000) //Judge if start at 0X08XXXXXX.
{
jump_to_app(FLASH_JUMP_ADDR); // Jump to APP
}
}
}
2.APP程序main()之后添加SCB->VTOR = 0x08008000;//该地址为APP的起始地址,地址不一样该值不一样
int main(void)
{
/* USER CODE BEGIN 1 */
SCB->VTOR = 0x08008000;
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
3.flash的分配,参照mcu的flash分配空间
例如:BootLoader的分配:第0个扇区占用16个字节
例如:APP的分配:第2个扇区占用16个字节
修改了配置后最好全编译一下
附上本人调试的示例程序,点击下载,注:该程序只是实现了bootloader跳转至app的基本操作。