MSP430教程10:MSP430单片机WDT看门狗定时器解析
- 格式:doc
- 大小:54.00 KB
- 文档页数:13
MSP430MSP430一、上电复位POR 和上电清除PUC二、低功耗控制但系统时钟发生器基本功能建立之后,CPU内的状态寄存器SR中的SCG1、SCG2、OscOff、CpuOff是低功耗的重要控制位;系统工作模式一共有6种,1种活动模式和5种低功耗模式;可以通过设置控制位使MSP430进入低功耗模式,由中断唤醒CPU,在执行完中断服务程序之后再回到低功耗模式,也可以在执行中断程序的时候间接访问堆栈修改状态寄存器的值,这样中断程序执行完之后就会进入另外一种低功耗模式或者处于活动模式。
三、时钟模块(一)、MSP430F149有三个时钟输入源:1、LFXT1CLK:如果LFXTCLK没有作用于SMCLK、MCLK信号,可以用OscOff置位以禁止LFXT1CLK工作;2、XT2CLK:若XT2CLK没有作用于SMCLK、MCLK信号,可以用控制位XT2OFF 关闭XT2;3、DCO振荡器:MSP430F149的两个外部振荡器产生的时钟信号都可以经过1、2、4、8分频后用作系统主时钟MCLK;当外部振荡器失效后,DCO 振荡器会自动被选作MCLK 的时钟源;(二)、MSP430F149提供3三种时钟信号:1、ACLK----辅助时钟,一般用于低速外设,由LFXT1CLK信号分频而得;2、MCLK----系统通过主时钟,一般用于CPU和系统,由以上三个时钟源任意一个分频而得;3、SMCLK---主要用于高速外设,由XT2CLK+XT2CLK 或LFXT1CLK+DCO分频而得。
(三)、如何控制MSP430的DCOCLK频率?——时钟模块的控制由5个寄存器来完成1、DCOCTL:定义8总频率之一2、BCSCTL1:控制XT2CLK的开启与关闭;控制LFXT1CLK的工作模式(低频或高频,高频下需要接高频时钟源);控制ACLK分频。
3、BCSCTL2选择MCLK时钟源;选择MCLK分频;选择SMCLK时钟源;选择SMCLK时钟源分频。
对于学习新的单片机来说,就我个人意见在知道基本功能后应该先掌握定时器的用法,可以能帮助你很快的掌握单片机的用法并尽快能进行单片机的应用,所以对于430我也同样先掌握定时器的用法。
msp430单片机一共有5种类型的定时器,看门狗定时器(WDT)、基本定时器(Basic Timer1)、8位定时器/计数器(8-bit Timer/Counter)、定时器A(Timer_A)和定时器B(Timer_B)。
但是这些模块不是所有msp430型号都具有的功能。
1、看门狗定时器(WDT)学过电子的人可能都知道,看门狗的主要功能就是当程序发生故障时能使受控系统重新启动。
msp430中它是一个16位的定时器,有看门狗和定时器两种模式。
2、基本定时器(Basic Timer1)基本定时器是msp430x3xx和msp430F4xx系列器件中的模块,通常向其他外围提供低频控制信号。
它可以只两个8位定时器,也可以是一个16位定时器。
3、8位定时器/计数器(8-bit Timer/Counter)如其名字所示,它是8位的定时器,主要应用在支持串行通信或数据交换,脉冲计数或累加以及定时器使用。
4、16位定时器A和B定时器A在所有msp430系列单片机中都有,而定时器B在msp430f13x/14x和msp430f43x/44x等器件中出现,基本的结构和定时器A是相同的,由于本人最先熟悉并应用的是定时器A所以在这里就主要谈一下自己对定时器A的了解和应用。
定时器A是16位定时器,有4种工作模式,时钟源可选,一般都会有3个可配置输入端的比较/捕获寄存器。
并且有8种输出模式。
通过8种输出模式很容易实现PWM波。
我先给出我的一个应用程序,然后通过程序来书名定时器A的基本用法。
程序如下:void init_TimerA ( void ){CCTL0 = CCIE; // 开启比较器0中断CCR0 = 32768; // 1S秒的定时CCTL1 = CCIE; // 开启比较器1中断CCR1 = 100; // 3.66mS显示延迟TACTL = TASSEL_1 + MC_1; // 开启定时器}#pragma vector = TIMERA0_VECTOR__interrupt void Timer_A0(void){time_flag = 1; // 时间变动标志if(time_stop == 1) // 设置模式标志time[0] ++; // 秒加1start_ADC12(); // 开启AD}#pragma vector = TIMERA1_VECTOR__interrupt void Timer_A1 ( void ){unsigned char tmp;tmp = TAIV;if ( tmp == 2 ) // 比较器1中断{led_flag = 1; // 刷新显示标志CCR1 += 100; // 3.35mSif ( CCR1 >= 32768 )CCR1 -= 32768;}if ( tmp == 4 ) // 比较器2中断{keyread_flag = 1; // 读取键值标志CCR2 += 5000; // 152.6mS长按键自加间隔if ( CCR2 >= 32768 )CCR2 -= 32768;}LPM3_EXIT; // 退出低功耗}定时器A大致可分为四个功能模块:计数器、比较/捕获寄存器0、比较/捕获寄存器1、比较/捕获寄存器2。
016:MSP430_WDT看门狗定时器1, 看门狗定时器概述看门狗定时器(WDT)是 MSP430 系列单⽚机中常⽤的⼀种部件。
在⼯业现场,往往会由于供电电源、空间电磁⼲扰或其他原因引起强烈的⼲扰噪声。
这些⼲扰作⽤于数字器件,极易使其产⽣误动作,从⽽失去应有的控制功能,引起 MSP430 发⽣“程序跑飞”事故。
若不进⾏有效的处理,程序就不能回到正常的状态,从⽽失去应有的控制功能。
看门狗定时器正是为了解放这类问题⽽产⽣的,尤其是在具有循环结构的程序任务中更为有效。
在正常操作器件,⼀次 WDT 定时时间到,将产⽣⼀次器件复位。
如果通过编制程序使 WDT 定时时间稍⼤于程序执⾏⼀遍所⽤的时间时,并且程序执⾏过程中都有对看门狗定时器清零的指令,使计数器重新计数,则程序正常执⾏时,就会在 WDT 定时时间到达之前对 WDT 清零,不会产⽣ WDT 溢出,如果由于⼲扰使程序跑飞,则不会在 WDT 定时时间到达之前执⾏ WDT 清零指令,WDT 就会产⽣溢出,从⽽产⽣系统复位 CPU 需⽤重新运⾏⽤户程序,这样程序就可以⼜恢复正常运⾏状态。
MSP430 看门狗除了具有上述系统监测的特定⽤途之外,还可以作为内部定时器来使⽤,当选择的时间到达之后,和其他定时器⼀样产⽣⼀个定时中断。
此外 WDT 还可以被完全停⽌活动以⽀持超低功耗应⽤2 看门狗定时器结构3 看门狗定时器寄存器[1] WDTCTL 看门狗控制寄存器WDTCTL 由两部分组成:⾼ 8 位是对 WDT 操作的控制命令。
要写⼊操作 WDT 的控制命令,出于安全原因必须先正确写⼊⾼字节看门狗⼝令。
⼝令位 5AH,如果⼝令写错将导致系统复位。
读 WDTCTL 时,不需要⼝令,可直接读取地址 120H 中的内容,读出数据低字节位 WDTCTL 的值,⾼字节始终位 69H。
WDTCTL 除了看门狗定时器的控制位之外,还有两个⽤于设置 NMI 引脚功能。
WDTISx:选择看门狗定时器的计时输出其中 T 是 WDTCNT 的输⼊时钟源周期。
Msp430系列单片机的定时器实验1.看门狗定时器(WDT)1.1实验介绍计数单元WDTCNT:不能直接通过软件存取,必须通过WDTCTL来控制。
控制寄存器WDTCTL高8位为口令:写5AH,读69H低8位为WDT操作的控制命令HOLD:停止看门狗定时器工作。
0 :激活;1 :停止WDTSSEL:时钟源选择TMSEL:工作模式选择。
0:看门狗;1 :定时CNTCL:该位为1时,WDTCNT清除IS2、IS1、IS0:选择看门狗定时器的定时长度1.2 实验目的学会使用看门狗定时器(WDT)。
熟悉WDT相关寄存器1.3 实验原理1.4 实验步骤(1) 将PC 和板载仿真器通过USB 线相连;(2) 打开CCS 集成开发工具,选择Project->Import Existing CCS Eclipse Project,导入MSP430F6638_DemoV2.0\11.WTD 文件夹中的工程;(3) 选择对该工程进行编译链接,生成.out 文件。
然后选择,将程序下载到实验板中。
程序下载完毕之后,可以选择全速运行程序,也可以选择单步调试程序,选择F3 查看具体函数。
也可以程序下载之后,按下,软件界面恢复到原编辑程序的画面。
再按下实验板的复位键,运行程序。
(调试方式下的全速运行和直接上电运行程序在时序有少许差别,建议上电运行程序)。
1.5 实验现象实验板上对应的LED灯以一定周期闪烁。
1.6 关键代码实验一:#include<msp430f6638.h>void main(void){volatile unsigned int i;volatile unsigned int count=0;WDTCTL = WDTPW+WDTHOLD; // Stop WDTP4DIR |= BIT1 + BIT2 + BIT3; // P4.1,P4.2,P4.3 set as outputP4OUT &= ~(BIT1 + BIT2 + BIT3); // P4.1,P4.2,P4.3 set "0"for (i=0;i<60000;i++) ; //延时大约60msP4OUT |= (BIT1 + BIT2 + BIT3); // P4.1,P4.2,P4.3 set "1"for (i=0;i<60000;i++) ; //延时大约60msWDTCTL=WDTPW+WDTIS_4; //启动看门狗while(1) ; // continuous loop}实验二:#include<msp430f6638.h>void main(void){volatile unsigned int i;volatile unsigned int count=0;WDTCTL = WDTPW+(WDTCTL&0xff)+WDTHOLD; // Stop WDTP4DIR |= BIT1 + BIT2 + BIT3; // P4.1,P4.2,P4.3 set as outputP4OUT &= ~(BIT1 + BIT2 + BIT3); // P4.1,P4.2,P4.3 set "0"for (i=0;i<60000;i++) ; //延时大约60msP4OUT |= (BIT1 + BIT2 + BIT3); // P4.1,P4.2,P4.3 set "1"for (i=0;i<60000;i++) ; //延时大约60msWDTCTL=WDTPW+(WDTCTL&0xff)-WDTHOLD; //启动看门狗while(1){// WDTCTL=WDTPW+WDTCTL&0xff+WDTCNTCL; //计数器清零};分析:实验一与实验二结果相同,只不过在每个周期结束启动看门狗定时器时修改的寄存器参数不同。
MSP430单片机看门狗的使用
1、看门狗有三种工作模式:停止模式,计时器模式,看门狗模式。
2、其中后两种模式可以选择的时钟源有:SMCLK 和ACLK。
3、使用后两种模式时要注意单片机所处的状态下看门狗能否工作,如单片
机处在LPM3 时只有ACLK 时钟,处在LPM4 下,没有时钟可以使用。
4、看门狗模式的使用方法
当看门狗计数溢出时,程序复位。
在程序中开启看门狗,在计数溢出前清空看门狗,或重置看门狗,以使其重新计数。
若程序跑飞,看门狗可能没有被清空或重置,就会溢出,使程序复位。
5、MSP430F2274 中,看门狗模式下可以计时最长为1s,若需要以更长的时间复位,可采取的方法,使用其他计数器,计数满后执行((void(*)())
RESET_VECTOR)();或计数满后往看门狗控制寄存器写个错误值或执行一条无效命令:如((void(*)())0x170)();0x170 是外围模块的一个地址,不可能是一个函数地址,所以执行此句将使程序复位。
6、看门狗的具体使用
6.1、停止模式:关闭看门狗
C 语言实现:WDTCTL = WDTPW + WDTHOLD
6.2、计时器模式:作为一个计时器使用,计数器满产生中断时执行看门狗中断函数。
C 语言实现:
主程序中开启看门狗计时器,如:WDTCTL = WDT_MDLY_8;
看门狗中断函数为:
#pragmavector=WDT_VECTOR。
MSP430学习点滴——看门狗定时器看门狗有三种工作模式:停止模式,计时器模式,看门狗模式。
控制寄存器WDTCTL 由两部分组成,高8 位用作口令,低8 位实现对WDT 的控制操作。
要实现对WDT 的操作控制,必须先写入高字节看门狗口令。
口令为5AH,头文件里一般将WDTPW 宏定义为5AH.WDTCTL 寄存器各位定义如下:15~8 7 6 5 4 3 2 1 0 口令HOLD NMIES NMI TMSEL CNTCL SSEL IS1 IS0IS0 IS1 选择看门狗定时器的定时输出,其中T 是WDTCNT 的输入时钟源周期。
一般宏定义WDTIS0 为0x0001,WDTIS1 为0x0002. 0 T*2(PUC 复位后的值)1 T*22 T*23 T*2SSEL选择WDTCNT 的时钟源。
一般宏定义WDTISSEL 为0x0004. 0 SMCLK (PUC 复位后的值) 1 ACLKCNTCL 当该位为1 时清除WDTCTL。
一般宏定义WDTCNTL 为0x0008.TMSEL 工作模式的选择。
一般宏定义WDTTMSEL 为0x0010. 0 看门狗模式(默认) 1 定时器模式NMI选择RST/NMI 引脚功能,在PUC 后被复位。
一般宏定义WDTNMI 为0x0020.0 RST/NMI 引脚为复位端 1 RST/NMI 引脚为边沿触发的非屏蔽中断输入。
NMIES 选择中断的边沿触发方式。
一般宏定义WDTNMIES 为0x0040. 0 上升沿触发NMI 中断1 下降沿触发NMI 中断HOLD 停止看门狗定时器工作降低功耗。
一般宏定义WDTHOLD 为0x0080. 0 WDT 功能激活1 时钟禁止输入,计数停止。
因此,可以根据WDTCTL 寄存器的TMSEL 和HOLD 控制位设置WDT 工作在看门狗模式、定时器模式和低功耗模式。
C 语言实现低功耗模式的语句:WDTCTL = WDTPW + WDTHOLD;C 语言实现定时器模式的语句:WDTCTL =WDTPW+WDTTMSEL+WDTCNTCL+WDTIS0;C 语言实现看门狗模式的语句:设置看门狗:WDTCTL = WDT_MRST_0_5。
MSP4301.时钟控制:430三个时钟源:LFXT1CLK低频时钟源,XT2CLK,高频时钟源,DCOCLK数控RC 振荡器。
2.三种时钟源可提供三种时钟信号:1.ACLK辅助时钟:ACLK是LFXT1CLK信号经过1、2、4、8分频得到的。
ACLK可由软件选作外围器件的时钟信号。
2.MCLK系统主时钟:可由软件来设置来源于低频时钟源,高频,数控。
之后可再经过1、2、4、8分频得到。
MCLK主要用于CPU和系统。
3.SMCLK:可有软件选这高频时钟来源,用于高速外围设备。
其中P1.4/SMCLK, P2.0/ACLK, P5.5/SMCLK, P5.6/ACLK。
时钟信号输出,可由PnSEL|=0xXX,l来设置特殊功能端口。
4.三个振荡器的控制位:1.低频LFXT1:OscOff;2.高频XT2CLK:XT2OFF;3.DCO:SCG0;5.一、时钟模块主要由三个寄存器来进行控制。
1.DCOCTL DCO控制器高三位:DCO.2、DCO.1 DCO.0定义8种频率之一,相邻两位相差10%,第五位详细调整频率。
其中DCO为7时表示选择最高频率。
2.BCSCTL1基本时钟控制器1位数7(最高)---XT2OFF:控制XT2的开启与关闭,0:开启;1:关闭。
6---------XTS:控制LFXT1工作模式:0:低频工作模式32768HZ;1:高频工作模式(前提接了相应的高频晶振)。
5,4--------DIV.1、DIV.0:控制ACLK分频(ACLK时钟来源于LFXT1)0:不分;1: 2分;2: 4分;3:8分;3-------XT5V:此位设置为0;2,1,0-----Rsel.0~Rsel.2 :0~7:最低标频~最高标频。
3.BCSCTL27,6-------SELM.1,SELM.0:选择MCLK时钟源(系统主时钟)0,1:DCOCLK为时钟源2:XT2CLK为时钟源3:时钟源为LFXT1CLK5,4-------DIVM.0,DIVM.1 选择MCLK分频。
MSP430看门狗定时器2.WDT interrupt:看门狗有两种工作模式,watchdog mode, interval mode。
WDTIFG 置位的两种情况:在看门狗模式下发生看门狗溢出。
在间隔定时模式下发生定时溢出,且全局中断使能GIE 和WDTIE 均开启。
WDTIFG 在中断服务程序后会自动清除该标记。
3.WDTCTLWDTPW:必须写0x5A.WDTHOLD:停止看门狗就设为1.WDTNMIES: NMI下降沿为1,上升沿为0.WDTNMI: NMI 为1.WDTTMSEL:间隔定时器模式设为1.WDTCNTCL:通过该位来清除WDT 计数器的值通常设为1 表示清除到0.WDTSSEL:设置时钟源ACLK(辅助系统时钟)为1,SMCLK(子系统时钟)为0.WDTISx:设置时间间隔。
0-3 对应不同的分频。
4.WDT 程序:默认在中断中SR 清零,也就是GIE 是0,所以默认不会发生中断嵌套。
只有在中断服务程序中打开GIE 才能发生中断嵌套。
#include unsigned int i=0;void main(void){WDTCTL = WDT_MDLY_32;// Set Watchdog Timer interval to ~30msIE1 |= WDTIE; // Enable WDT interruptP2DIR =0xFF; // Set P1.0 to output directionP2OUT = 0xFF;_BIS_SR(LPM0_bits + GIE); // Enter LPM0 w/ interrupt}// Watchdog Timer interrupt service routine#pragma vector=WDT_VECTOR__interrupt void watchdog_timer(void){P2OUT =。
实验四定时器实验实验目的:MPS430F5529片内集成的定时器A的使用,学习计数器的补捕获比较模块的使用。
实验内容:定时器采用辅助时钟ACLK作为计数脉冲,fACLK=32768Hz,实现以下功能:1.定时器TA0延时1s,点亮或熄灭LED6,即灯亮1s灭1s,如此循环,采用中断服务程序实现。
2.定时器TA0延时1s,点亮或熄灭LED4,采用捕获比较器CCR0的比较模式,设定输出方式,输出方波,不用中断服务程序3.采用捕获比较器CCR1的比较模式LED5,设定输出方式,输出PWM波形,使LED 亮2s,灭1s。
4.用定时器实现30s倒计时,在液晶模块上显示,每过一秒显示数字变化一次。
5.使用TA1的捕获比较器CCR0捕获按键的间隔时间,在液晶模块上显示。
程序代码:程序1:#include <msp430f5529.h>void main(){WDTCTL = WDTPW + WDTHOLD; //关看门狗P1DIR |= BIT3; //设置P1.0口方向为输出。
TA0CCTL0 = CCIE; //设置捕获/比较控制寄存器中CCIE位为1,//CCR0捕获/比较功能中断为允许。
TA0CCR0 = 32767; //捕获/比较控制寄存器CCR0初值为32767TA0CTL = TASSEL_1 + MC_1+TACLR; //设置定时器A控制寄存器TACTL,//使时钟源选择为SMCLK辅助时钟。
//进入低功耗模式LPM0和开总中断_BIS_SR(LPM0_bits +GIE);}//定时器A 中断服务程序区#pragma vector=TIMER0_A0_VECTOR__interrupt void Timer_A (void){P1OUT ^= BIT3; //P1.0取反输出}实验现象:实验开始后,实验板上LED6亮灭闪烁,间隔为1s。
程序2:#include <msp430f5529.h>void main(void){WDTCTL = WDTPW + WDTHOLD; // 关狗P1DIR |= BIT1; // P1.1 设置为输出P1SEL |= BIT1; // P1.1 输出使能TA0CCR0 = 60000; // PWM PeriodTA0CCTL0 = OUTMOD_4; // CCR1 模式4TA0CCR1 = 30000; // CCR1 PWM duty cycleTA0CTL = TASSEL_1 + MC_1 + TACLR; // ACLK, up mode, clear TAR__bis_SR_register(LPM3_bits); // Enter LPM3__no_operation(); // For debugger}实验现象:实验开始后,实验板上LED4亮灭闪烁,间隔为1s。
看门狗定时器用来防止程序因供电电源、空间电磁干扰或其它原因引起的强烈干扰噪声而跑飞的事故。
程序中设置看门狗清零指令 WDTCTL=WDTPW+WDTCNTCL,当程序跑飞不能及时清零看门狗,导致看门狗溢出复位,这样程序可以恢复正常运行状态。
一、WDT寄存器包括WDTCNT和WDTCTL,两个寄存器在上电和系统复位内容全部清零1.记数单元WDTCNT:WDTCNT是16位增记数器,由MSP430选定的时钟电路产生的固定周期脉冲信号对记数器进行加法记数。
WDTCNT不能直接软件存取,必须通过看门狗定时器的控制寄存器WDTCTL来控制。
2.控制寄存器WDTCTL:WDTCTL由两部分组成,高8位用作口令,即5AH(头文件中定义为WDTPW),低8位是对WDT操作的控制命令。
写入WDT控制命令时先写入口令WD TPW,口令写错将导致系统复位。
读WDTCTL时不需口令,低字节WDTCTL的值,高字节读出始终为69H。
bit 15-8 7 6 5 43 2 1 0口令 HOLD NMIES NMI TMSEL CNTCL SSEL IS1 IS 0IS1 SI0 选择看门狗定时器的定时输出,T为WDTCNT的输入时钟源周期。
TMSEL WDT 工作模式选择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 SMCLK1 ACLKNMIES 选择NMI中断的边沿触发方式 HOLD 停止看门狗定时器工作0 上升沿触发NMI中断 0 看门狗功能激活1 下降沿触发NMI中断 1 时钟禁止输入,记数停止二、WDT的操作1.用户通过设置WDTCTL中的TMSEL和HOLD控制位使WDT工作在看门狗模式、定时器模式和低功耗模式三种模式。