目录
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了
-
修改中断向量表偏移(通常情况下需要设置,但是如果你不用中断,就可以不用设置)
-
在主程序中写入应用代码即可