赞
踩
目录
系统正常运行,当发生某个特定具有优先级的事件,系统目前正在运行的任务暂停,去执行中断事件服务函数,一般可在中断服务函数中进行一个计数操作,或者完成某个完整的工作。
而定时器与中断有什么关系呢,它可以设置的是一个检测频率,检测某个事件是否发生。若设置定时器为1S,则1s执行一次中断判断事件是否发生,发生,则执行中断服务函数内部逻辑。
要实现的功能是:LED每500ms切换一次状态,即500ms亮、500ms灭,循环。
先对LED、对定时器进行初始化,然后写入中断函数。
* 使用TA0,CCR0
* TACK = SMCLK/1 = 1M, 1/1M = 1us,计数500ms,即配置TA0CCR0 = 500000。
当定时器到500000时,即时间过去了500ms,这个时候判断中断服务函数的条件,执行函数内部的逻辑,使LED灯的电平发生翻转。
-
- #include <msp430.h>
- int main(void)
- {
- WDTCTL = WDTPW | WDTHOLD; //关闭“看门狗”
-
- //LED初始化
- P4DIR |= BIT7; //初始化为输出
- P4OUT &= ~BIT0; //初始化低电平
-
- //定时器初始化
- TA0CCTL0 = CCIE; //使能CCR0中断
- TA0CCR0 = 500000; //设置计数值,500000*1us=500ms
- TA0CTL = TASSEL_2 + MC_1 + TACLR; //选择时钟源,选择工作模式
-
- __bis_SR_register(LPM0_bits + GIE); //全局中断,使用‘_EINT();’也可
-
- }
-
- //中断服务函数
- #pragma vector = TIMER0_A0_VECTOR
- __interrupt void TIMER0_A0_ISR(void)
- {
- P4OUT ^= BIT7; //每500ms,引脚输出取反
- }

设置一个定时器中断,并在中断服务例程中切换两个引脚的输出状态,从而产生PWM(脉宽调制)信号。这种技术广泛应用于电机控制、LED亮度调节等领域
- #include"msp430.h"
-
- void main(void)
- {
- WDTCTL = WDTPW+WDTHOLD;
-
- P1DIR |= BIT1; //设置P1.0为输出
- P8DIR |= BIT2;
-
- TA0CCTL0 = CCIE; //使能中断
- TA0CCR0 = 5000;
- TA0CTL = TASSEL_2 + MC_1 + TACLR; //设置TA0,时钟源为SMCLK,计数模式为增计数,清零
-
- __bis_SR_register(LPM0_bits + GIE); //进入低功耗,打开全局中断
- __no_operation();
- }
-
- #pragma vector = TIMER0_A0_VECTOR
- __interrupt void TIMER0_A0_ISR(void) //任意选定管脚输出PWM波
- {
- P1OUT ^= BIT1;
- P8OUT ^= BIT2;
- }

修改TA0CCR0的值,如下,测量P1.2的输出波形,
- TA0CCR0 = 500 //T=500us,f = 1053Hz
- TA0CCR0 = 1000 //T=1000us,f = 523.6Hz
- TA0CCR0 = 5000 //T=5000us,f = 105.3Hz
- TA0CCR0 = 20000 //T=50000us,f = 10.5Hz
1. 当TA0CCR0 = 500时,T=500us,示波器测试结果如下图:
2.当TA0CCR0 = 1000时,T=1ms,示波器测试结果如下:
3.当TA0CCR0 = 5000时,T=5ms,示波器测试结果如下:
4.当TA0CCR0 =20000时,T=20ms,示波器测试结果如下:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。