定时器小结
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
对launchpad这块板子的学习也快近二十天了,最大的感受是资料少,还有最坑爹的英文手册,不过十几天下来,嗨,自己的英文水平作为副产品的提升了,当然了,对msp430 的理解也不断的提高和深入,这其中不少的得益于坛里的高手们分享的他们的宝贵经验,给了我很大的启发.所以我也想把我学430 的一些心得同大家交流,这是我看手册总结的,如果有不对或遗漏的地方,还望大家踊跃的指正或补充。
msp430最大的优点就是低功耗,这是其他单片机无法比的。除了一些硬件细节上的低功耗设计外,还有五种低功耗模式,而低功耗的唤醒当然离不开中断了。所以中断除了处理其他的相关的事情外,低功耗唤醒的重任也赋予于它。下面谈谈我对中断的理解,主要从(non)-maskable NMI interrupt和NMI interrupt、单源中断和多源中断进行介绍。希望大家踊跃跟帖进行指正和补充。
NMI和MI interrupt:
1: A (non)-maskable NMI interrupt can be generated by three sources :
(1)An edge on the RST/NMI pin when configured in NMI mode
(2)An oscillator fault occurs (晶体振荡器失效)
(3)An access violation to the flash memory(ACCVIE , ACCVIFG).(ACCVIE使能后,如果对flash的information segment读或写,会引起ACCVIFG置位,发出中断请求)
!!!!!!!NOTES: NMI 中断服务程序中需先清除中断标志位,然后重新使能中断!!!!!!!!!!
eg1:
#pragma vector=NMI_VECTOR
__interrupt void nmi_ (void)
{
do
{
IFG1 &= ~OFIFG; // Clear OSCFault flag
for (i = 0xFFF; i > 0; i--); // Time for flag to set
P1OUT ^= 0x01; // Toggle P1.0 using exclusive-OR
}
while (IFG1 & OFIFG); // OSCFault flag still set?
IE1 |= OFIE; // Enable Osc Fault
}
eg2:RESET/NMI pin of NMI function
#pragma vector=NMI_VECTOR
__interrupt void nmi_ (void)
{
P1OUT ^= BIT6;
//_BIC_SR_IRQ(LPM0_bits);
for(j=0x0f;j>0;j---);
IFG1 &= ~NMIIFG;
IE1 |= NMIIE;
}
2: Maskable interrupts(可屏蔽中断)(with GIE enable):
板载的具有中断能力的外围模块,如:
(1)watchdog timer overflow in interval-timer mode.
(2)P1 and P2 Interrupts.
(3)timerA
包括timer0(timer0_A0和timer0_A1)和timer1(timer1_A0和timer1_A1)
对于timer0和timer1,各有两个中断向量,以timer0为例说明:
timer0中断向量:TIMER0_A1_VECTOR和TIMER0_A0_VECTOR
timer有三种功能模式----定时、比较和捕获.
下面对timer0中断向量和timer的功能的联系进行说明. (TA
2
定时功能:如果timerA值用作定时器,可以有三个定时器(TA、TACCR0和TACCR1),每个定时器有三种定时方式,有些定时器共用一个中断向量,TIMER0_A0_VECTOR专门为TACCR0配置,TA和TACCR1(对于timer1
,还有TACCR2)共用TIMER0_A1_VECTOR,当多个中断同时发生,按优先级的先后顺序执行
eg1:TA定时器(TAIE)
#pragma vector=TIMER0_A1_VECTOR
__interrupt void Timer_A(void)
{
switch( TA0IV )
{
case 2: break; // CCR1 not used
case 4: break; // CCR2 not used
case 10: P1OUT ^= 0x01; // overflow
break;
}
}
eg2:TACCR0定时器(CCIE)
#pragma vector=TIMER0_A0_VECTOR
__interrupt void Timer_A (void)
{
P1OUT ^= 0x01; // Toggle P1.0
}
eg3:TACCR1定时器(CCIE)
#pragma vector=TIMER0_A1_VECTOR
__interrupt void Timer_A(void)
{
switch( TA0IV )
{
case 2: // CCR1
{
P1OUT ^= 0x01; // Toggle P1.0
CCR1 += 50000; // Add Offset to CCR1
}
break;
case 4: break; // CCR2 not used
case 10: break; // overflow not used
}
}
比较功能:比较功能主要用于产生并输出PWM波形,TACCR0用来设定周期,TACCR1用来设定占空比,timer0可以输出1路PWM波(对于timer1,可以输出2路PWM波)
捕获功能:捕获功能可用于速度计算和时间测量。可通过CCISx bits选择捕获输入是CCI0A(对应于CCR0的设置),还是CCI1A(对应于CCR1的设置)(timer1对应于CCIxB).中断向量对应于定时功能中的介绍。(捕获模式下,建议选择同步捕获)
(3)Comparator_A+ Interrupts.
(4)ADC10 Interrupts.
等.......
单源中断和多源中断:
(1)单源中断:对于单源中断,进入中断服务程序后,硬件会自动清除中断标志位。无需软件清除.单源中断有:Comparator_A+ Interrupts 、ADC10 Interrupts、WDT interrupt in interval-timer mode、timer interrupt等.
(2)多源中断:对于多源中断,进入中断服务程序后,需软件清除相应中断标志位.
多源中断有:(non)-maskable NMI interrupt 、P1 and P2 Interrupts等.