控制系统中大多采用电压监控或者看门狗电路,以保证系统的稳定运行。采用硬件复位的方式,可以通过按键开关在任意时刻进行系统复位,系统复位后程序重新开始运行。但有些系统中有人机界面显示,主机在机箱内部,人工复位很不方便,所以采用界面方式的软件复位。
TMS320F2812(以下简称2812)是TI公司2000系列的新型DSP芯片,具有32位低功耗定点处理器,最高主频150 MHz,有强大的操作能力和快速的中断响应处理能力。片内有18 K字高速RAM,128 K字的可加密Flash ROM。片上还集成了丰富的片内外设,有SPI、SCI、eCAN和McBSP等多个串口外围设备,16通道的12位模数转换器(ADC),2个事件管理器(EVA、EVB),56个独立的可编程、多用途通用I/O口(GPIO)。该DSP芯片集成了大量工业控制领域应用的外设接口,能大大简化电路设计,同时它也具有足够的处理能力,是应用于控制领域的一款高性能DSP处理器。
下面介绍三种实现方法。
1 硬件看门狗带喂狗端口
看门狗芯片一般都带有电压监控和复位输出控制,同时还带有WDI的喂狗引脚,需要系统不停地给芯片脉冲,以保证看门狗芯片不向系统输出复位信号。这里就出现了第一种软件方式系统复位方法: 需要软件复位时就长时间不给狗脉冲,这样看门狗芯片的复位引脚就输出1个系统需要的复位电平使系统复位。图1是看门狗芯片图。图2是MAX706与2812的接口电路。MAX706芯片内部看门狗定时器的输入WDI可以接到2812的引脚上,2812不断向WDI输入脉冲(周期≤1.6 s),WDO输出的低电平接到2812的XRS端,使系统复位并重新启动系统。另外当系统电源降到检测点时也使系统复位。
当系统接收到复位命令后,停止对WDI引脚的输出,使芯片的RESET控制系统复位。
端口初始化程序如下:
void InitGpio(void) {
EALLOW;
GpioMuxRegs.GPAMUX.bit.PWM1_GPIOA0=0;
EDIS;
}
喂狗程序如下:
void KickDog(void) {
GpioMuxRegs.GPADIR.bit.GPIOA0^=1;
}
通信复位命令处理方式:
if( (recpack[port].data[0]=='R')&& (recpack[port].data[1]=='S')&&(recpack[port].data[2]=='T') {
DINT;//关闭所有中断,等待复位
while(1);//等待看门狗复位
}
2 看门狗芯片不带喂狗端口
方式1中所采用的是带WDI端口的看门狗芯片,但有些芯片是不带WDI端口的,这时看门狗用于电源检测,当低于设定电压时,输出复位信号,使系统复位。第二种方法也采用2812的引脚配合方式,但不需要时时刻刻喂狗。图3为所采用的看门狗芯片MAX708。图4为MAX708与2812的接口电路。
图1 MAX706引脚图 图2 MAX706与2812的连接图
图3 MAX708引脚图 图4 MAX708与2812的接口电路
2812的GPIOF14XF引脚在上电复位后输出高电平,之后该信号被锁存。当2812收到系统复位命令后,控制GPIOF14XF引脚输出低电平使系统复位。
端口初始化如下:
void InitGpio(void){
EALLOW;
GpioMuxRegs.GPFMUX.bit.XF_GPIOF14=0;
GpioMuxRegs.GPFDIR.bit.GPIOF14=1;
EDIS;
}
通信复位命令处理如下:
if( (recpack[port].data[0]=='R')&& (recpack[port].data[1]=='S')&&(recpack[port].data[2]=='T')
{
GpioDataRegs.GPFDAT.bit.GPIOF14=0;
}
3 软件看门狗复位方式
这种方式是利用2812自带的软件看门狗方式,2812的看门狗功能框图如图5所示。
图5 2812看门狗功能框图
通过框图可以看出2812的软件看门狗有两种方式: WDINT的中断唤醒方式和WDRST方式。这里是要求系统复位,而WDINT是实时监控系统的,并不能按要求实现软件复位,所以需将WDRST信号接到XRS上,这样通过程序配合就能实现控制系统复位。2812系统上电初始化需要一定的时间,所以在初始化时先关闭看门狗,等系统初始化完成后,再打开看门狗。
初始化程序说明如下:
void InitSysCtrl(void) {
EALLOW;
……
SysCtrlRegs.WDCR = 0x0068;//禁止看门狗
EDIS;
}
主程序如下:
void main(void) {
InitSysCtrl();//初始化
EALLOW;
SysCtrlRegs.WDCR = 0x0028;//使能看门狗
SysCtrlRegs.SCSR.all=0;//设置成WDRST
EDIS;
……
}
通信接收复位命令处理程序如下:
if( (recpack[port].data[0]=='R')&& (recpack[port].data[1]=='S')&&(recpack[port].data[2]=='T')
{
DINT;//关闭所有中断,等待复位
while(1);//等待看门狗复位
}
这里利用while(1)的死循环等待看门狗的计数器超过设定值,然后WDRST信号输出低电平;而WDRST接到XRS上,所以整个系统复位,重新开始执行程序。
看门狗程序如下:
void KickDog(void){
EALLOW;
SysCtrlRegs.WDKEY = 0x0055;
SysCtrlRegs.WDKEY = 0x00AA;
EDIS;
}
结语
第一种和第二种方式基于硬件的实现,更加可靠些,第三种方式则可以节约电路板的空间和成本。需要注意的是,采用软件看门狗时调用喂狗程序的间隔不能大于设定值。