目录
定时器与中断
系统正常运行,当发生某个特定具有优先级的事件,系统目前正在运行的任务暂停,去执行中断事件服务函数,一般可在中断服务函数中进行一个计数操作,或者完成某个完整的工作。
而定时器与中断有什么关系呢,它可以设置的是一个检测频率,检测某个事件是否发生。若设置定时器为1S,则1s执行一次中断判断事件是否发生,发生,则执行中断服务函数内部逻辑。
代码一:LED闪烁
功能描述
要实现的功能是: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,示波器测试结果如下:
2024/06/03:更新吐槽
隔了蛮久,现在是做硬件工程师,回来看看以前写的,一眼发现这个脉冲,过冲蛮厉害的,波形不稳定,哈哈哈哈,吐槽一会。