(4)拷贝软件到应用程序区
软件正确的下载到临时区后,需要拷贝到应用程序区。该部分关键部分在于STM32内嵌FLASH的擦除与读写。
STM32F107内嵌FLASH是通过分页机制来实现对寻址空间的扩展和FLASH页面的使用和管理的。所以对FLASH的擦除操作需要按页进行擦除。即擦除FLASH不能擦除某一字节或一次擦除小于一页(2048字节)。
FLASH擦除的具体步骤:
①解锁FLASH编程控制寄存器;
②定位要擦除的扇区;
③写扇区擦除命令;
④等待命令执行完成;
⑤锁定FLASH编程控制寄存器。
对FLASH执行写操作步骤如下:
①解锁FLASH编程控制寄存器;
②向指定的地址写若干字数据;
③等待上一条命令执行完成;
④如果未写完数据,则递增源地址和目标地址,重复步骤②和③;
⑤锁定FLASH编程控制寄存器。
(5)软件跳转应用程序区
应用程序准备好后,程序需要从BOOT区跳转到应用程序区首地址处执行应用程序。这里分为两步:
①修改中断向量表位置。由于STM32F107采用ARM Cortex—M3内核,该内核的系统控制空间中写中断向量表的寄存器地址NVIC_VectTaD_ Addr为0xE000ED08,在该地址写入应用程序起始地址即可,本程序应用程序起始地址APP_START_ADDRESS为0x08005000。设计如下:
ldr r0,=0x08005000
ldr r1,=0xe000ed08
Str r0, [r1]
②跳转到应用程序首地址处执行应用程序。该步骤完成堆栈指针和程序指针(PC)的修改。在上述汇编代码之后,通过以下方式实现:
;从应用程序向量表中载入堆栈指针
ldr r1, [r0]
mov sp,r1
;从应用程序向量表中初始化程序指针(PC),并跳转到应用程序
;入口
ldr r0, [r0,#4]
bx r0
为保证软件升级错误不导致系统崩溃,将终端程序隔离为引导程序(BOOT区程序)及应用程序两部分,如单次软件升级失败仍可进行再次升级。两部分程序分别在Keil中编译,并把BOOT区程序烧写在FLASH首地址0x08005000处,以便终端启动直接进入BOOT区。用于应用程序编译吋需设定烧写地址为应用程序区首地址,并生成bin文件以便直接下载到FLASH中即可运行。
结语
该方法实现了采用WiFi通信方式,通过TFTP协议将编译后的软件文件下载到终端设备,完成软件升级的功能。在嵌入式系统领域,程序升级可以方便地对程序缺陷进行弥补和修改,或对程序功能进行扩充,运用该方法可极大提高产品的生存周期,节省对项目的维护成本和提高了开发效率。
基于该方法已成功设计出可远程在线升级程序的车辆管理系统。使用情况表明,该系统能稳定、可靠地工作,且为系统的维护节省了大量的工作量,对同类型的嵌入式设备软件在线升级设汁有很好的参考价值。
本文关键字:软件 电动车-摩托车-汽车,电子知识资料 - 电动车-摩托车-汽车
上一篇:电动车充电器的设计和分析