基于YModem的STM32串口IAP的设计

发表时间:2018/8/13   来源:《教育学文摘》2018年8月总第274期   作者:梁伟俊
[导读] 针对STM32应用程序在线升级的问题,提出基于YModem的串口IAP方案,以实现简单、高效、可靠的MCU程序在线升级。

江门市新会机电职业技术学校 广东 江门 529100 
        摘 要:针对STM32应用程序在线升级的问题,提出基于YModem的串口IAP方案,以实现简单、高效、可靠的MCU程序在线升级。本文给出了基于YModem的串口IAP方案的原理解释及实现的技术细节。方案成功应用在多个实际的项目中,缩短Bug修复时间,能实现远程升级,取得较大的经济和社会效益。
        关键词:STM32 串口 BOOTLOADER YModem协议 IAP
        随着集成电路技术的发展以及电子产品越来越智能化,MCU的应用越来越广泛。而在MCU使用过程中,应用程序的升级是一个难点。目前,对于程序升级主要存在两种技术:在系统编程ISP以及在应用编程IAP。ISP在系统编程,指的是一种在系统中直接进行烧录的编程技术。IAP在应用编程,指的是MCU可以在系统运行中获取新的代码并对自己重新编程的技术。ISP一般需要少量的外部电路辅助实现,需要硬件事先留出相关接口且到现场升级;而IAP只需要依托系统现成的通信链路,无需额外的硬件,更为灵活,而且可以实现远程升级,因此IAP技术越来越受到欢迎和重视。
        本文介绍一种基于YModem的STM32串口IAP的设计,从而实现简洁、高效、可靠地对MCU进行在应用编程。
一、STM32的IAP原理
        要实现STM32的在应用编程(IAP),需要把原来的一个程序拆分为两个程序,一个是负责对应用程序进行在应用编程的BOOTLOADER程序;另一个则是实现真正功能的应用程序APP。因此,需要把Flash划分为BOOTLOADER区域和APP区域,如图1.1所示。
        1.具体说来,BOOTLOADER程序需要实现两个功能:
        (1)在接收到升级命令时,与上位机进行通信,把新的APP程序接收并烧写到APP所在的Flash区域。
        (2)在程序烧写完成后或无需升级时,自动跳转到APP程序来执行。
       
     图1.1  IAP程序空间划分
        当系统复位时,中断向量表指向0x00000000,会从0x00000004处取出复位起始地址,并跳转到中断服务程序中执行,即执行BOOTLOADER中的复位中断程序。进而以此为起点,执行BOOTLOADER中的程序。BOOTLOADER接到升级命令后,开始接收上位机传输来的APP程序,并烧写到APP在Flash所在的存储空间中。在接收完APP程序后,MCU需要由BOOTLOADER跳转到APP程序执行。代码如下:
/**********************************************
JumpToApp程序代码
**********************************************/
void JumpToApp(void)
{
//检查栈顶地址是否合法
if(((*(vu32*)App_FLASH_Address)&0x2FFE0000) == 0x20000000)
{
//把函数指针指向相应的函数地址
pJumpToApp=(pFunVoidType)*(vu32*)(App_FLASH_Address+ 4);              
MSR_MSP(*(vu32*)App_FLASH_Address); //初始化APP函数的堆栈
if(((*(vu32*)(App_FLASH_Address+4))&0xFF000000)==0x08000000)
    {
  pJumpToApp();   
    }
 }
}
        2.由BOOTLOADER跳转到APP程序执行至少需要两个操作:
        (1)把APP对应的堆栈指针值赋给堆栈指针寄存器MSP。
        (2)取出APP的复位起始地址,跳转到复位中断服务程序并执行。
        跳转操作的具体C语言实现如上所示,其中App_FLA
        SH_Address为APP的Flash存储空间中的起始地址,其值为0x00005000,通过第6行的MSR_MSP函数来复制堆栈指针寄存器。通过第5、9行代码把APP的复位起始地址读取,并跳转到APP的复位中断服务程序执行。在APP的复位程序中,完成对MCU运行环境的初始化工作,并最终跳转到主程序中执行。
        为了使跳转到APP后,程序能够正常工作,还需要手动在APP程序中把中断向量表偏移寄存器VTOR指向APP的中断向量表的位置。因为在程序的跳转过程中,没有任何操作改变过VTOR的值。中断向量表偏移寄存器VTOR值的更改可由如下代码实现,其中FLASH_BASE是0x00000000。当更改VTOR值后,APP程序运行过程中进入中断后,其相应的中断服务程序才能正确响应。
        SCB->VTOR = FLASH_BASE | 0x5000;
