历史上的今天
返回首页

历史上的今天

今天是:2025年03月21日(星期五)

正在发生

2018年03月21日 | STC系列单片机不断电下载程序的程序设计思路及方法

2018-03-21 来源:eefocus

    本文针对单片机下载程序时需要重复机械式复位产生的一系列调试繁琐的问题,提出了一种用软件引导代替单片机硬件复位写入ROM的方法。该方法通过检测串口数据流是否合法,来判断是否执行ISP引导程序,从而利用软件方式复位,可以让STC单片机复位后从ISP引导程序处执行,利用该特性可以模拟单片机上电复位状态,实现单片机的不断电下载。

    随着单片机技术的发展,单片机片内存储器的容量越来越大,可以容纳越来越大的程序。由于程序越来越复杂,在程序调试过程中需要不断进行硬件复位来下载程序,虽然在线下载程序的方法已经普遍应用,但在现实调试实现中还是比较繁琐,因此人们在寻求一种用软件代替硬件的复位方法来调试下载程序,近而在工程实际中更加快捷方便地进行程序实现。因此,文中提出了一种软件复位单片机的方法,即利用STC单片机独有的ISP引导区,用特殊的指令使调试好的程序从ISP引导区执行,避免频繁地硬件复位,而且简单实用。

1 软件复位单片机的工作原理
1.1 STC单片机复位方法简介
    STC单片机的复位方法分为热启动和冷启动两种:冷启动是系统断电后再上电的硬件复位;热启动分为3种:一种是reset引脚复位,一种是内部看门狗复位,一种是ISP引导区复位。热启动中的reset复位是reset引脚接受到复位信号直接从用户区执行,内部看门狗是在外界电磁干扰致使程序跑飞时发出一个复位信号,使程序地址指针移动到00H,产生和reset复位相同的效果,ISP引导区复位是一种只有在系统上电时才执行的程序存储区,当程序执行到ISP引导区时,如果系统没有检测到合法的数据流,则直接执行用户程序区;如果系统检测到合法的数据流,则先下载程序,再执行用户程序区。单片机启动的过程为:先给断电的单片机通电,进行STCISP下载,然后执行用户程序,或者没有检测到合法的数据流,然后直接执行用户程序区。其流程图如图1所示。

a.JPG


1.2 软件实现不断电下载的工作原理
    STC单片机ISP_CONTR是单片机进行软复位的控制寄存器,其地址为E7H,进行ISP_CONTR定义后,再自定义串口接受的数据流。然后进行串口初始化和定时器初始化,串口初始化的波特率和具体工作方式要与下载软件一致,定时器设置初值任意,在软件中保证1 s即可。串口中断子程序设计,具体过程为:当串口接受数据后,把SBUF中的数据和用户自定义数据进行比较。如果一致,赋值给ISP_CONTR使单片机复位;如果没有接受到合法数据流,则继续执行用户程序。具体流程如图2所示。

 

b.JPG

    

2 在线下载接口电路
    图3为STC89C52与RS232串口的连接电路图,RS232为负逻辑电平,所以单片机在与上位机进行通信时需要逻辑转换,图3所使用的转换芯片为MAXIM公司生产的MAX232标准RS-232接口芯片,使用+5 V供电,内部为爽组驱动器/接收器,每个接收器将RS-232电平转换为5 VTTL/CM OS电平。其中,RS-232在现代应用中由标准的25线简化为发送线、接收线、地线三线传输。串口的发送和接收线分别与RS-232的R1IN和T1OUT相连,MAX-232的R1OUT和T1IN分别与单片机的P3.0和P3.1相连,实现上位机、转换芯片、单片机的相互通信。

c.JPG

    

3 不断电下载程序设计
    在单片机和PC机通讯并实现不断电下载,首先要设置好串口通信协议,例如串口接受与发送数据的波特率,串行口的工作方式,串行口接收与发送的数据帧格式;其次是定义自定义下载命令,并与实际发送命令一致;再次是设置串口发送命令等待时间,这可以通过单片机内部定时器来实现;最后为下位机接收发送自定义指令判断,实现软复位。
3.1 串口通讯协议初始化
    首先设置波特率,根据STC单片机的晶振频率和STC芯片性能,设波特率为9 600 bit·s-1,波特率由定时器的溢出率控制。然后设置串行口的通信协议,如数据位位数、停止位位数以及是否奇偶校验,具体设置如图4所示。

d.JPG


3.2 定时器的设置
    波特率为9 600 bit·s-1,在串口工作方式2的情况下,根据方式2的波特率=(2SMOD/32)*(T1溢出率)。假设单片机的晶振频率为11.0 59 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。减少了程序的冗余性,定时器的工作方式设定为2,定时器自动重装,不必写定时器中断子程序。
3.3 初始化子程序
   e.JPG
3.4 用户自定义下载命令
    定义语句为:#define seffdecide_download_commond0x8E。0x8E是用户任意定义的下载指令,但最多不能超过0xFF,因为ISP_CONTR寄存器只有8位。接着进行ISP_CONTR的地址定义,通过查STC89C52的用户手册,其语句为sfr ISP_CONTR=0xE7。
