第四章 MSP430F149看门狗定时器
msp430f149技术资料
MSP430是德州公司新开发的一类具有16位总线的带FLASH的单片机,由于其性价比和集成度高,受到广大技术开发人员的青睐.它采用16位的总线,外设和内存统一编址,寻址范围可达64K,还可以外扩展存储器。
具有统一的中断管理,具有丰富的片上外围模块,片内有精密硬件乘法器、两个16位定时器、一个14路的12位的模数转换器、一个看门狗、6路P口、两路USART通信端口、一个比较器、一个DCO内部振荡器和两个外部时钟,支持8M的时钟。
由于为FLASH型,则可以在线对单片机进行调试和下载,且JTAG口直接和FET(FLASH EMULATION TOOL)的相连,不须另外的仿真工具,方便实用,而且,可以在超低功耗模式下工作,对环境和人体的辐射小,测量结果为100mw左右的功耗(电流为14mA左右),可靠性能好,加强电干扰运行不受影响,适应工业级的运行环境,适合与做手柄之类的自动控制的设备.我们相信MSP430单片机将会在工程技术应用中得以广泛应用,而且,它是通向DSP系列的桥梁,随着自动控制的高速化和低功耗化,MSP430系列将会得到越来越多人的喜爱。
第三章MSP430F149 资源的应用介绍及开发第一节中断介绍及存储器段介绍中断在MSP430中得以广泛的应用,它可以快速进入中断程序,之后返回中断前的状态,其时序为:PC执行程序中断允许置位SR中的GIE置位 EINT(中断开)中断到,中断标志位(IFG)置位从中断向量表中读取中断程序的入口地址,进入中断程序执行中断程序中断允许位复位 RETI中断返回回到原来地址。
具体应用将会在应用程序中的到应用。
有关中断源和中断优先级及中断允许位、中断标志位在参考资料1上有详细介绍。
MSP430单片机的片上存储器共为64K,表示为图:第三节 P 口MSP430F149有6个8位的P口,其中P1、P2口占两个中断向量,共可以接16 个中断源,还可以直接利用 P口的输入输出寄存器,直接对外进行通信。
MSP430F149寄存器整理
各个模块的寄存器:1)CPU内部寄存器(状态寄存器SR)2)外围模块寄存器和特殊寄存器中断使能寄存器(IE1)UTXIE0USART0模块的传输中断使能控制比特。
置1时模块的中断使能,0时关闭URXIE0USART0接收中断控制。
1中断使能、0中断关闭ACCVIEFLASH 存储器非法访问中断使能控制比特位。
1使能、0时关闭。
NMIE 非屏蔽中断使能控制。
1使能、0关闭OFIE 晶体出错中断使能控制。
1使能、0关闭WDTIE看门狗中断使能控制。
1使能看门狗中断、0关闭中断使能寄存器(IE2)****UTXIE15URXIE14********UTXIE1USART1模块传输中断使能控制。
1使能、0关闭URXIE1USART1模块接收中断使能控制。
1使能、0关闭中断标志寄存器(IFG1)UTXIFG07URXIFG 06**NMIIFG4****OFIFG 1WDTIFGUTXIFG0USART0传输中断标志位。
1时有中断产生、0没有URXIFG0USART0接收中断标志位。
1时有中断产生、0没有NMIIFG非屏蔽中断标志位。
1时有中断产生、0没有UTXIE07URXIE06ACCVIE5NMIIE4**3**2OFIE1WDTIEOFIFG晶体出错中断标志位。
1时有中断产生、0没有WDTIFG看门狗中断标志。
1时有中断产生、0时没有中断标志寄存器(IFG2)****UTXIFG15URXIFG14********UTXIFG1USART1传输中断标志位。
1时有中断产生、0时没有URXIFG1USART1接收中断标志位。
1时有中断产生、0时没有模块使能寄存器1(ME1)UTXE0 7URXE0USPIE0************UTXE0USART0的传输使能。
1时USART0传输模块使能、0时不工作URXE0 USPIE0USART作为UART时,该比特控制UART的接收功能,设置为1时接收模块使能,0时不工作;作为SPI时,设置为1,则SPI使能,0时SPI不工作。
MSP430F149定时器B讲解
MSP430F149定时器B1.定时器B模块:TimerB与TimerA大部分相同,不同点在于定时器B的捕获/比较单元增加了锁存器。
二者区别:(1)TimerB计数长度为8位,10位,12位,16位可编程,由TBCTL寄存器的CNTLx两位来配置,而定时器A的计数长度是固定的16位;(2)TimerB没有实现定时器A中的SCCI功能位的功能;(3)TimerB在比较模式下的捕获/比较寄存器功能与TimerA不同,增加了捕获比较锁存器;(4)有些芯片型号当中TimerB输出实现了高阻抗输出;(5)比较模式的原理有所不同:TimerA当中CCRx寄存器当中保存与TAR相比较的数据,而在TimerB 当中CCRx中保存要比较的数据,但并不直接与定时器TBR相比较,而是将CCRx当中的数据锁存到相应的锁存器之后,由锁存器与TBR相比较。
从捕获/比较寄存器相比较锁存器传输数据的过程的时间也是可编程的,可以是写入比较捕获寄存器之后立即传输,也可有一个定时器来触发传输。
(6)TimerB支持多种同步的定时功能,多重比较捕获功能和多重波形输出功能(PWM波)。
而且,通过对比较数据的两级缓冲,可实现多个PWM波同步周期更新。
2.TimerB的逻辑结构图:定时器B的逻辑结构基本与定时器A相同。
3.定时器B的寄存器:寄存器相关位的配置过程参考定时器A和数据手册。
4.定时器B的比较功能当定时器B工作在比较模式时,将数据写入捕获比较锁存器TBCCRx当中,当TBCCTLx当中的CLLDx位决定的装载事件的发生时,TBCCRx中的数据会自动地传输到比较寄存器当中。
5.TI提供的例程://// ////// MSP430F149// -----------------// /|| XIN|-// | | | HF XTAL (455k - 8MHz)// --|RST XOUT|-// | |// | P4.1/TB1|--> CCR1 - 75% PWM// | P4.2/TB2|--> CCR2 - 25% PWM//// M. Buccini// Texas Instruments Inc.// Feb 2005// Built with IAR Embedded Workbench Version: 3.21A//******************************************************************************。
MSP430单片机看门狗的使用
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。
MSP430F149看门狗及其应用
MSP430F149看门狗及其应用1、概述看门狗有两个作用:1、可以防止程序跑飞,若程序跑飞可让单片机复位;2、可作为间隔时间发生器,在中断中进行定期刷新显示、读取数据等对外设的操作。
2、设置不需要看门狗时可用软件关闭,设置:WDTCTL = WDTPW + WDTHOLD;为防止误触发操作WDTCTL需要先写入WDTPW。
作为间隔定时器时详细操作可见MSP430F149.H文件中的宏定义。
3、相关寄存器1、WDTCTL Watchdog Timer RegisterWDTPW Bits15-8Watchdog timer password. Always read as 069h. Must be written as 05Ah, ora PUC will be generated.WDTHOLD Bit 7 Watchdog timer hold. This bit stops the watchdog timer. Setting WDTHOLD= 1 when the WDT is not in use conserves power.0 Watchdog timer is not stopped1 Watchdog timer is stoppedWDTTMSEL Bit 4 Watchdog timer mode select0 Watchdog mode1 Interval timer modeWDTCNTCL Bit 3 Watchdog timer counter clear. Setting WDTCNTCL = 1 clears the count valueto 0000h. WDTCNTCL is automatically reset.0 No action1 WDTCNT = 0000h2、IE1 Interrupt Enable Register 1WDTIE Bit 0 Watchdog timer interrupt enable. This bit enables the WDTIFG interrupt forinterval timer mode. It is not necessary to set this bit for watchdog mode. Because other bits in IE1 may be used for other modules, it is recommendedto set or clear this bit using BIS.B or BIC.B instructions, rather than MOV.Bor CLR.B instructions.0 Interrupt not enabled1 Interrupt enabled4、设计实例4.1 利用WDT定时模式在中断函数中定时操作外设说明:#define WDT_MDLY_32 (WDTPW+WDTTMSEL+WDTCNTCL)void main(void){WDTCTL = WDT_MDLY_32; // Set Watchdog Timer interval to~30msIE1 |= WDTIE; // Enable WDT interruptP2DIR |= 0x01; // Set P1.0 to output direction_BIS_SR(LPM0_bits + GIE); // Enter LPM0 w/ interrupt}// Watchdog Timer interrupt service routine#pragma vector=WDT_VECTOR__interrupt void watchdog_timer(void){P2OUT ^= 0x01; // Toggle P1.0 using exclusive-OR}4.2 利用WDT定时模式延时WDTCTL = WDT_ADLY_1000;//延时1000ms //延时2sfor(i = 0; i < 3; i++){IFG1 &= ~WDTIFG;while(!(IFG1 & WDTIFG));}IFG1 &= ~WDTIFG;。
MSP430F149的ADC操作
MSP430F149的ADC操作1)ADC图解图1 ADC的原理图理解:1.ADC的时钟来源可以有四个(ACLK/MCLK/SMCLK/ADC12SO)由ADC12SSELx来选择。
并且可以由ADC12DIVx控制选择分频。
2.ADC的采样参考电压可以由SREF0,SREF1来选择四种参考电压。
3.INCHx控制选择模拟电压输入口。
4.SHSx选择控制方式。
2)ADC的内核1.ADC的转换公式当采样最高电压高过或等于参考电压的时候,是最大值0FFFH。
当采样最低电压低于或是等于参考电压的时候,是最小值000H。
2.控制ADC12的内核可以通过ADC12CTL0和ADC12CTL1两个寄存器来控制。
当不使用的时候可以通过ADC12ON位来控制关闭内核以达到低功耗的目的。
当修改转换使能标志ENC的时候,要先判断ADC12内核是否在进行转换工作,如果在转换工作期间关闭ENC(置零)那么最终得到错误的结果。
3)ADC的时钟来源ADC可以有四种时钟来源。
而ADC12OSC是ADC内置的一个时钟源,大概频率在5MHZ左右,不过该时钟源由个人设备、供电电压和外部温度的影响很大。
4)ADC的参考电压发生器ADC内部可以提供一个可以产生1.5V或是2.5V的产考电压发生器。
当设计使用的时候,需要将一个10uF的电容和一个0.1uF的电容并联到它的输出端。
而且使用的时候,打开发生器至少需要等待17ms以让参考电压达到一个稳定的值。
5)ADC的低功耗当ADC内核不适用的时候,它会自动进入关闭模式,在使用的时候自动苏醒。
而它的参考电压却不会自动关闭,要用手通过REFON手动关闭。
6)ADC的采样保持触发源它的触发源由四种选择。
1.ADC12SC位控制。
2.定时器A输出控制3.定时器B输出控制4.定时器B输出控制7)ADC的采样保持时间ADC的采样保持时间有两种模式。
1.拓展型采样时钟模式。
这个时候,采样的时间由SHI决定,也就是当SHI上升沿的时候开始采样,下降沿的时候结束采样。
msp430f149 PWM
#include <msp430x14x.h>#define Exterior_8MHz 0x55 //MCLK和SMCLK选择外部8M高频晶振#define u8 unsigned char#define u16 unsigned short#define u32 unsigned longvoid Delay_ms(u16 Time) //软件ms延时,1MHz频率下{#ifdef Exterior_8MHzu16 i,j,z;for(i=0;i<Time;i++)for(j=0;j<10;j++)for(z=0;z<158;z++);#elseu16 i,j;for(i=0;i<Time;i++)for(j=0;j<200;j++);#endif}void Delay_us( u16 Time ) //软件us延时,1MHz频率下{u16 i;for(i=0;i<Time;i++){_NOP();_NOP();}}void System_Clock_Init(void) //系统时钟源配置{#ifdef Exterior_8MHz/*------选择系统主时钟为8MHz-------*/u8 z;BCSCTL1 &= ~XT2OFF; //打开XT2高频晶体振荡器do{IFG1 &= ~OFIFG; //清除晶振失败标志for (z = 0xFF; z > 0; z--); //等待8MHz晶体起振}while ((IFG1 & OFIFG)); //晶振失效标志仍然存在?BCSCTL2 |= SELM_2 + SELS; //MCLK和SMCLK选择高频晶振#else/*------选择系统主时钟为DCO1MHz-------*/DCOCTL =0x00;BCSCTL1 &=~0x07; //清零DCOx,MODx,RSELx位DCOCTL |=DCO2+DCO1+MOD2+MOD1+MOD0; //DCO=6,MOD=7 BCSCTL1 |=RSEL2; //RSEL=4#endif}void main(void){WDTCTL = WDTPW + WDTHOLD; //关闭看门狗System_Clock_Init();//设置定时器A时钟源,1MHz#ifdef Exterior_8MHzTACTL = TACLR; //清零寄存器TACTL = TASSEL_2 + ID_3 + MC_1; //SMCLK,8分频,增计数#elseTACTL = TACLR; //清零寄存器TACTL = TASSEL_2 + ID_0 + MC_1 + TACLR; //SMCLK,0分频,增计数#endifCCR0 = 10000-1; //设定周期10000*1us=10ms,100K//PWM1CCR1 = 2500; //设定脉宽2500*1us=2.5msCCTL1 = OUTMOD_7; //PWM模式7,复位/置位P1DIR |= BIT2; //P1.2 输出P1SEL |= BIT2; //P1.2 TA1//PWM2CCR2 = 7500; //设定脉宽7500*1us=7.5msCCTL2 = OUTMOD_7; //PWM模式7,复位/置位P1DIR |= BIT3; //P1.3 输出P1SEL |= BIT3; //P1.3 TA2while(1){}}。
MSP430F149定时数据采集程序[调试通过]
// 初始化
Init_ADC(); Init_TimerA(); _EINT();
// 打开中断
#pragma vector=TIMERA0_VECTOR //定时器 A0 的中断函数
__interrupt void TimerA_ISR(void)
{
float AD_data;
char a;
char b;
int m;
int n;
// 读出转换结果
P5OUT^=BIT6;
while((ADC12IFG & BIT7)==0) ; //判断有没有转换结束
}
void Init_ADC(void) {
//P6SEL = BIT7; ADC12CTL0 &= ~(ENC);
//设置 P6.7 为模拟输入 A7 //设置 ENC 为 0,从而可以修改 ADC12 寄存器的值
ADC12CTL0 += ADC12ON+MSH; //开 A/D 转换,允许多次采样
P3SEL=0x00; //LCD 所需端口设置 P3DIR=0xFF; P3OUT&=~BIT5; //74HC245 的 DIR 为低电平,输入方向由 B 端到 A 端
P5SEL=0x00; P5DIR=0xFF; P5OUT=0x00;
//P5 输出
P4SEL=0x00; P4DIR=0xFF; P4OUT=0x00;
//P4 输出
P6SEL=0xF0; P6DIR=0xFF; P6OUT=0x00; }
MSP430学习点滴——看门狗定时器
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。
MSP430F149 学习板使用说明
MSP430F149 开发板使用说明2009年09月第一章新手入门1.1 MSP430F149 学习板特点:选用16 位超低功耗单片机MSP430F149,采用子母双板分离设计,MCU 子板与集成外设母板通过插针座连接,使用灵活方便。
ØMCU 的全部IO都用插针引出,便于二次开发提供电源指示灯和上电自动复位、手动复位电路。
2、蜂鸣器实验(1)蜂鸣器1:单频音(步进变音调)(2)蜂鸣器2:奏乐(祝你平安)3、数码管实验(1)数码管1(显示0123)(2)数码管2(动态显示0~F)4、4×1 独立按键实验(1)键盘1:扫描数码管显示5、1602 液晶实验(1)1602 液晶1:动态字符显示(2)1602 液晶2:静态字符显示(3)1602 液晶3:内部时钟显示6、RS232 接口实验(1)RS232 接口1:MCU 发送数据PC 机显示(2)RS232 接口2:按键控制MCU 发送数据PC 机显示(3)RS232 接口3:PC 机发送数据MCU 液晶显示(4)RS232 接口4:MCU 回发接收到的PC 机数据7、RS485 接口实验(1)RS485 接口1:发送程序8、PS2 接口实验(1)PS2 接口1:PS2 控制1602 显示9、12-Bit 高精度温度传感器实验(1)温度传感器1:DS18B20 在液晶显示10、RTC 实时时钟实验(1)实时时钟1:DS1302 测试(2)实时时钟2:DS1302 电子钟11、2k Bit EEPROM 实验(1)EEPROM1:AT24C02 测试(2)EEPROM2:读出数据通过串口在PC 机显示12、12-Bit 模数转换器(ADC)接口实验(1)模数转换器2:ADC 在1602 液晶在显示(2)模数转换器3:ADC 通过串口在PC 机显示13、12864 液晶实验(与12864 液晶配套)(1)12864 液晶并口1:字符显示(2)12864 液晶并口2:汉字显示(3)12864 液晶并口3:图形显示(4)12864 液晶并口4:综合演示(5)12864 液晶串口5:字符显示(6)12864 液晶串口6:汉字显示(7)12864 液晶串口7:图形显示(8)12864 液晶串口8:综合演示14、HS0038红外接口实验(1)红外遥控解码实验,在数码管上显示三、开发板综合程序1、温度时间综合实验(1)DS18B20 + DS1302 + 16022、SSCOM综合实验(1)PC发送接收字符第三章板上资源详解本章详细介绍了MSP430F149 学习板上各个功能模块的硬件电路原理、使用方法和注意事项,使用前请仔细阅读。
MSP430看门狗定时器
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 =。
msp430f149定时器
用msp430实现计数器的功能,在1602第一行显示时钟,第二行显示”***TIMER***”--------------------------------------------------main-------------------------------------------------------#include <msp430x14x.h>#include "Display.h"#include "Common.h"unsigned char sec,min,hour;//定时器A初始化函数void Init_TimerA(){TACTL=TASSEL0+TACLR;//选择ACLK,32768HzTACCTL0=CCIE;CCR0=32768; //1sTACTL |=MC0;//增计数模式}//Init IOvoid Port_Init(){P4SEL = 0x00;P4DIR = 0xFF;P5SEL = 0x00;P5DIR|= BIT5 + BIT6 + BIT7; //控制口设置为输出模式}void main( void ) //主函数{unsigned char i,*p;WDT_Init();Clock_Init();Port_Init();Init_TimerA();_EINT();Delay_Ms(100);LCD_Init();LCD_Clear();while(1){i=2;p="***TIMER***";LCD_Pos(6);LCD_write_data(':');LCD_Pos(9);LCD_write_data(':');LCD_Writesfm(10,sec);LCD_Writesfm( 7,min);LCD_Writesfm( 4,hour);while(*p){LCD_Writechar(i,1,*p);i++;p++;Delay_Ms(1);}}}/***********定时器A中断服务程序**************/#pragma vector=TIMERA0_VECTOR__interrupt void TimerA_ISR(void){sec++;if(sec==60){min++;sec=0;if(min==60){hour++;min=0;if(hour==24)hour=0;}}}-------------------------------------------------Display.c,要添加到工程中-------------------------------------/****************************************************fun: Display.cfunction:input:ouput:auther:*****************************************************/#include "Display.h"//***********************************************************************// 1602显示屏初始化函数//*********************************************************************** void LCD_Init(void){LCD_write_com(0x38); //显示模式设置Delay_Ms(5);LCD_write_com(0x08); //显示关闭Delay_Ms(5);LCD_write_com(0x01); //显示清屏Delay_Ms(5);LCD_write_com(0x06); //显示光标移动设置Delay_Ms(5);LCD_write_com(0x0C); //显示开及光标设置Delay_Ms(5);}//*********************************************************************** // 1602显示屏清空显示//***********************************************************************void LCD_Clear(void){LCD_write_com(0x01); //清屏幕显示Delay_Ms(5);}//********************************************************************// 1602显示屏命令写入函数//***********************************************************************void LCD_write_com(unsigned char com){RS_CLR;RW_CLR;EN_SET;DataPort = com; //命令写入端口Delay_Ms(5);EN_CLR;}//*********************************************************************** // 1602显示屏数据写入函数//***********************************************************************void LCD_write_data(unsigned char data){RS_SET;RW_CLR;EN_SET;DataPort = data; //数据写入端口Delay_Ms(5);EN_CLR;}//*********************************************************************** // 显示屏字符串写入函数//***********************************************************************void LCD_Writestr(unsigned char x,unsigned char y,unsigned char *s){if (y == 0){LCD_write_com(0x80 + x); //第一行显示}else{LCD_write_com(0xC0 + x); //第二行显示}while (*s){LCD_write_data( *s);s ++;}}//*********************************************************************** // 显示屏单字符写入函数//***********************************************************************void LCD_Writechar(unsigned char x,unsigned char y,unsigned char data){if (y == 0){LCD_write_com(0x80 + x); //第一行显示}else{LCD_write_com(0xC0 + x); //第二行显示}LCD_write_data( data);}//***********************************************************************// 显示位置函数//***********************************************************************void LCD_Pos(unsigned char pos){LCD_write_com(0x80+pos);}//***********************************************************************// 显示时分秒函数//***********************************************************************void LCD_Writesfm(unsigned char add,unsigned char date){ unsigned char shi,ge;shi=date/10;ge=date%10;LCD_write_com(0x80+add);LCD_write_data(0x30+shi);LCD_write_data(0x30+ge);}----------------------------------------------Display.h,要添加到工程中------------------------------------------#include"Common.h"#define P55 5#define P56 6#define P57 7 //我149的板子是这三个口为控制口,如果要用请根据你板子的电路图修改//对应控制口#define RS_CLR P5OUT &= ~(1 << P55) //RS置低#define RS_SET P5OUT |= (1 << P55) //RS置高#define RW_CLR P5OUT &= ~(1 << P56) //RW置低#define RW_SET P5OUT |= (1 << P56) //RW置高#define EN_CLR P5OUT &= ~(1 << P57) //E置低#define EN_SET P5OUT |= (1 << P57) //E置高#define DataPort P4OUT //P4口为数据口void LCD_Init(void);void LCD_Clear(void);void LCD_write_com(unsigned char com);void LCD_write_data(unsigned char data);void LCD_Writestr(unsigned char x,unsigned char y,unsigned char *s);void LCD_Writechar(unsigned char x,unsigned char y,unsigned char data);void LCD_Writesfm(unsigned char add,unsigned char date);void LCD_Pos(unsigned char pos);-------------------------------------------Common.c,要加到工程中----------------------------------------- #include"Common.h"void Clock_Init(void){uchar i;BCSCTL1&=~XT2OFF; //打开XT2振荡器BCSCTL2|=SELM1+SELS; //MCLK为8MHZ,SMCLK为8MHZdo{IFG1&=~OFIFG; //清楚振荡器错误标志for(i=0;i<100;i++)_NOP();}while((IFG1&OFIFG)!=0); //如果标志位1,则继续循环等待IFG1&=~OFIFG;}void WDT_Init(){WDTCTL = WDTPW + WDTHOLD; //关闭看门狗}------------------------------------Common.h,要加到工程中---------------------------------------------/*********************************************frequency:8MHz*********************************************//****************************************************fun:function: 常用宏定义库,有待扩充input:ouput:auther:*****************************************************/#include <msp430x14x.h>#define CPU_F ((double)8000000)#define Delay_Us(x) __delay_cycles((long)(CPU_F*(double)x/1000000.0))#define Delay_Ms(x) __delay_cycles((long)(CPU_F*(double)x/1000.0))#define uchar unsigned char#define uint unsigned int#define ulong unsigned longextern void Clock_Init(void);extern void WDT_Init(void);。
MSP430F149开发板说明
MSP430F149开发板说明一,MSP430F149自带硬件资源:(1) 基础时钟模块,包括1个数控振荡器(DCO)和2个晶体振荡器;(2) 看门狗定时器Watchdog Timer,可用作通用定时器:(3) 带有3个捕捉/比较寄存器的16位定时器Timer-A;(4) 带有7个捕捉/比较寄存器的16位定时器Timer_B;(5) 2个具有中断功能的8位并行端口:P1与P21(6) 6个8位端口:P1、P2、P3、P4、P5、P6。
(7) 模拟比较器COMPARATOR_A;(8) 12位A/D转换器;(9) 2通道串行通信接口(软件选择UART/SPI模式);(10) 1个硬件乘法器;(11) 60KB+256字节FLASH,2KBRAM。
二,MSP430F149开发板外围电路和硬件:1、两种可选供电方式(标准5V稳压器接口、USB接口)2、3.3V和5V电平接口3、一个兼容USB2.0规范、符合USB1.1规范的标准USB接口4、一个12864液晶显示屏接口5、一个JTAG仿真调试下载端口6、一个蜂鸣器7、一个NRF905射频通信模块接口8、一个8位的LED指示灯模块9、一个8路12-Bit模数转换(ADC)接口10、一个ZIGBEE(型号SZ05)无线通信接口11、一个IR红外串口无线通信模块12、一个8位数码管显示和4X4键盘模块13、一个L298电机驱动模块(可驱动两个电机)14、一个IIC模块包含:PCF8563时钟、LM75温度传感器、AT24C02数据存储15、一个单路输出10位DA转换芯片(TLC5615)16、一个标准的MAX3232接口17、一个的MAX485接口三,MSP430F149的性能MSP430系列单片机最显著的特点就是它的超低功耗。
在1.8—3.6V 电压、1MHz的时钟条件下运行。
耗电电流在0.1—400mA.之间,RAM 在节电模式耗电为0.1mA,等待模式下仅为0.7mA。
MSP430F149的看门狗操作
MSP430F149的看门狗操作1)看门狗的图解图1 看门狗图解2)看门狗介绍看门狗由一个16位寄存器控制,高八位是密匙,密匙密码是05AH,读取是069H。
MSP430F149的看门狗是系统默认开启的,所有一般不用的时候,程序一开始就关闭看门狗。
看门狗有两种工作模式:1.看门狗模式。
2.定时器模式。
3)看门狗的控制寄存器1.WDTCTL●WDTPW:高八位是密匙。
一般IAR的头文件里面都包含有。
●WDTHOLD:选择是否打开看门狗。
0开1关。
●WDTNMIES:当复位端用作NMI(外部的非可屏蔽中断)的时候,选择是上升沿触发中断还是下降沿触发中断。
0上升1下降。
●WDTNMI:选择复位端是作为复位端口还是NMI(外部的非可屏蔽中断)端口。
0复位1NMI。
●WDTTMSEL:选择看门狗模式还是定时器模式。
0看门狗1定时器。
●WDTCNTCL:看门狗计数清零。
1清零。
●WDTSSEL:看门狗的时钟来源选择。
0子系统时钟1主系统时钟。
●WDTISx:看门狗时钟分频选择。
2.IE1●NIMIE:外部非可屏蔽中断使能。
●WDTIE:看门狗中断使能。
(当看门狗做定时器的时候也是这个使能)3.IFG1(一般C语言不操作,都会有硬件置位)●NMIIFG:外部非可屏蔽中断标志。
●WDTIFG:看门狗中断标志。
4)当看门狗用作定时器使用的时候的操作。
1.把看门狗设置到定时器模式。
(也还可以设置触发边沿,选择时钟和分频)2.清零看门狗。
3.打开看门狗中断使能。
#include<msp430x14x.h>#define uint unsigned intvoid main(){WDTCTL=WDT_MDLY_32;//相当于WDTPW+WDTTMSEL+WDTCNTCL//也就是密匙+选择定时器模式+清零看门狗IE1|=WDTIE;//打开看门狗中断使能,由于看门狗是非可屏蔽中断所有不用//打开总中断IEwhile(1){LPM3;}}#pragma vector=WDT_VECTOR//看门狗的中断入口地址是WDT_VECTOR,NMI的入口地址是NMI_VECTOR __interrupt void P1RT(void){//中断程序,硬件自动清除中断标志所有不用软件清除。
MSP430F149 TIMER_A(一)——16位定时计数
MSP430F149 TIMER_A(一)——16 位定时计数TIMER_A 有四个可选时钟源,为了方便一般选择ACLK 和SMCLK,经过分频器产生一个时基,其结构图如下:TIMER_A 有三种定时/计数方式:(1).增计数模式:计数周期:TAR 从0 增加到TACCR0,(2).连续计数模式:计数周期:TAR 从0 增加到0xffff,(3).增减计数模式:计数周期:TAR 从0 增加到TACCR0 然后再从TACCR0 减到0由上图可见TIMER_A 的中断标志有两个,分别是TAIFG 和CCIFG。
TACTL 中的TAIE 允许产生TAIFG 中断标志,中断入口是TIMERA_1 VECTOR 即0FFEAh,此入口有三个中断源,由TAIV 的值决定。
在IAR 中,进入中断服务的方式如下:#pragma vector=中断向量的入口地址__interrupt void 函数名(类型)比如:#pragma vector=0x14__interrupt void my_handler(void);TIMERA0_VECTOR 是单中断源的,因此不需要判断#pragma vector=TIMERA0_VECTOR__interrupt void Timer_A0 (void){ P4OUT–BIT0;}既然TIMERA1_VECTOR 由三种中断源,则需要判断,例子如下#pragma vector=TIMERA1_VECTOR__interrupt void Timer_A1 (void){ switch(TAIV) { case 0x02:break; case 0x04:break; case 0x0a:P4OUT–BIT0;break; }}tips:感谢大家的阅读,本文由我司收集整编。
仅供参阅!。
MSP430F149中文资料.pdf
MSP430单片机的开发及应用设计人:陈小忠西安邮电学院电子信息工程系电子0002班西安邮电学院63# 7100612003年7月目录第一章概述第二章MSP430 F149语言介绍第一节开发环境及程序下载第二节语言介绍第三章MSP430F149 资源的应用介绍及开发第一节中断介绍及存储器段介绍第二节硬件乘法器第三节P口第四节定时器及数模转换第五节时钟模块第六节USART通信模块第七节比较器第八节模数转换第四章MSP430F149开发板的介绍及测试第一节模数转换模块第二节传感器模块第三节外存和实时时钟模块第四节485和232模块第五节电源管理模块及晶振模块第六节PWM波形滤波第一章概述MSP430是德州公司新开发的一类具有16位总线的带FLASH 的单片机,由于其性价比和集成度高,受到广大技术开发人员的青睐.它采用16位的总线,外设和内存统一编址,寻址范围可达64K,还可以外扩展存储器.具有统一的中断管理,具有丰富的片上外围模块,片内有精密硬件乘法器、两个16位定时器、一个14路的12位的模数转换器、一个看门狗、6路P口、两路USART 通信端口、一个比较器、一个DCO内部振荡器和两个外部时钟,支持8M 的时钟.由于为FLASH 型,则可以在线对单片机进行调试和下载,且JTAG口直接和FET(FLASH EMULATION TOOL)的相连,不须另外的仿真工具,方便实用,而且,可以在超低功耗模式下工作,对环境和人体的辐射小,测量结果为100mw左右的功耗(电流为14mA左右),可靠性能好,加强电干扰运行不受影响,适应工业级的运行环境,适合与做手柄之类的自动控制的设备.我们相信MSP430单片机将会在工程技术应用中得以广泛应用,而且,它是通向DSP系列的桥梁,随着自动控制的高速化和低功耗化 ,MSP430系列将会得到越来越多人的喜爱.通过两过多月的毕业设计,我对MSP430有了初步了解,对内部的硬件资源和自身的汇编语法进行了实验,并开发了一个应用板,并进行了调试.鉴于时间和能力有限,没能对所有的应用一一实验.第二章 MSP430 F149语言介绍MSP430是德州公司的新产品,有独特的开发环境和自身语言,下面是我在毕业设计中对F149的开发环境熟悉中遇到的一些问题的处理和汇编语言的用法及程序中遇到的问题的体会.第一节开发环境及程序下载1.开发环境:在EW23环境下进行编程,汇编,连接,在C—SPY环境下进行调试,下载是在连接之后,调试之前,通过计算机的串口下载的.关于环境的操作,可以参考有关资料,其中可能遇到的问题及解决方法有:(1) .汇编是对源程序而言的,因此必须打开一个源文件才能汇编,而连接是对一个工程文件而言的,连接是对工程文件的所有源代码(包括多个源文件)和数据的定位,因此连接必须打开一个工程文件才能连接.(2) 连接中必须将库文件的路径改正确,且必须选定C—SPY的驱动方式,即在project中的options的xlink的include下修改(先选中)xcl的库路径为$TOOLKIT_DIR$\icc430\msp430F149A.xcl ,选择C—SPY 的驱动drive为simulator或FLASH EMULATION TOOL ,当没连接430片子时可以选simulator,当连接430片子时,选 FLASH EMULATION TOOL进行在线下载调试.(3) 由于430支持汇编语言和C语言两种语言,因此可以在一个工程文件中同时用两种语言,但建议用汇编语言,因为便于在调试时寻找逻辑和指令的联系及地址的定位正确与否.(4) 在在线的C—SPY 的调试中,单步需要将Control的Reatime前的勾取消才能进行单步测试.(5) 在线调试时,不能将58 管脚(复位/非屏蔽中断)外部变高,否则,会强制退出调试环境.2.程序下载原理及脱机工作原理:程序的在线调试是通过JATG口和F149片子的 RST、TCK、TDI、TDO、TMS引脚按一定的时序串行的传递程序代码和数据的,调试指令的命令传递都是通过这些数据线和控制线传递的,下载时序可参见资料1,其中的地址0FFFEH为复位向量的地址,它是程序遇到非屏蔽中断和程序启动的首要地址,地址中存放的是程序段开始的首地址,因此必须把程序段的首地址标号表示在中断向量中或程序伪指令的开头位置,否则,连接时将会出错,具体的表示方法在下一节中表示.程序的下载和在线调试的电源是通过计算机在JATG提供的,不须另外给加电源.脱机工作时,是将F149的电源线上电,此时的复位时序同下载后在线复位的时序一样,只是时钟是通过F149内部时钟DCO提供的,上电后,程序将复位向量0FFFE中的地址装入PC,PC开始从程序段的首地址开始执行.脱机工作启动不需要任何操作,只需上电即可,电压要大于1.8v,一般取3v左右,另外,在脱机工作时,可以给RST端口加一个低电平脉冲以复位从程序开始重新执行.第二节指令介绍MSP430有自身语言,汇编语言也不同于其他类型的单片机,伪指令也是变幻魔测,但又很重要,下面是我毕业设计的一些尝试、出问题的地方.也可参见资料。
MSP430教程10:MSP430单片机WDT看门狗定时器
看门狗定时器用来防止程序因供电电源、空间电磁干扰或其它原因引起的强烈干扰噪声而跑飞的事故。
程序中设置看门狗清零指令 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工作在看门狗模式、定时器模式和低功耗模式三种模式。
MSP430F149笔记
一、PWM信号发生#include<msp430x14x.h>#define frequency 16384void main(void){WDTCTL=WDTPW+WDTHOLD;TACTL=TASSEL0+TACLR;CCR0=frequency-1; //频率:32768/(CCR0+1);CCTL1=OUTMOD_7;CCR1=frequency/2; //占空比:CCR1/(CCR0+1);CCTL2=OUTMOD_7;CCR2=frequency/4;P2DIR|=BIT3;P2SEL|=BIT3;P2DIR|=BIT4;P2SEL|=BIT4;TACTL|=MC0; //增计数模式;while(1){_BIS_SR(LPM3_bits);_NOP();}}二、用Timer_B捕获脉宽#include<msp430x14x.h>unsigned int width[10]={0,0,0,0,0,0,0,0,0,0};unsigned int i=0;void main(){WDTCTL=WDTPW+WDTHOLD; //关闭看门狗P4SEL|=BIT0; //P4.0作为捕获模块功能的输入端输入方波//-------开晶振XT2---------BCSCTL1&=~XT2OFF; //打开XT2振荡器do{IFG1 &=~OFIFG; // 清除振荡器失效标志for(i=256;i>0;i--); // 延时,等待XT2起振}while((IFG1 & OFIFG)!=0); // 判断XT2是否起振BCSCTL2=SELM_2+SELS; //选择MCLK=SMCLK为XT2TBCCTL0&=~(CCIS1+CCIS0); // 捕获源为P4.0,即CCI0A(也是CCI0B)TBCCTL0|=CM_2+SCS+CAP; //下降沿捕获,同步捕获,工作在捕获模式TBCCTL0|=CCIE; //允许捕获比较模块提出中断请求TBCTL|=ID_3;TBCTL|=TBSSEL_2; //选择时钟MCLKTBCTL|=TBCLR; //定时器清零TBCTL|=MC_2; //定时器开始计数(连续计数模式0~0xFFFF)_EINT();while(1){_BIS_SR(LPM3_bits);_NOP();}}//―――――定时器TB的CCR0的中断:用于检测脉冲上升与下降沿――――#pragma vector=TIMERB0_VECTOR__interrupt void TimerB0(void){if(TBCCTL0&CM1) //捕获到下降沿{TBCTL|=TBCLR;TBCCTL0=(TBCCTL0&(~CM1))|CM0; //改为上升沿捕获:CM1置零,CM0置一}else if(TBCCTL0&CM0) //捕获到上升沿{width[i++]=TBCCR0; //记录下结束时间TBCCTL0=(TBCCTL0&(~CM0))|CM1; //改为下降沿捕获:CM0置零,CM1置一if(i==10)i=0;}}三、MSP430测速方法#include<msp430x14x.h>unsigned char led_mod[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//LED字模; unsigned int Segments[]={0,0,0,0,0};//要显示的数字;unsigned int uiWidth=0;unsigned int i=0;void InitTimer_B(){TBCCTL0&=~(CCIS1+CCIS0); // 捕获源为P4.0,即CCI0A(也是CCI0B)TBCCTL0|=CM_2+SCS+CAP; //下降沿捕获,同步捕获,工作在捕获模式TBCCTL0|=CCIE; //允许捕获比较模块提出中断请求TBCTL|=ID_3;TBCTL|=TBSSEL_2; //选择时钟MCLKTBCTL|=TBCLR; //定时器清零TBCTL|=MC_2; //定时器开始计数(连续计数模式0~0xFFFF)}void IntoChar(unsigned int unitemp){unsigned char j=0;while(unitemp){Segments[j]=unitemp%10;unitemp=unitemp/10;j++;}}void main(){WDTCTL=WDTPW+WDTHOLD; //关闭看门狗P2DIR=0xff;P2OUT=0xff;P3DIR=0xff;P3OUT=0xff;P4DIR=0xfe;P4OUT=0xfe;P5DIR=0xff;P5OUT=0xff;P6DIR=0xff;P6OUT=0xff;P4SEL|=BIT0; //P4.0作为捕获模块功能的输入端输入方波BCSCTL1&=~XT2OFF; //打开XT2振荡器do{IFG1&=~OFIFG; // 清除振荡器失效标志for(i=256;i>0;i--); // 延时,等待XT2起振}while ((IFG1 & OFIFG) != 0); // 判断XT2是否起振BCSCTL2 =SELM_2+SELS; //选择MCLK=SMCLK为XT2WDTCTL=WDT_ADLY_1_9;IE1|=WDTIE;InitTimer_B();_EINT();while(1);}//定时器TB的CCR0的中断,用于检测脉冲下降沿unsigned int times=0;#pragma vector=TIMERB0_VECTOR__interrupt void TimerB0(void){_DINT();if(TBCCTL0&CM1) //捕获到下降沿{times++;if(times==4){uiWidth=TBCCR0; //记录下结束时间times=0;}TBCTL|=TBCLR;}_EINT();}//看门狗定时器中断,用于LED动态显示unsigned char ucBitolight=0;//数码管位选变量#pragma vector=WDT_VECTOR__interrupt void watchdog_timer(void){IntoChar(uiWidth);P4OUT=led_mod[Segments[4-ucBitolight]];P6OUT|=BIT6;P6OUT&=~BIT6;P4OUT=~(1<<(ucBitolight+3));P5OUT|=BIT5;P5OUT&=~BIT5;ucBitolight++;if(ucBitolight==5) ucBitolight =0;}。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
#include <msp430x14x.h> void main(void) {
WDTCTL=WDT_ADLY_1000;//1000ms 定时 //WDT_ADLY_1000=WDTPW+WDTTMSEL+WDTCNTCL+WDTSSEL
P6DIR |=BIT0;//P6.0 输出 P6OUT |=BIT0;//P6.0 输出高电平关闭 LED 灯 IE1 |=WDTIE;//允许 WDT 中断 _EINT();//开放系统中断 while(1) {
例:设置看门狗间隔定时器模式,选择 ACLK(32768Hz)时钟源,定时 1s。
WDTCTL=WDTPW + WDTTMSEL + WDTCNTCL + WDTSSEL;
口令
定时工作模式 清除计数器
选择 ACLK
思考:
选择 ACLK(32786Hz)时钟源,定时 250ms/16ms/1.95ms,如何设置 WDTCTL?
说明:
WDTPW——口令,固定格式。
WDTCNTCL——计数器清零
WDTCTL.2(WDTSSEL)——WDTCTL 第二位时钟源选择位,
0:选择 SMCLK
1:选择 ACLK
WDTISx——定时间隔选择控制位,T 为时钟源时钟周期。
WDTISx=00,定时间隔 T×215 WDTISx=01,定时间隔 T×213
2、IE1 中断使能寄存器 1
7
6
5
4
3
2
1
0
NMIIE
WDTIE
rw-0
rw-0
NMIIE:非屏蔽中断允许控制位。
NMIIE=0,禁止 NMI 中断
NMIIE=1,允许 NMI 中断
WDTIE:定时器模式中断允许控制位。看门狗模式不需要设置该位。
WDTIE=0,禁止定时器中断
WDTIE=1,允许定时器中断
WDTISx=10,定时间隔 T×29 WDTISx=11,定时间隔 T×26
2、周期性喂狗:在程序适当位置重新初始化 WDTCTL,注意再次初始化 WDTCTL
的时间间隔必须小于看门狗定时间隔。喂狗方法如下:
WDTCTL=WDTPW+WDTCNTCL+WDTCTL.2+WDTISx;
或通用方法:
WDTCTL = WDTPW + WDTCNTCL + (WDTCTL & 0x00FF);
WDTIFG:看门狗定时器中断标志,定时模式执行中断后自动清除,看门狗模式
需通过软件清除。
WDTIFG=0,无看门狗中断发生
WDTIFG=1,有看门狗中断发生
IFG1 寄存器其余位可能被其他模块使用。
图 4-1 MSP430F149 看门狗定时器结构
§4.2 MSP430F149 单片机看门狗定时器应用
15 ~ 8 WDTPW
7 WDTHOLD
6 WDTNMIES
5 WDTNMI
4
3
WDTTMSEL WDTCNTCL
2 WDTSSEL
1
0
WDTISx
rw-0
rw-0
rw-0
rw-0
r0(w)
rw-0
rw-0 rw-0
WDTPW:WDTCTL 控制寄存器的高 8 位,看门狗定时器的口令:必须以 0x5A 写
250ms 定时:
WDTCTL=WDTPW+WDTTMSEL+WDTCNTCL+WDTSSEL+WDTIS0;
16ms 定时:
WDTCTL=WDTPW+WDTTMSEL+WDTCNTCL+WDTSSEL+WDTIS1;
1.95ms 定时:
WDTCTL=WDTPW+WDTTMSEL+WDTCNTCL+WDTSSEL+WDTIS1+WDTIS0;
MSP430 单片机看门狗定时器的主要功能是当发生软件错误时执行系统复位。在不
用看门狗功能时,可将看门狗定时器配置成间隔定时器,在定时时间到时产生中断。
系统上电后,看门狗定时器被激活,并自动选择 DCOCLK 时钟源配置成 32ms 定时
间隔看门狗模式。MSP430F149 单片机看门狗定时器结构如图 4-1 所示。
WDTNMIES=0,上升沿触发 NMI 中断 WDTNMIES=1,下降沿触发 NMI 中断 WDTNMI:看门狗定时器 NMI 中断选择控制位。选择引脚 RST /NMI 的第二功能 NMI 中断功能。 WDTNMI=0,选择复位功能 WDTNMI=1,选择 NMI 中断功能 WDTTMSEL:看门狗定时器模式选择控制位。 WDTTMSEL=0,看门狗模式 WDTTMSEL=1,间隔定时器模式 WDTCNTCL:看门狗定时器计数器清零控制位。 WDTCNTCL=0,无操作 WDTCNTCL=1,计数器 WDTCNT 清零 WDTSSEL:看门狗定时器时钟源选择控制位。 WDTSSEL=0,选择 SMCLK 时钟信号为时钟源 WDTSSEL=1,选择 ACLK 时钟信号为时钟源 WDTISx:看门狗定时器定时间隔选择控制位,T 为时钟源时钟周期。 WDTISx=00,定时间隔 T×215 WDTISx=01,定时间隔 T×213 WDTISx=10,定时间隔 T×29 WDTISx=11,定时间隔 T×26
一、看门狗模式
系统上电复位或上电清零后,看门狗定时器自动配置成 32ms 间隔看门狗模式(系
统复位后 LFXT1CLK=32768Hz,SMCLK=DCOCLK=1MHz)。
配置看门狗模式的操作步骤:
1、选择相应时钟源和合适的定时间隔:初始化 WDTCTL。
WDTCTL=WDTPW+WDTCNTCL+WDTCTL.2+WDTISx;
入,读出始终为 0x69。如果写入不是 0x5A 将导致系统复位。
WDTHOLD:看门狗保持控制位。 WDTHOLD=0,激活看门狗 WDTHOLD=1,停止看门狗
WDTNMIES:NMI 中断触发沿选择控制位。当 WDTNMI=1 时,引脚 RST /NMI 具有 NMI 中断功能。修改 WDTNMIES 位会触发一个 NMI 中断。为避免意外 NMI 中断,修 改 WDTNMIES 位时应使 WDTNMI=0。
IE1 寄存器其余位可能被其他模块使用。
例如: IE1 |=WDTIE;//开放看门狗定时器定时中断
3、IFG1 中断标志寄存器 1
7
6
5
4
3
2
1
0
NMIIFG
WDTIFG
rw-0
rw-0
NMIIFG:NMI 中断标志位。
NMIIFG=0,无 NMI 中断发生
NMIIFG=1,有 NMI 中断发生
二、MSP430F149 单片机看门狗定时器寄存器
寄存器
寄存器名 类型
初始状态
看门狗定时器控制寄存器
WDTCTL 读/写 0x6900(PUC)
中断使能寄存器 1
IE1
读/写
复位(PUC)
中断标志寄存器 1
IFG1
读/写
复位(PUC)
说明:IFG1.0(WDTIFG)被 POR 复位
1、WDTCTL 看门狗定时器控制寄存器
_BIS_SR(LPM0_bits);//进入低功耗 0(禁止 CPU) } } #pragma vector=WDT_VECTOR __interrupt void WDT_ISR(void) { P6OUT ^=BIT0;//P6.0 取反 }Fra bibliotek程序如下:
#include <msp430x14x.h> void main(void) {
WDTCTL=WDT_ADLY_250;//250ms 定时 //WDT_ADLY_250=WDTPW+WDTTMSEL+WDTCNTCL+WDTSSEL+WDTIS0
P6DIR |=BIT0;//P6.0 输出 P6OUT |=BIT0;//P6.0 输出高电平关闭 LED 灯 IE1 |=WDTIE;//允许 WDT 中断 _EINT();//开放系统中断 while(1) {
第四章 MSP430F149 单片机看门狗定时器 本章主要内容:
一、MSP430F149 单片机看门狗定时器相关寄存器 二、MSP430F149 单片机看门狗定时器的操作
本章重点内容
MSP430F149 单片机看门狗定时器的操作
§4.1 MSP430F149 单片机看门狗定时器寄存器
一、看门狗定时器的作用和特点
(1)SMCLK 时钟源 WDTCTL=WDTPW+WDTTMSEL+WDTCNTCL+WDTISx; 说明: WDTPW——口令,固定格式。 WDTTMSEL——选择定时模式 WDTCNTCL——计数器清零 WDTISx——定时间隔选择控制位,T 为时钟源时钟周期。 WDTISx=00,定时间隔 T×215 WDTISx=01,定时间隔 T×213 WDTISx=10,定时间隔 T×29 WDTISx=11,定时间隔 T×26
定时器最多只能产生 8 种定时间隔:2 种时钟源,每种各有 4 种定时间隔。 2、开放看门狗中断:IE1 |=WDTIE; 3、开放系统中断:_EINT(); 三、低功耗模式
当不用看门狗时,直接关闭看门狗,减小功耗。 WDTCTL=WDTPW+WDTHOLD;//关闭看门狗
应用一、利用看门狗定时功能产生周期 1s 的方波,从 P6.0 输出,LED 灯闪烁。
_BIS_SR(LPM0_bits);//进入低功耗 0(禁止 CPU) } } #pragma vector=WDT_VECTOR __interrupt void WDT_ISR(void) { P6OUT ^=BIT0;//P6.0 取反 }