STM32 + IAP + Ymodem完美结合
内容提要
本文介绍了编程相关的基础概念,包括ISP、ICP和IAP。IAP是应用程序运行过程中进行编程的一种方式,用于升级程序和更新固件。文章还介绍了Ymodem协议和ST官网提供的IAP例程。最后,文章讲述了IAP例程的要点和APP代码的修改。
延伸解读
IAP与ISP、ICP的区别与适用场景
文章明确区分了ISP、ICP和IAP:ISP依赖芯片内部固化的boot程序,ICP泛指在电路中对芯片编程(如使用J-Link等工具),而IAP强调在应用程序运行过程中通过预留通信口更新固件。对于产品发布后的远程升级,IAP更灵活,无需拆机或依赖专用编程器,但需要用户程序自身实现Flash烧写和跳转逻辑。
Ymodem协议在IAP中的角色与效率
Ymodem协议由Xmodem演变而来,支持1024字节数据包,传输效率较高。文章详细列出了起始帧、数据帧和结束帧的格式,包括SOH/STX标识、编号及反码、CRC16校验等。在IAP场景中,Ymodem负责将二进制文件可靠地通过UART传输到设备,配合超级终端等工具完成文件下载,是IAP数据传递的关键环节。
IAP例程的Flash分区与APP地址匹配
ST官方例程将Flash划分为IAP程序区和APP程序区,IAP程序起始于0x08000000,兼具编程和引导跳转功能(即BootLoader)。APP程序起始地址必须与IAP中设定的跳转地址一致(如0x08003000),否则跳转后无法执行。文章还建议对IAP程序进行写保护,防止意外破坏,并提到可通过倒计时替代按键选择,提升产品化体验。
APP程序需修改向量表偏移和工程配置
APP程序不能直接沿用默认设置,需在代码中调用NVIC_SetVectorTable设置向量表偏移(如0x3000),并在工程选项中将目标地址配置为对应偏移,最后生成Bin文件。这些步骤确保APP程序能在IAP分配的地址空间正确运行。文章以STM32F1为例,但强调ST官网例程覆盖多种MCU和通信口,原理类似,读者可据此迁移。
Q&A
ISP、ICP和IAP分别是什么意思?有什么区别?
ISP是在系统中编程,芯片内部有boot程序,可通过STC-ISP、Flash loader等工具升级;ICP是在电路中编程,所有需要编程的芯片都需通电并处于电路中,如使用J-Link、ST-Link等工具;IAP是在应用程序运行过程中进行编程,用于程序升级和固件更新,通过预留通信口实现。
IAP通常使用哪些通信口?
IAP的通信口包括UART串口、ETH以太网、I2C、SPI等,原则上只要能传输数据的通信口都能实现IAP功能。
Ymodem协议的数据帧格式是怎样的?
数据帧格式为:STX/SOH + 编号 + 编号的反码 + data[0]...data[n] + CRCH + CRCL。其中SOH表示128字节数据,STX表示1024字节数据;CRCH和CRCL是整条帧(去掉前三个字节)的CRC16校验。如果最后一条数据不足128字节,则用0x1A填充。
ST官网提供的IAP例程有哪些类型?
ST官网提供多种IAP例程,覆盖不同库(标准外设库SPL、硬件抽象层库HAL)、不同通信口(USART、I2C、ETH等)以及不同MCU型号(STM8S、STM32F1、F4、L1等几乎全系列)。
IAP程序和APP程序在Flash中如何分区?APP起始地址如何确定?
IAP程序放在以0x0800 0000为起始的地址,APP程序放在其后的区域。APP起始地址必须与IAP程序中的设置一致,例如IAP代码中定义APP地址为0x0800 3000,则APP程序的起始地址也必须是0x0800 3000,否则跳转后会出错。
APP程序需要做哪些修改才能配合IAP运行?
APP程序需要:1. 在代码开始处设置向量表偏移,如NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x3000);;2. 修改工程配置中的目标地址;3. 生成Bin文件。
如何使用超级终端下载程序到STM32?
硬件连接好后,将生成的程序文件(如Demo.bin)放在指定位置,打开终端,键盘按1选择文件,通过Ymodem协议下载,下载完成后按3执行程序。