3.5 串口接收合法数据程序
    单片机的工作原理是循环扫描,即使不加大循环while语句,用户程序也总是一遍一遍地执行,所以用户程序需要时时刻刻扫描是否是合法数据流的出现。
    串口中断的编号为4,首先要检验中断标志位RI,如果RI置1,说明上位机向单片机的串口发送指令;随后指令内容被传送到单片机的SBUF中,判断SBUF中的命令内容是否和用户自定义的命令一致。如果一致,直接向ISP_CONTR中赋特定的值使程序指针指到ISP引导区,实现程序的软复位;如果不一致,使TI清零,以便下一次中断申请。
3.6 延时子函数
    串口接收数据有1 s的延时时间,所以需要加延时子函数,代码如下:
    Void delayl s()
    {
      Int p,q;
      For(p=1000;p>0;p--)
      For(q=100;q>0;q--);
    }

4 结束语
    介绍了STC系列单片机不断电下载程序的程序设计思路及方法,运用STC单片机独有的ISP引导区对软件模拟硬件复位实现单片机的不断电下载程序,省去了编程器的频繁插拔件或者频繁的手动复位硬件开关。此方法在大的程序编写调试过程中能节省大量时间,但也降低了串行口的使用效率。本例适合运用在使用串行口较低的情况下,并且在调试的情况下可以省去手动频繁的复位操作,减少工作量。

推荐阅读

史海拾趣

General Electric Company公司的发展小趣事
可能是由于电路布局不合理或外部元件选择不当引起的。解决方案是优化电路布局、选择合适的外部元件并加强电源滤波。
ZTE高新兴(Gosuncn)公司的发展小趣事
在高压医疗设备中,如X射线机、CT机等,用于信号放大和处理。
CMOS Sensor Inc公司的发展小趣事

为了保持技术领先地位,CMOS Sensor Inc公司高度重视研发投入。公司拥有一支专业的研发团队,致力于新技术、新产品的开发。同时,公司还与多所高校和研究机构建立了紧密的合作关系,共同推动光电图像采集技术的发展。这些举措使得CMOS Sensor Inc在行业中保持了持续的创新能力。

Garmin_Canada_Inc.公司的发展小趣事
考虑到实际应用环境的复杂性,拨号电路应具有一定的环境适应性。例如,在电磁干扰较强的环境中,采取适当的屏蔽和滤波措施;在温度变化较大的环境中,采用温度补偿电路等。
极海半导体(Geehy)公司的发展小趣事
选用高质量的DTMF信号发生器芯片,如MT8888等,这些芯片具有稳定的性能和较高的精度。
E-Mark Inc公司的发展小趣事

在电子汽车行业初期,XYZ公司主要生产简单的车载电子设备。为了进入欧洲市场,公司决定对其产品进行E-Mark认证。经过严格的测试和审核,XYZ公司的产品质量和安全性能得到了欧洲市场的认可。随着欧洲市场的开拓,XYZ公司逐渐扩大了生产规模,提升了技术水平,最终成为了汽车电子行业的领导者。

问答坊 | AI 解惑

PC微机与松下FPIPLC远程通信的与实现

1 引 言在自来水生产企业,采水有一部分来自于远离厂区的取水井群,取水点往往无人值守,为了实现中控室值班人员对水井电动机的运行情况监测和控制,为济宁某自来水厂开发了这套远程监控系统。井群电动机由松下FPlPLC控制,并由电压、电流变送器采 ...…

查看全部问答>

谁能出售FPGA的开发板

因为FPGA强大的功能吸引我,所以在论坛上求购二手的FPGA开发板~~~~~~…

查看全部问答>

汽车烟火定位器

爱车找不到?快用汽车烟火定位器 外出参加运动并将车停在大型户外停车场里的时候,你的爱车会很容消散在茫茫车海之中。如果对当地的情况不够熟悉,想要迅速找到自己的爱车恐怕就没那么容易了。这时,就需要通过一些特别的手段来快速定位。比如, ...…

查看全部问答>

请推荐几个wince游戏软件下载的地方

最近开始玩wince,请推荐几个好的地方,可以下载游戏,软件的.多谢拉!…

查看全部问答>

EVC中怎么改变LIST里面插入行字体的大小

在LIST中插入数据InsertString()但我不知道怎么控制它数据字体的大小?请问怎么设置里面数据字体的大小?…

查看全部问答>

用DDK开发的驱动在32位vista下的进程间通信问题

遇到一个进程间通信的问题:在vista环境下,一个用DDK开发的虚拟打印的驱动程序,当使用PostThreadMessage()在两个进程间通信的时候,消息发送失败,总是返回1444错误,经查应该是“无效的线程标识”,即不识别的线程ID。用事件通知方式的时候,在O ...…

查看全部问答>

请教斑竹!STM32103TIM1中断问题

请教斑竹!STM32103 TIM1 中断问题 如果我 用TIM1 发 SVPWM 波 就不能使用void TIM1_UP_IRQHandler(void) 了?…

查看全部问答>

162的显示

写了一个1602的程序,和74hc595在一起的,液晶一直没有显示。不知道哪里有问题,求高手 void Write_595(unsigned char Data){ unsigned char j; GPIO_ResetBits(GPIOA , GPIO_Pin_5); GPIO_SetBits(GPIOA , GPIO_Pin_2); GPIO ...…

查看全部问答>