1 引言 本应用笔记提供如何在APM32F4xx系列上使用USART1进行固件IAP的指南,包括接口框图、代码实现和应用方法。
In Application Programing(IAP),在应用编程是指由开发者实现MCU的bootloader功能。可以在产品中为用户提供应用程序的下载、校验、增量更新、升级或恢复等支持。
APM32F4xx微控制器内置1MB的Flash空间,可以使用其中一小部分作为IAP代码的存储空间,以实现自定义IAP的功能。 2 IAP简介通常所说的IAP程序,也有说法是叫做自定义bootloader,其实就是一段启动程序,它在芯片启动的时候最先被执行,可以用来做一些硬件的初始化或者用作固件热更新,当初始化完成之后跳转到对应的应用程序中去。
IAP程序需要通过下载器烧写到芯片中,而APP则可以通过有线方式的UART、IIC、USB、SPI等总线来通过IAP来更新,视所设计的IAP程序而定。另外,对于无线方式热更新APP,一般是用WiFi、bluetooth通UAR透传的方式烧写芯片APP程序。
2.1 IAP功能1.在一定时间内判断是否需要更新 APP,如果需要则接收APP程序并将其烧写到指定地址的 flash 空间里。并从该IAP程序中获取栈顶指针和复位程序指针,然后跳转执行程序。 2.等待超时或接收到用户指令后,则在该IAP程序地址直接获取之前的栈顶指针和复位程序指针并跳转执行。
3 自定义IAP功能IAP( In Application Programming)在线应用编程,即是用户可以使用自定义程序对单片机用户Flash的某一区域进行烧写,通过IAP程序来完成对App程序的更新升级。实际工作中,是为了产品发布后,可以方便的使用预留的通信接口(串口、USB、网口、蓝牙等)来完成程序的升级,避免需要把产品拆开,再使用仿真下载器来更新应用程序。
而要实现IAP功能,要做两部分工作。
1.Bootloader程序;
2.App程序。 注意:
SDK中的例程包含对两个不同地址的APP程序进行更新的功能, APP1存放于0x8004000 ~ 0x8008000地址,APP2存放于0x8008000 ~ 0x800C000地址中。这里为了方便讲述,只介绍了IAP + APP1的情况。至于IAP + APP1 + APP2的情况,大家可以类比来理解。
3.1 总体设计架构 在APM32F407IGxx中,芯片flash空间为1MB大小,那么我们定义IAP架构如下。包括Ymodem协议,USART1收发和菜单,flash操作,IAP空间配置及应用程序跳转等部分。 3.2 代码地址划分IAP程序区设置于0x8000000 ~ 0x8004000地址范围内。Application程序区设置于0x8004000 ~ 0x8100000地址范围。这里要注意两点:
一是要注意以1024 bytes的倍数划分地址,其他特殊地址会发生异常。
二是要注意F4xx系列是以sector扇区为单位来擦除flash,分配App和bootloader地址时要留意。 3.3 代码空间划分以下是具体的代码空间划分图示。从图中可以知道,在加入IAP和APP1程序代码后,整个代码空间中存在两个中断向量表、栈顶地址和中断服务函数。 3.4 IAP功能执行流程程序启动后,先从0x08000004处取出复位中断向量地址,执行完复位中断函数后跳转到IAP程序main函数中执行[①]。
当发生中断请求后,程序跳转到中断向量表中取出中断函数入口地址,再跳转到中断服务函数中执行[②],执行完中断函数后返回main函数中[③],然后执行IAP过程,成功后跳转到APP程序[④]。
从偏移后的中断向量表得到相应中断函数地址,执行相应新的中断服务函数后,回到APP的main函数中[⑤]。后面[⑥⑦⑧]的过程和前述一致,不再赘述。 3.5 中断向量表3.5.1 什么是中断向量表如“IAP执行过程”中所示,中断向量表是存放在Flash区从0x08000004地址(默认)开始的一个数组,数组元素的大小为4个字节,即每一表项的大小为4个字节,这些数组在启动文件中已经初始化好。不同系列根据中断向量的多少,有不同的数组长度。
APM32根据内核和外设中断的优先级,把内核和外设的中断服务函数的地址放在这个数组里面,数组的下标跟中断的优先级对应,也把这个中断的编号叫做中断向量,标号越小,优先级越高。
在启动文件执行的时候,内核和外设的中断服务函数地址都是确定的,地址就在中断向量表中,并且在启动文件里面已经写好了中断服务函数,只是这些中断服务函数为空,而且带[weak]弱定义。
如果使用到相关中断则需要在用户程序里重新实现对应的中断服务函数,而且重写这个中断服务函数的时候,函数名必须跟启动文件里定义好的中断函数名对应,这是因为函数名对应的就是中断服务函数的地址。
当中断发生时,因为每个中断的中断向量不一样,CPU会首先去取向量。然后根据向量来查询中断向量表,最后根据对应的地址找到对应的中断服务函数,从而实现整个中断的响应过程。 3.5.2 中断向量表的设置如前面介绍所述,中断向量表是默认存放在Flash区从0x0000 0004地址(默认存储器映射后为0x0800 0004)的。而我们在划分程序区时改变了APP程序的起始地址为0x08004000,所以在APP程序中我们要设置新的中断向量表的地址。
APM32F4xx芯片SDK的system_apm32f4xx.c文件中可以找到VECT_TAB_OFFSET这个向量表偏移量宏定义来重新设置中断向量表的地址,也即是修改SCB->VTOR向量表偏移量寄存器。这里我们不改库文件,直接在main函数开头设置偏移地址。 int main(void) { SCB->VTOR = FMC_BASE | 0x4000; while (1) { } }
|
相应的工程文件中ROM起始地址也修改为0x08004000。
4 IAP的设计和应用4.1 硬件设计本应用说明对应的IAP例程,是使用了UART方式来实现IAP功能的。对外接口使用了USART1的TX和RX引脚,即PA9和PA10引脚。 4.2 软件设计4.2.1 IAP程序设计整个IAP程序包括Flash的读写,USART1及串口菜单的显示,以及Ymodem协议的文件发送和接收。 4.2.2 APP程序设计APP程序的设计就比较简单,只是循环亮灭一个LED灯。但要注意的是,如上一章提到的“中断向量表”设置,在APP程序一开始的main函数就需要先设置好中断向量表的偏移地址。
4.3 APP固件升级4.3.1 APP可执行文件的生成APP是主用户程序,在完成IAP程序的设计后,就要把APP的更新文件生成,然后通过一定的协议传输给IAP程序来进行APP固件的更新。一般来说APP更新文件的文件类型为.bin文件,该文件可以直接拷贝到flash中运行。
在Keil MDK Option配置的User选项卡中配置以下命令,即可使用fromelf.exe生成bin文件,默认生成在工程目录。 /** 命令*/ fromelf.exe --bin -o ./@L.bin !L
|
4.3.2 固件升级生成bin文件后,就可以根据IAP程序选择某种传输方式进行bin文件的传递了。这里使用了Ymodem协议和超级终端软件来实现,以下是具体操作。 4.3.2.1 串口菜单 在保持串口连接到目标板的状态下,在下载好IAP BootLoader程序的目标板复位后,超级终端软件会显示下图中的串口菜单。 4.3.2.2 下载APP1的bin文件到芯片 在串口菜单按下键盘的“1”键,进入等待bin文件发送状态。
Application1对应IAP_Application1工程的文件,Application2对应IAP_Application2工程的文件。 4.3.2.3 选择要下载的bin文件 4.3.2.4 选择Ymodem协议并发送文件 4.3.2.5 下载完成 等待文件发送完成后,软件中会提示“Programming Comleted Successfully!”。然后就可以重新选择所需功能。
|