IAP、ISP、ICP解析和Cortex-M3内核内存划分(自用)
Bin文件和hex文件
bin 是代码的「纯二进制镜像」,和 Flash 里的内容一模一样,体积小但没地址信息,适合直接下载到Flash或者APP区;hex文件是包括了地址信息和代码内容的文本需要先解析提取数据和地址才能用
Ymodem协议
这个协议是在使用串口进行IAP升级时,专门保证串口发送信息的安全与稳定的,因为其他升级方式(USB、WIFI、蓝牙、CAN)都有严格的收发格式和稳定收发数据的方法,串口没有那么多,比较不稳定,容易丢数据,所以需要Ymodem协议帮助。
Define设置
这个Define,可以理解成在整个文件夹Define了一个宏定义,如果使用IAP升级时必须加上USER_VECT_TAB_ADDRESS,才能修改下载代码时重定向中断向量表的位置到APP区,因为单片机默认的都是Flash最开始(0x0800 0000,这是bootloader区起始地址),得改到0x0800 8000

__set_PRIMASK (0)是什么
这个是个函数,用于打开或者关闭全局中断,要用到是因为bootloader在跳转到APP区时,会关闭全局中断,防止突然触发中断打断跳转导致单片机崩溃、跑飞,所以需要在跳转结束后我们再手动打开全局中断。我们用不到IAP时,我们不需要考虑这个,因为在HAL_Init()时已经默认帮我们打开了。
地址划分和相关知识
0x0000 0000只是一个虚拟地址,单片机一上电时,主栈指针(MSP)地址和复位向量(Reset Handler)地址就在0x0000 0000,根据BOOT0和BOOT1的不同,主栈指针(MSP)地址和复位向量(Reset Handler)地址 会被映射到不同的启动地址,从而改变单片机的运行模式。
|
存储区域 |
正式名称 |
起始地址 |
核心作用 |
|
ROM 区 |
系统存储器 |
0x1FFFF000 |
存 ST 官方的 ISP Bootloader,用来串口下载程序 |
|
Flash 区 |
主 Flash |
0x08000000 |
存我们自己写的 Bootloader、APP 代码,掉电也不会丢,是程序的 “硬盘” |
|
SRAM 区 |
SRAM |
0x20000000 |
程序运行时的 “内存”,存栈、堆、全局变量、临时数据,是程序的 “内存条” |
理论上cortex-M3内核的32位的单片机的大小极限是4GB,但是为了统一起始地址,就会导致有些板子并不能完全用完那么多内存,比如,ZET6的Flash大小是512K,但是其实距离下一个区域还有很大空间,虽然浪费但是能够统一起始地址,也为之后更高级的板子向下兼容
Cortex-M3规定的地址划分逻辑,所有 Cortex-M3 单片机都遵循这个标准,不同厂家只是把自己的外设和存储器映射到这些区域里:
|
地址范围 |
区域名称 |
核心用途 |
访问该区域的总线 |
|
0x00000000~ 0x1FFFFFFF |
代码区 |
存程序指令、常量数据(Flash、系统存储器、选项字节) |
I-Code / D-Code 总线 |
|
0x20000000~ 0x3FFFFFFF |
SRAM 区 |
存变量、数组、堆栈、动态数据 |
系统总线 |
|
0x40000000~ 0x5FFFFFFF |
外设区 |
所有片上外设的寄存器(GPIO、UART、TIM 等) |
系统总线(APB/AHB 外设桥) |
|
0xE0000000~ 0xEFFFFFFF |
系统控制区 |
NVIC、SysTick等内核私有外设和外部私有外设(UART/TIM/CAN) |
系统总线 |
|
其余区域 |
外部存储器 / 预留 |
片外 RAM、Flash 或保留未用 |
系统总线 |
IAP
在IAP里,单片机内有2份代码,一份bootloader的,一份APP的,从物理上来看,bootloader能跳转到app是因为把栈顶指针(MSP)和复位向量的映射映射到了APP区,然后bootloader的代码就不再执行,就是从APP区开始
IAP指的是在单片机运行时下载代码,OTA指的是在单片机运行时远程无线下载代码的标志位,IAP包含OTA。

在APP的代码中,那2个和Flash有关的代码是为了读取“固件可以更新了”指令,然后告诉bootloader;操作Flash区的代码,首先是为了修改OTA信息告诉bootloader可以接受新固件了,其次是为了把新固件先写入APP区的备份分区。
printf(" APP CAN Start\r\n");
printf("----------------------------------------------------------------\r\n");
printf("flash cfg size:%d\r\n", sizeof(inter_flash_cfg_param_typeDef));
printf("----------------------------------------------------------------\r\n");
inter_flash_cfg_init(); //初始化Flash配置,内部Flash 参数区参数校验
while (1)
{
if(uart_get_ota_flag() == 1) //说明有新固件,要进行OTA升级
{
inter_flash_cfg_set_app_update_flag(1);
printf("Restarting...\r\n");
HAL_Delay(1000); //延时等待程序执行完毕
HAL_NVIC_SystemReset(); //重启系统
}
//...............
}
ICP
在电路编程 / 在线调试烧录
- 用 ST‑Link / J‑Link,接 SWD/JTAG 口
- 芯片要在板上,不用拆下来
- 开发、调试、量产最常用
- 需要硬件编程器,速度快
- 通俗说:调试器下载程序
ISP
在系统编程(用芯片内部出厂 BootLoader)
- STM32 内部自带一段 出厂 BootLoader(在 System Flash)
- 进入方式:BOOT 引脚设为系统启动,复位
- 通过 串口、USB、CAN 等下载程序
- 不需要 ST‑Link,只要串口就能刷固件
- 通俗说:用串口给空白板下载程序
总结
- ICP:ST‑Link 下载(开发调试)
- ISP:芯片自带 BootLoader 串口下载(工厂烧录)
- IAP:自己写 BootLoader,运行时自升级(OTA / 远程)
更多推荐
所有评论(0)