付文悦,黄 民
(北京信息科技大学机电工程学院,北京 100192)
随着单片机技术的发展,单片机片内存储器的容量越来越大,可以容纳越来越大的程序。由于程序越来越复杂,在程序调试过程中需要不断进行硬件复位来下载程序,虽然在线下载程序的方法已经普遍应用,但在现实调试实现中还是比较繁琐,因此人们在寻求一种用软件代替硬件的复位方法来调试下载程序,近而在工程实际中更加快捷方便地进行程序实现。因此,文中提出了一种软件复位单片机的方法,即利用STC单片机独有的ISP引导区,用特殊的指令使调试好的程序从ISP引导区执行,避免频繁地硬件复位,而且简单实用。
STC单片机的复位方法分为热启动和冷启动两种:冷启动是系统断电后再上电的硬件复位;热启动分为3种[4]:一种是reset引脚复位,一种是内部看门狗复位,一种是ISP引导区复位。热启动中的reset复位是reset引脚接受到复位信号直接从用户区执行,内部看门狗是在外界电磁干扰致使程序跑飞时发出一个复位信号,使程序地址指针移动到00H,产生和reset复位相同的效果,ISP引导区复位是一种只有在系统上电时才执行的程序存储区,当程序执行到ISP引导区时,如果系统没有检测到合法的数据流,则直接执行用户程序区;如果系统检测到合法的数据流,则先下载程序,再执行用户程序区。单片机启动的过程为:先给断电的单片机通电,进行STCISP下载,然后执行用户程序,或者没有检测到合法的数据流,然后直接执行用户程序区。其流程图如图 1 所示[5]。
图1 单片机的启动过程
STC单片机ISP_CONTR是单片机进行软复位的控制寄存器,其地址为E7H,进行ISP_CONTR定义后,再自定义串口接受的数据流。然后进行串口初始化和定时器初始化,串口初始化的波特率和具体工作方式要与下载软件一致,定时器设置初值任意,在软件中保证1 s即可。串口中断子程序设计,具体过程为:当串口接受数据后,把SBUF中的数据和用户自定义数据进行比较。如果一致,赋值给ISP_CONTR使单片机复位;如果没有接受到合法数据流,则继续执行用户程序。具体流程如图2所示[5]。
图2 不断电下载程序流程
图3为STC89C52与RS232串口的连接电路图[1],RS232为负逻辑电平,所以单片机在与上位机进行通信时需要逻辑转换,图3所使用的转换芯片为MAXIM公司生产的MAX232标准RS-232接口芯片,使用+5 V供电,内部为爽组驱动器/接收器,每个接收器将RS-232电平转换为5 V TTL/CMOS电平。其中,RS-232在现代应用中由标准的25线简化为发送线、接收线、地线三线传输。串口的发送和接收线分别与 RS-232的R1IN和T1OUT相连,MAX-232的R1OUT和T1IN分别与单片机的P3.0和P3.1相连,实现上位机、转换芯片、单片机的相互通信。
图3 RS232转TTL电路
在单片机和PC机通讯并实现不断电下载,首先要设置好串口通信协议,例如串口接受与发送数据的波特率,串行口的工作方式,串行口接收与发送的数据帧格式;其次是定义自定义下载命令,并与实际发送命令一致;再次是设置串口发送命令等待时间,这可以通过单片机内部定时器来实现;最后为下位机接收发送自定义指令判断,实现软复位。
首先设置波特率,根据STC单片机的晶振频率和STC芯片性能,设波特率为9 600 bit·s-1,波特率由定时器的溢出率控制。然后设置串行口的通信协议,如数据位位数、停止位位数以及是否奇偶校验,具体设置如图4所示。
图4 串口通讯协议
波特率为9 600 bit·s-1,在串口工作方式2的情况下,根据方式2的波特率=(2SMOD/32)*(T1溢出率)。假设单片机的晶振频率为11.059 2 MHz,经12分频后得到计数器记一个数的时间为12/11.059 2 MHz,定时器T1溢出一次的时间为(256-X)×12/11 059 200,所以T1的溢出率为11 059 200/[12×(256-X)],因为波特率不需要加倍,所以 SMOD=0。根据公式得,9 600=(1/32)×11 059 200/[(256-X) ×12],解得X=253,转换成16 进制数为0Xfd[1]。减少了程序的冗余性,定时器的工作方式设定为2,定时器自动重装,不必写定时器中断子程序。
定义语句为:#define selfdecide_download_commond 0x8E。0x8E是用户任意定义的下载指令,但最多不能超过0xFF,因为ISP_CONTR寄存器只有8位。接着进行ISP_CONTR的地址定义,通过查STC89C52的用户手册,其语句为sfr ISP_CONTR=0xE7。
单片机的工作原理是循环扫描,即使不加大循环while语句,用户程序也总是一遍一遍地执行,所以用户程序需要时时刻刻扫描是否是合法数据流的出现。串口中断的编号为4,首先要检验中断标志位RI,如果RI置1,说明上位机向单片机的串口发送指令;随后指令内容被传送到单片机的SBUF中,判断SBUF中的命令内容是否和用户自定义的命令一致。如果一致,直接向ISP_CONTR中赋特定的值使程序指针指到ISP引导区,实现程序的软复位;如果不一致,使TI清零,以便下一次中断申请。
串口接收数据有1 s的延时时间,所以需要加延时子函数,代码如下:
介绍了STC系列单片机不断电下载程序的程序设计思路及方法,运用STC单片机独有的ISP引导区对软件模拟硬件复位实现单片机的不断电下载程序,省去了编程器的频繁插拔件或者频繁的手动复位硬件开关。此方法在大的程序编写调试过程中能节省大量时间,但也降低了串行口的使用效率。本例适合运用在使用串行口较低的情况下,并且在调试的情况下可以省去手动频繁的复位操作,减少工作量。
[1]郭天祥.51单片机C语言教程[M].北京:电子工业出版社,2010.
[2]求是科技.8051系列单片机C程序设计完全手册[M].北京:人民邮电出版社,2006.
[3]丁向荣.STC系列增强型8051单片机原理与应用[M].北京:电子工业出版社,2011.
[4]邹丽娟.浅谈MCS-51系统软复位[J].前沿学术论坛,2010(8):256-257.
[5]宏晶科技.STC Microcontroller Handbook[M].深圳:深圳宏晶科技有限公司,2007.
[6]谭浩强.C程序设计[M].北京:清华大学出版社,2005.