目录
1、 创建一个IAP_Bootloader 工程
-
利用stm32cubeide创建一个IAP_Bootloader工程,配置串口1和sw,LED只是为了显示状态,可以不用配置。保存生成工程。

-
点击STM32F401CCUX_FLASH.ld文件,修改里面的flash长度,就是说bootloader的代码存放在0x8000000~0x8008000这里。

-
main.c 文件中加入以下代码:
//重定向printf #ifdef __GNUC__ #define PUTCHAR_PROTOTYPE int __io_putchar(int ch) #else #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f) #endif PUTCHAR_PROTOTYPE { HAL_UART_Transmit(&huart1, (uint8_t*) &ch, 1, 0xffff); return ch; } //跳转到用户app #define FLASH_APP_ADDR 0x8008000 typedef void (*pFunction)(void); void go2APP(void) { uint32_t JumpAddress; pFunction Jump_To_Application; printf("BOOTLOADER Start\n"); //Check if (((*(__IO uint32_t*) FLASH_APP_ADDR) & 0x2FFE0000) == 0x20000000) { printf("APP Start...\n"); HAL_Delay(100); // Jump to user application // JumpAddress = *(__IO uint32_t*) (FLASH_APP_ADDR + 4); Jump_To_Application = (pFunction) JumpAddress; // Initialize user application's Stack Pointer // __set_MSP(*(__IO uint32_t*) FLASH_APP_ADDR); Jump_To_Application(); } else { printf("No APP found!!!\n"); } } -
主程序中加入:
/* USER CODE BEGIN 2 */ printf("this is bootloader\r\n"); go2APP(); /* USER CODE END 2 */ -
烧录程序即可,如果在0x8008000位置之后存放的有用户代码,串口会打印出app start...,如果没有,串口会打印出 No APP found!!!
2、创建一个user_APP工程
-
和创建IAP_Bootloader 工程的第1步骤一样
-
点击STM32F401CCUX_FLASH.ld文件,修改起始位置为0x8008000,在此之前的区域是bootloader的代码区,长度修改为224k,因为我这里的flash总大小是256k,分给了bootloader 32k,用户程序就只剩下224k了

-
修改中断向量表偏移(通常情况下需要设置,但是如果你不用中断,就可以不用设置)

-
在主程序中写入应用代码即可
本文详细介绍了如何使用STM32CubeIDE创建IAP_Bootloader及User_APP工程,包括配置串口、修改flash长度、实现代码跳转等功能,帮助读者掌握STM32的分区启动技术。
1193

被折叠的 条评论
为什么被折叠?