二、YModem协议
        YModem协议是由XModem协议演变过来的,每包数据最高可达1024个字节,是一个非常高效的文件传输协议。其每包数据均采用循环冗余码进行校验,且每一包数据接收成功后都产生确认信号,能进行可靠的文件传输。
        YModem数据帧格式如表2.1所示,由数据包开始信号、发送序号、发送序号补码、数据区、CRC高字节及CRC低字节这几个部分。数据包开始信号可以取SOH或STX,SOH代表数据区大小为128Bytes,而STX代表数据区大小为1024Bytes;发送序号、发送序号补码分别是当前数据帧发送的序号及其补码,防止丢帧;数据区是传输数据内容的区域,根据数据包开始信号的值来决定数据区的大小;CRC高字节、CRC低字节是数据区域内容的CRC校验码的高字节、低字节,能有效保证帧数据帧的正确性。
        表2.1 YModem数据帧格式
       
三、STM32串口IAP的设计
        串口是STM32最为常用的通信接口,也是最为常见的IAP的通信链路。本文的BOOTLOADER设计是以串口为硬件基础的。
        1.从逻辑上看,要完成STM32串口IAP的功能,需要MCU做三部分的处理:
        (1)接收升级命令,并触发在线升级流程。
        (2)收到升级命令后,进入在线升级程序,并待升级成功后自动跳转到APP。
        (3)在无升级命令时,自动跳转到APP。
        2.从空间上看,第一部分接收升级命令并触发升级流程的功能,需要在BOOTLOADER及APP程序中实现,因为在实际情况中会存在两种升级的情景:
        (1)当通过其他方式把BOOTLOADER烧写到MCU时,需要BOOTLOADER能接收到升级命令后进行程序的在线升级。
        (2)当MCU已经有APP程序时,一般情况下APP程序正在运行,此时因为Bug修复或功能添加时,同样需要APP能够在接收到升级命令后进行程序的在线升级。因此在OOTLOADER、APP程序中均需实现第一部分功能。
        第一部分功能的实现,一般采用串口的中断服务程序,其流程如图3.1所示。当BOOTLOADER/APP收到升级命令时,对备份寄存器BKP_DR1置位,通过看门狗进行系统复位,C语言代码如下所示。由节1可知,当系统复位后,执行BOOTLOADER程序。因为备份寄存器具有不受系统复位影响的特性,故在跳转到BOOTLOADER程序后,保存着置位状态,从而能通过对备份寄存器置位的判断,来决定对升级程序的触发。
/**********************************************
SystemReset程序代码
**********************************************/
void SystemReset(void)
{
IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);//启动寄存器读写
IWDG_SetPrescaler(IWDG_Prescaler_64); //40K时钟32分频
IWDG_SetReload(312);//计数器数值
IWDG_ReloadCounter( );//重启计数器
IWDG_Enable( );//启动看门狗
NVIC_SystemReset( );
while(1);
}
        第二、三部分功能,只需要在BOOTLOADER中实现,也是BOOTLOADER的主要功能,其程序流程如图3.2所示。
        
        本文描述的基于YModem的STM32串口IAP的设计,已经实现并与Windows下实现YModem协议的SecureCRT配合使用,成功应用在多个项目中,体现出较好的鲁棒性、简洁、易用及高效,取得良好的效果。特别是在一些拆卸较为困难的样机中,利用常见的对外通信接口串口就能对APP进行升级而无需花费长时间进行拆卸,大大缩短了调试、Bug修复的时间。若应用在其他的电子产品中,可以预见能取得较大的经济和社会效益。
参考文献
[1]王晓鸣 王洪达 基于IAP的水下自航行器在线编程设计[J].机电一体化,2012,12,78-81。
[2]谢树京 莫家玲 基于串口的通用的单片机在系统编程设计及实现[J].现代电子技术,2009,16,161-162。
[3]ST STM32参考手册。
[4]Joseph Yiu  ARM Cortex-M3权威指南(第2版)[M].北京,清华大学出版社,2014。
[5]Chuck Forsberg  XMODEM/YMODEM PROTOCOL REFERENCE。

投稿 打印文章 转寄朋友 留言编辑 收藏文章
  期刊推荐
1/1
转寄给朋友
朋友的昵称:
朋友的邮件地址:
您的昵称:
您的邮件地址:
邮件主题:
推荐理由:

写信给编辑
标题:
内容:
您的昵称:
您的邮件地址: