stm32cubemx IAP升级- App的制作
板卡:Nucleo-L412
平台:macbook pro
工具:vscode stm32cubemx stm32cubeProgramer cmake toolchain
整体思路
将App设置为从0x08007000地址启动,然后初始化一路串口用作接收上位机的升级数据,再初始化一路i ic设置为从机,用来接收上位记iic升级的数据。接收的数据按包写入Download分区,然后重启,由bootloader将数据copy到App区域,实现升级。
stm32cubemx配置
1、使能uart2并配置DMA
2、配置iic为从设备,并配置DMA
3、配置一个定时器,用来改变led的闪烁频率。
4、修改STM32L412RBTxP_FLASH.ld
/* Specify the memory areas */
MEMORY
{
RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 40K
RAM2 (xrw) : ORIGIN = 0x10000000, LENGTH = 8K
FLASH (rx) : ORIGIN = 0x8007000, LENGTH = 50K
}
编译出来的bin文件,用stm32cubeProgrammer按0x08007000地址烧录进去,配合之前的bootloader就可以跳转到App程序。
我们添加打印
void print_text_message(void)
{
#ifdef USER_APPLICATION_CODE
printf("|------------- Enter Application -------------|\r\n");
#endif
#ifdef USER_BOOTLOADER_CODE
printf("|------------- Enter BootLoader --------------|\r\n");
#endif
printf("\r\n");
printf("Version: %s %s\r\n",APPCATION_VERSION_DATE,APPCATION_VERSION_TIME);
printf("\r\n");
printf("|----------L412 flash toal size 128K----------|\r\n");
printf("\r\n");
printf("|============ flash pration table ============|\r\n");
printf("| name | offset | size |\r\n");
printf("|---------------------------------------------|\r\n");
printf("| bootloader | 0x08000000 | 0x00005000 20K | \r\n");
printf("| setting | 0x08005000 | 0x00002000 8K |\r\n");
printf("| App | 0x08007000 | 0x0000C800 50K |\r\n");
printf("| download | 0x08013800 | 0x0000C800 50K |\r\n");
printf("|=============================================|\r\n");
}
会打印出
printf(“|------------- Enter Application -------------|\r\n”);