c语言的串口ymodem程序,基于YModem的STM32串口IAP的设计

江门市新会机电职业技术学校 广东 江门 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程序来执行。

fabc7eb64d69dce942b57d9b2a3359ee.png    

图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数据帧格式

c7161183554878d38f6602371b4e8f78.png       

三、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所示。

0818be81943150fc2babad139c06aaf6.png      

本文描述的基于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。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值