课后练习七之定时器
(定时器看起来简单,却搞了好久,和之前的430定时器不太一样,看了很多次,还有很多没弄出来的地方,有几个地方还是没懂)
1.TIMER_A由以下部分组成
[1] 计数器部分
输入的时钟源具有4种选择,所选择的时钟源又可以1、2、4、8分频作为计数频率,TIMER_A可以通过选择4种工作模式灵活的完成定时/计数功能。
[2] 捕获/比较
用于捕获事件发生的时间或产生时间间隔,捕获比较功能的引入主要时为了提高 I/O 端口处理事务的能力和速度。不同的 MSP430 单片机 TIMER_A 模块中所含有的捕获/比较器的数量不一样,每个捕获/比较器的结构完全相同,输入和输出都取决于各自所带的控制寄存器的控制字,捕获/比较器相互之间工作完全独立。
[3] 输出单元
具有可选的8种输出模式,用于产生用户需要的输出信号,支持 PWM。
2.
寄存器寄存器 缩写 读定类型 地址 初态
Timer_A控制寄存器 TACTL Timer_A计数器 TAR 捕捞/比较控制寄存器0 CCTL0
捕捞/比较寄存器0 CCR0 捕捞/比较控制寄存器1 CCTL1 捕捞/比较寄存器1 CCR1
捕捞/比较控制寄存器2 CCTL2 捕捞/比较寄存器2 CCR2 中断向量寄存器 TAIV
具体的就不介绍了,书上和手册上都有。
请看四楼,程序有问题 还望解答。本楼层字数写不下,谢谢各位了。
(下载次数: 429, 2012-5-31 19:05 上传)
1.
[ 本帖最后由 常见泽1 于 2012-5-31 19:14 编辑 ]
3.应用
(1)定时器中断
步骤:1:设置TIMER_A 控制寄存器
2: 开中断
3: 中断函数
分解: TACTL = TASSEL_2 + MC_2 + TAIE;
MCLK系统时钟 连续计数模式 允许溢出中断
由于我没接外部晶振,由于震荡器失效时,DCO震荡器会被自动选为MCLK时钟源。MSCLK=SMCLK=DCOCLK
注意点:
MSP430G2452 定时器有TA0 TA1
Timer0_A3 TACCR0 CCIFG(4) maskable 0FFF2h 25
Timer0_A3 TACCR2 TACCR1 CCIFG. TAIFG(2) (4) maskable 0FFF0h 24
TAIFG为定时器溢出中断,可以看出一个有定时器溢出中断,另外一个没有,到底是哪个呢,看头文件!
#define TIMER0_A1_VECTOR (8 * 2u) /* 0xFFF0 Timer0_A CC1, TA */
#define TIMER0_A0_VECTOR (9 * 2u) /* 0xFFF2 Timer0_A CC0 */
可以看出是TIMER0_A1_VECTOR。
在例程中,我试过用TIMER0_A0_VECTOR,果然无法进入定时器溢出中断,因为TIMER0_A0不存在定时器溢出中断。
应用2:
(1)TIMER0_A0比较中断
计数器TAR可以选择增计数模式。当计数值与CCR0的值相等(或者定时器值大于CCR0值)时,定时器复位并从0开始重新计数。
TACTL = TASSEL_2 + MC_1+TACLR; // MCLK,upmode
CCTL0 = CCIE; // 允许中断
(这个用的是TIMER0_A0)
/***********************************************
**** LAUNCH PAD 学习之比较中断 ***
**** MCU: MSP430 ***
**** 作者: 常见泽 ***
**** ***
**** ***
**** 2012.05.29.20:16 ***
**** 实验现象:灯闪烁 ***
**** ***
**** up 比较中断 (周期约10ms)i放大100倍 ***
***********************************************/
#include <msp430g2452.h>
unsigned int i;
void main(void)
{
WDTCTL = WDTPW + WDTHOLD; // Stop WDT
P1DIR |= (0x01|BIT6); // P1.0 output
P1OUT = 0x00;
CCR0 = 50000;
TACTL = TASSEL_2 + MC_1+TACLR; // MCLK,upmode
CCTL0 = CCIE; // 允许中断
_EINT();
while(1);
}
#pragma vector= TIMER0_A0_VECTOR
__interrupt void Timer_A (void)
{
i++;
if(i==100)
{
P1OUT ^= BIT6; // Toggle P1.0
i=0;
}
CCR0 = 50000;
}
应用3:
当然应用1 和应用2 的程序都已经通过,但是应用三的程序不行,请高手指教。
TIMERA1比较中断
同样的程序,只修改CCR1 CCTL1 CCTL1 = CCIE
#pragma vector= TIMER0_A1_VECTOR
把上面的程序修改三个地方应该是TIMER0_A1比较中断,可是却进不来中断,不知道为何。。