前言
记录一下自己(刚入行嵌入式软件的小白)刚刚接触IAP升级的学习过程。
一、IAP是什么?
网上已经有很多大牛大神对IAP升级解释的非常详细,这里不过多赘述,直接上在使用过程中的一些心得,如有错误,欢迎指出。创作不易,转载请标记出处
二、工程信息
软件环境:IAR 8.2.22 两个工程:Bootloader(IAP) + APP 芯片型号:STM32F429IG(1M flash空间)
工作背景:项目需要升级,BootLoader的bin文件链接在APP工程的bin文件指定位置,工程指定0X08000000——0x0801FFFF给BootLoader预留空间。
三、配置细节
A. IAR工程配置如下:
1、在Config界面中将icf文件添加到工程里; 2、在Input界面中加入三点: ①symbols名对应icf文件中的,如工程中为BOOT; ②raw binary image为bootloader的bin文件镜像地址; ③symbol名和①保持一致,注意section的BOOT前有一个点,8字节对齐;
2.STM32F429IG.ICF配置文件如下:
代码如下:
define symbol __ICFEDIT_intvec_start__ = 0x08020000;
define symbol __ICFEDIT_region_BOOT_start = 0x08000000;
define symbol __ICFEDIT_region_BOOT_end__ = 0x0801FFFF;
define symbol __ICFEDIT_region_FLASH_start__ = 0x08020000;
define symbol __ICFEDIT_region_FLASH_end__ = 0x080FFFFF;
define symbol __ICFEDIT_region_FMC11_start__ = 0x0;
………………………………………………………………
中间部分不变
………………………………………………………………
define symbol __ICFEDIT_region_SRAM1_start__ = 0x20000000;
define symbol __ICFEDIT_region_SRAM1_end__ = 0x2001BFFF;
define symbol __ICFEDIT_region_SRAM2_start__ = 0x2001C000;
………………………………………………………………
中间部分不变
………………………………………………………………
define symbol __ICFEDIT_region_SDR2_start__ = 0x0;
define symbol __ICFEDIT_region_SDR2_end__ = 0x0;
define symbol __ICFEDIT_size_cstack__ = 0x2000;
define symbol __ICFEDIT_size_heap__ = 0x2000;
define memory mem with size = 4G;
define region BOOT_region = mem:[from __ICFEDIT_region_BOOT_start__ to __ICFEDIT_region_BOOT_end__ ];
define region FLASH_region = mem:[from __ICFEDIT_region_FLASH_start__ to __ICFEDIT_region_FLASH_end__];
………………………………………………………………
中间部分不变
………………………………………………………………
place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec };
place in BOOT_region { readonly section .BOOT };
place in FLASH_region { readonly };
place in PCARD_region { readonly section application_specific_ro };
place in CCRAM_region { block CSTACK, section .ccram };
place in SRAM_region { readwrite, block HEAP };
place in BKPR_region { section .backup_sram };
place in SDR_region { readwrite section application_specific_rw };
1、define symbol __ICFEDIT_region_BOOT_start = 0x08000000;
2、define symbol __ICFEDIT_region_BOOT_end__ = 0x0801FFFF;
3、define symbol __ICFEDIT_region_FLASH_start__ = 0x08020000;
4、define symbol __ICFEDIT_region_FLASH_end__ = 0x080FFFFF;
第1和第2行为添加的规定好BootLoader文件的起始地址;第3和第4行的flash的地址对应的向后修改;
5、define region BOOT_region = mem:[from __ICFEDIT_region_BOOT_start__ to __ICFEDIT_region_BOOT_end__ ];
第5行为新加的BootLoader在内存中的位置;
6、place in BOOT_region { readonly section .BOOT };
第6行作用是将BootLoader的bin文件放入内存中;定义为只读,对应的块为1、2、5所声明的空间位置。
所有配置正确的情况下,在重新编译工程得到的文件,如下图第一部分:全是00,是因为BootLoader的bin文件小于预留的空间,其余部分以00填充;工程文件从00020000h处开始,如图的第二部分。
调试错误总结
1、内部flash以整页方式擦除空间,需要开辟单独的空间保存升级包的信息与启动标志信息; 2、与上位机发送升级数据包所计算的校验方式要一致; 3、IAR软件所指的的默认中断向量表位置存放CCRAM(0x10002000)中,与网上资料有所差别,注意修改; 4、bootloader程序无需修改启动位置,因为已经在APP程序的空间预留出位置(0x08000000—0x080000400),且0x08000000起始位置只能放IAP或者APP程序,不可以存放别的信息; 5、bootloader程序跳转之前要把所用的外设关闭。
|