DSP 中的看门狗
(2012-11-20 13:43:01)
标签:
分类:
DSP
看门狗电路的应用,使
单片机可以在无人状态下实现连续工作,其工作原理是:看门狗芯片和单片机的一个I/O引脚相连,该I/O引脚通过
程序控制它定时地往看门狗的这个引脚上送入高电平(或
低电平),这一程序语句是分散地放在单片机其他
控制语句中间的,一旦单片机由于干扰造成程序跑飞后而陷入某一
程序段 进入死循环状态时,写看门狗引脚的程序便不能被执行,这个时候,看门狗电路就会由于得不到单片机送来的信号,便在它和单片机复位引脚相连的引脚上送出一个
复位信号,使单片机发生复位,即程序从
程序存储器的起始位置开始执行,这样便实现了单片机的自动复位。
总结就是 喂狗狗不叫,没人喂了狗就要叫CPU复位
看门狗的机理:
主要核心是一个定时器,当定时器时间到时复位
正常运行程序过程中每次在看门狗的定时器时间到之前重启看门狗定时器
TMS320F2833X 看门狗的组成
1.定时器(计数器) WD Counter 。
2.看门狗重启管理器(WD Reset Register)。
3.看门狗时钟发生器。
4.看门狗状态位
看门狗时钟发生器:
WDCLK = CLKOUT/512,当HALT时停止
6-bits预定标选择:将WDCLK再分频后送给看门狗定时器。WDPS2~0 in WDCR
看门狗控制寄存器:WDCR
WDFLAG: 0-未发生复位,1-发生复位
WDDIS: 0-使能看门狗,1-禁止看门狗
WDCHK2~0: 101 系统正常运行
其他值 复位
WDCR = 0X 28 (00 101 000) 使能看门狗
看门狗定时器(计数器) WDCNTR:
低8位为计数器,当低8位溢出时,产生一个复位信号。此寄存器为只读的。
看门狗重启管理器 WDKEY:
低8位为寄存器,只有先写入55h后写入AAh后重启看门狗计数器。
不是此顺序写入55h或AAh,则无效。
写入其他数值时产生复位信号。
使用时,,首先写SCSR 寄存器 。System Control and Status Register
在 文档中 TMS320x2833x, 2823x System Control and Interrupts 找到
#include "DSP2833x_Device.h" // Headerfile Include File
#include "DSP2833x_Examples.h" // Examples Include File
// Prototype statements for functions found within this file.
interrupt void wakeint_isr(void);
// Global variables for this example
Uint32 WakeCount;
Uint32 LoopCount;
void main(void)
{
InitSysCtrl();
// Disable CPU interrupts
DINT;
InitPieCtrl();
// Disable CPU interrupts and clear all CPU interrupt flags:
IER = 0x0000;
IFR = 0x0000;
InitPieVectTable();
// Interrupts that are used in this example are re-mapped to
// ISR functions found within this file.
EALLOW; // This is needed to write to EALLOW protected registers
PieVectTable.WAKEINT = &wakeint_isr;
EDIS; // This is needed to disable write to EALLOW protected registers
// Clear the counters
WakeCount = 0; // Count interrupts
LoopCount = 0; // Count times through idle loop
// Connect the watchdog to the WAKEINT interrupt of the PIE
// Write to the whole SCSR register to avoid clearing WDOVERRIDE bit
EALLOW;
SysCtrlRegs.SCSR = BIT1; //WDENINT写1,使能watchdog 中断
EDIS;
// Enable WAKEINT in the PIE: Group 1 interrupt 8
// Enable INT1 which is connected to WAKEINT:
PieCtrlRegs.PIECTRL.bit.ENPIE = 1; // Enable the PIE block
PieCtrlRegs.PIEIER1.bit.INTx8 = 1; // Enable PIE Gropu 1 INT8 WAKEINT中断
IER |= M_INT1; // Enable CPU int1
EINT; // Enable Global Interrupts
// Reset the watchdog counter
ServiceDog();
// Enable the watchdog
EALLOW;
SysCtrlRegs.WDCR = 0x0028;
EDIS;
// Step 6. IDLE loop. Just sit and loop forever (optional):
for(;;)
{
LoopCount++;
ServiceDog();
}
}
interrupt void wakeint_isr(void)
{
WakeCount++;
// Acknowledge this interrupt to get more from group 1
PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;
}
void ServiceDog(void)
{
EALLOW;
SysCtrlRegs.WDKEY = 0x0055;
SysCtrlRegs.WDKEY = 0x00AA;
EDIS;
}
本实验中 WakeCount 是进入wakeint_isr 中断一次以后加1.
在程序段
for(;;)
{
LoopCount++;
// Uncomment ServiceDog to just loop here
// Comment ServiceDog to take the WAKEINT instead
ServiceDog();
}
中不断地喂狗,,主程序进不了中断, WakeCount不会+1,一直为零。
如果把这段程序注释掉。就会不停进入中断。WakeCount就会一直增加。