MSP430教程10MSP430单片机WDT看门狗定时器解析.docx
- 文档编号:6566968
- 上传时间:2023-01-08
- 格式:DOCX
- 页数:11
- 大小:18.17KB
MSP430教程10MSP430单片机WDT看门狗定时器解析.docx
《MSP430教程10MSP430单片机WDT看门狗定时器解析.docx》由会员分享,可在线阅读,更多相关《MSP430教程10MSP430单片机WDT看门狗定时器解析.docx(11页珍藏版)》请在冰豆网上搜索。
MSP430教程10MSP430单片机WDT看门狗定时器解析
看门狗定时器用来防止程序因供电电源、空间电磁干扰或其它原因引起的强烈干扰噪声而跑飞的事故。
程序中设置看门狗清零指令WDTCTL=WDTPW+WDTCNTCL,当程序跑飞不能及时清零看门狗,导致看门狗溢出复位,这样程序可以恢复正常运行状态。
一、WDT寄存器包括WDTCNT和WDTCTL,两个寄存器在上电和系统复位内容全部清零
1.记数单元WDTCNT:
WDTCNT是16位增记数器,由MSP430选定的时钟电路产生的固定周期脉冲信号对记数器进行加法记数。
WDTCNT不能直接软件存取,必须通过看门狗定时器的控制寄存器WDTCTL来控制。
2.控制寄存器WDTCTL:
WDTCTL由两部分组成,高8位用作口令,即5AH(头文件中定义为WDTPW),低8位是对WDT操作的控制命令。
写入WDT控制命令时先写入口令WDTPW,口令写错将导致系统复位。
读WDTCTL时不需口令,低字节WDTCTL的值,高字节读出始终为69H。
bit 15-8 7 6 5 4 3 2 1 0
口令 HOLD NMIES NMI TMSEL CNTCL SSEL IS1 IS0
IS1SI0 选择看门狗定时器的定时输出,T为WDTCNT的输入时钟源周期。
TMSELWDT工作模式选择
0 0 T*2的15次方 0 看门狗模式
0 1 T*2的13次方 1 定时器模式
1 0 T*2的9次方 NMI 选择RST/NMI引脚功能
1 1 T*2的6次方 0 RST/NMI为复位端
SSEL 选择WDTCNT的时钟源 1 RST/NMI为非屏蔽中断输入
0 SMCLK
1 ACLK
NMIES 选择NMI中断的边沿触发方式 HOLD 停止看门狗定时器工作
0 上升沿触发NMI中断 0 看门狗功能激活
1 下降沿触发NMI中断 1 时钟禁止输入,记数停止
二、WDT的操作
1.用户通过设置WDTCTL中的TMSEL和HOLD控制位使WDT工作在看门狗模式、定时器模式和低功耗模式三种模式。
a.看门狗模式(TMSEL=0,HOLD=0) 如果记数时间到,就会产生复位和激活系统上电清除信号,系统从上电复位的地址重启动 中断向量为RESET_VECTOR
b.定时器模式(TMSEL=1,HOLD=0) 这一模式产生选定时间的周期性中断 中断标志位为WDTIFG 中断向量为WDT_VECTOR
c.低功耗模式(TMSEL=X,HOLD=1) WDTCTL=WDTPW+WDTHOLD;
2.WDT通过SSEL和IS0IS13位可以确定与8种时钟源相关的时间(ACLK=32768Hz,SMCLK=1MHz)
WDT_MDLY_32 WDT_MRST_32
WDT_MDLY_8 WDT_MRST_8
WDT_MDLY_0_5 WDT_MRST_0_5
WDT_MDLY_0_064 WDT_MRST_0_064
WDT_ADLY_1000 WDT_ARST_1000
WDT_ADLY_250 WDT_ARST_250
WDT_ADLY_16 WDT_ARST_16
WDT_ADLY_1_9 WDT_ARST_1_9
三、看门狗应用
使用看门狗定时器产生一个方波(周期性取反P1.0)
#include"msp430x201x.h"
voidmain(void)
{
WDT=WDT_MDLY_32;
IE1|=WDTIE;
P1DIR|=0x01;
_EINT();
for(;;)
{
_BIS_SR(CPUOFF);
_NOP();
}
}
interrupt[WDT_VECTOR]voidwatchdog_timer(void)
{
P1OUT^=0x01;
}
//MSP430x5xx
//-----------------
///|\|XIN|-
//||XOUT|-
//--|RST|
//|P1.7|-->S1
//|P1.0|-->LED
#include
//函数声明
voidtimerA0_ini(void);
voidtimerA1_ini(void);
voidclk_set(void);
voidS1_ini(void);
unsignedintflag=0;
unsignedintflagFREQ=3;
unsignedintCCR0=100;
unsignedintstep=1;
unsignedintstep_default=1;
voidmain(void)
{
WDTCTL=WDTPW+WDTHOLD;//StopWDT
clk_set();
P1DIR|=BIT2;//P1.2output
P1DIR|=BIT3+BIT4+BIT5;
P1OUT&=0xC7;
P1SEL|=BIT2;
timerA0_ini();
timerA1_ini();
S1_ini();
_EINT();
while
(1);
}
#pragmavector=TIMER1_A0_VECTOR
__interruptvoidTIMER1_A0_ISR(void)
{
if(flag==0)
{
TA0CCR1+=step;
if(TA0CCR1>=TA0CCR0)
{
flag=1;
}
}
elseif(flag==1)
{
TA0CCR1-=step;
if(TA0CCR1<=0)
{
flag=0;
}
}
}
/***************************************************
**Name:
PORT1_ISR
**description:
PORT1中断服务函数,按键S1按下时在P1.7
**description产生中断,此时更新CCR0值,实现更改LED
**description闪烁频率的增减
**input:
延时时间(ms)
**output:
N/A
****************************************************/
#pragmavector=PORT1_VECTOR
__interruptvoidPORT1_ISR(void)
{
__delay_cycles(1000);
if(P1IFG&BIT7)
if(flagFREQ>=5)
{
flagFREQ=1;
}
else
{
flagFREQ++;
}
TA1CCR0=32768/(200/flagFREQ);
P1OUT=(P1OUT&0xC7)|flagFREQ<<3;
//_EINT();
P1IFG&=~BIT7;
}
voidtimerA1_ini(void)
{
//timerA初始化
TA1CCR0=546;
TA1CTL=TASSEL__ACLK+MC__UP+TACLR;
TA1CCTL0=CCIE;
}
voidtimerA0_ini(void)
{
//timerA初始化
TA0CCR0=100;
TA0CCR1=0;
TA0CTL=TASSEL__SMCLK+MC__UP+TACLR;
TA0CCTL1=OUTMOD_3;
}
/***************************************************
**Name:
S1_ini
**description:
S1开关管脚中断初始化
**input:
N/A
**output:
N/A
***************************************************/
voidS1_ini(void)
{
P1REN|=BIT7;//使能P1.7端口电阻
P1OUT|=BIT7;//设置P1.7端口电阻为上拉(如果该位置低,则设置成下拉电路)
P1IES|=BIT7;//选择触发边沿,下降沿触发volatile
P1IE|=BIT7;//打开P1.7的中断
P1IFG&=0x00;//清零中断标志位
}
voidclk_set(void)
{
P5SEL|=BIT2+BIT3;//PortselectXT2
UCSCTL6&=~XT2OFF;//EnableXT2
UCSCTL3|=SELREF_2;//FLLref=REFO
//SinceLFXT1isnotused,
//sourcingFLLwithLFXT1cancause
//XT1OFFGflagtoset
UCSCTL4|=SELA_2;//ACLK=REFO,SMCLK=DCO,MCLK=DCO
//LoopuntilXT1,XT2&DCOstabilizes-inthiscaseloopuntilXT2settles
do
{
UCSCTL7&=~(XT2OFFG+XT1LFOFFG+DCOFFG);
//ClearXT2,XT1,DCOfaultflags
SFRIFG1&=~OFIFG;//Clearfaultflags
}while(SFRIFG1&OFIFG);//Testoscillatorfaultflag
UCSCTL6&=~XT2DRIVE0;//DecreaseXT2Driveaccordingto
//expectedfrequency
UCSCTL4|=SELS_5+SELM_5;//SMCLK=MCLK=XT2
UCSCTL6=(UCSCTL6&DIVS_0)|DIVS_4;
}
/*
*main.c
*/
#include"msp430f5529.h"
voidS1_ini(void);
voidmain(void){
WDTCTL=WDTPW+WDTHOLD;
P1DIR|=BIT0;
S1_ini();
_EINT();
while
(1);
}
voidS1_ini(void)
{
P1REN|=BIT7;//使能P1.7端口电阻
P1OUT|=BIT7;//设置P1.7端口电阻为上拉(如果该位置低,则设置成下拉电路)
P1IES|=BIT7;//选择触发边沿,下降沿触发
P1IE|=BIT7;//打开P1.7的中断
P1IFG&=~BIT7;//清零中断标志位
}
#pragmavector=PORT1_VECTOR
__interruptvoidPORT1_ISR(void)
{
__delay_cycles(1000);
if(P1IFG&BIT7)
{
P1OUT^=BIT0;
P1IFG&=~BIT7;
}
}
//***************************************************************************************
//MSP430BlinktheLEDDemo-SoftwareToggleP1.0
//
//Description;ToggleP1.0byxor'ingP1.0insideofasoftwareloop.
//ACLK=n/a,MCLK=SMCLK=defaultDCO
//
//MSP430x5xx
//-----------------
///|\|XIN|-
//|||
//--|RSTXOUT|-
//||
//|P1.0|-->LED
//
//J.Stevenson
//TexasInstruments,Inc
//July2011
//BuiltwithCodeComposerStudiov5
//***************************************************************************************
#include
intmain(void)
{
WDTCTL=WDTPW+WDTHOLD;//Stopwatchdogtimer
P1DIR|=0x01;//SetP1.0tooutputdirection
for(;;)
{
volatileunsignedinti;//volatiletopreventoptimization
P1OUT^=0x01;//ToggleP1.0usingexclusive-OR
i=32768;//SWDelay
do
{
i--;
}while(i!
=0);
}
}
/*
*main.c
*
*Createdon:
Nov14,2014
*Author:
shiqingfeng
*/
#include"msp430.h"
voidtimerA0_set(unsignedlongf);
main()
{
WDTCTL=WDTPW+WDTHOLD;
P1DIR|=BIT1;
P1SEL|=BIT1;
timerA0_set(3);
while
(1);
}
voidtimerA0_set(unsignedlongf)//willbesetas200Hz(default)
{
unsignedlongafreq=32768;
TA0CCR0=afreq/f-1;//PWMPeriod
TA0CCTL0=OUTMOD_4;//CCR1TOGGLE
TA0CTL=TASSEL__ACLK+MC__UP+TACLR;//SMCLK,upmode,clearTAR
}
/*
*main.c
*
*Createdon:
Nov14,2014
*Author:
shiqingfeng
*/
#include"msp430f5636.h"
voidtimerA0_set(unsignedlongf);
main()
{
WDTCTL=WDTPW+WDTHOLD;
P1DIR|=BIT2;
P1OUT|=BIT2;
timerA0_set(3);
_EINT();
while
(1);
}
voidtimerA0_set(unsignedlongf)
{
unsignedlongafreq=32768;
TA0CCR0=afreq/f-1;//PWMPeriod
TA0CTL=TASSEL__ACLK+MC_1+TACLR+TAIE;//ACLK,upmode,clearTAR
}
#pragmavector=TIMER0_A1_VECTOR
__interruptvoidTIMERA1_ISR(void)
{
switch(__even_in_range(TA0IV,14))
{
case0:
break;//Nointerrupt
case2:
break;//CCR1notused
case4:
break;//CCR2notused
case6:
break;//reserved
case8:
break;//reserved
case10:
break;//reserved
case12:
break;//reserved
case14:
P1OUT^=BIT2;//overflow
break;
default:
break;
}
}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- MSP430 教程 10 单片机 WDT 看门狗 定时器 解析