历史上的今天
今天是:2025年03月03日(星期一)
2020年03月03日 | 关于定时器A的官方例子解读
2020-03-03 来源:eefocus
//******************************************************************************
// MSP-FET430P140 Demo - Timer_A, Toggle P1.0, CCR0 Cont. Mode ISR, DCO SMCLK
//
// Description: Toggle P1.0 using software and TA_0 ISR. Toggles every
// 50000 SMCLK cycles. SMCLK provides clock source for TACLK.
// During the TA_0 ISR, P1.0 is toggled and 50000 clock cycles are added to
// CCR0. TA_0 ISR is triggered every 50000 cycles. CPU is normally off and
// used only during TA_ISR.
// ACLK = n/a, MCLK = SMCLK = TACLK = default DCO ~800kHz
//
// MSP430F149
// ---------------
// /|| XIN|-
// | | |
// --|RST XOUT|-
// | |
// | P1.0|-->LED
//
// M. Buccini
// Texas Instruments Inc.
// Feb 2005
// Built with IAR Embedded Workbench Version: 3.21A
//******************************************************************************
#include void main(void) { WDTCTL = WDTPW + WDTHOLD; // Stop WDT P1DIR |= 0x01; // P1.0 output CCTL0 = CCIE; // CCR0 interrupt enabled CCR0 = 50000; TACTL = TASSEL_2 + MC_2; // SMCLK, contmode _BIS_SR(LPM0_bits + GIE); // Enter LPM0 w/ interrupt } // Timer A0 interrupt service routine #pragma vector=TIMERA0_VECTOR __interrupt void Timer_A (void) { P1OUT ^= 0x01; // Toggle P1.0 CCR0 += 50000; // Add Offset to CCR0 } 关闭了看门狗,定义了二极管引脚为输出; 因为#define CCTL0 TACCTL0 /* Timer A Capture/Compare Control 0 */, 所以,先开启了 CCTL0 捕获/比较寄存器的中断使能。 因为#define CCR0 TACCR0 /* Timer A Capture/Compare 0 */ 所以,设置了比较值为50000,(50000<65536). 因为#define TA0CTL TACTL /* Timer A Control /TA控制寄存器; #define TASSEL_2 (20x100u) /* Timer A clock source select: 2 - SMCLK / #define MC_2 (20x10u) /* Timer A mode control: 2 - Continous up */ 所以时钟源用的是SMCLK ,工作方式是连续计数模式 连续计数模式的时候 TACCR0 做为一般捕获比较寄存器使用,所以只有能引起一个中断标志位 开启总中断,进入低功耗模式,等待中断唤醒 中断函数,为LED改变电平,并且给TACCR0 赋初值;(增加一定的偏移量) #include void main(void) { WDTCTL = WDTPW + WDTHOLD; // Stop WDT P2DIR |= BIT0 + BIT2; // P2.0 output CCTL0 = CCIE; // CCR0 interrupt enabled CCR0 = 50000; TACTL = TASSEL_2 + MC_2 + TAIE; // SMCLK, contmode _BIS_SR(LPM0_bits + GIE); // Enter LPM0 w/ interrupt } // Timer A0 interrupt service routine #pragma vector=TIMERA0_VECTOR __interrupt void Timer_A0 (void) { P2OUT ^= 0x01; // Toggle P2.0 CCR0 += 50000; // Add Offset to CCR0 } // Timer A0 interrupt service routine #pragma vector=TIMERA1_VECTOR __interrupt void Timer_A1 (void) { switch(TAIV) { case 2:break; case 4:break; case 10:P2OUT ^= 0x04;break; // Toggle P2.0 } } 定时器TA中,针对定时器的中断有两个,一个是TAIFG一个是TACCR0 CCIFG; 上面的例子改编,我增加了一个小灯,使 TAIFG置位后引起中断改编小灯状态,发现两个中断并不影响 所以连续计数模式的时候CCR0相当于一个独立的计数器,相当于TAR,但是可以通过CCIE使能中断
史海拾趣
|
LPC1000系列ARM 世界上功耗最低的Cortex-M3 CPU LPC1000系列ARM是以第二代Cortex-M3为内核的微控制器,用于处理要求高度集成和低功耗的嵌入式应用。采用3级流水线和哈佛结构,其运行速度高达100MHz,带独立的本地指令和数据总线以及用于外设的 ...… 查看全部问答> |
|
if(down_interruptible(&dev->sem)) return -ERESTARTSYS; 其中dev->sem是用于实现互斥的信号量 请问这两行代码是什么意思?因为down_interruptible正常情况下是返回0的,这里它不是正常返回,到底是因为没能拿到信号量,还是因为 ...… 查看全部问答> |
|
一个简单的上升沿检测代码:reg RS_r1,RS_r2;always @ (posedge CLKIN or posedge RESET) if(RESET) RS_r1 <= 1\'b0; else RS_r1 <= RS ...… 查看全部问答> |
|
用的XS128中心对齐和左对齐比如哪个精度更高一些 极性有区别吗 [ 本帖最后由 50572209 于 2011-3-9 23:13 编辑 ]… 查看全部问答> |
|
在程序中用了sprintf函数后,编译没有错,但下载时出现以下错误提示,求解释。 Error[e104]: Failed to fit all segments into specified ranges. Problem discovered in segment CODE. Unable to place 77 block(s) (0x1cec byte(s) total) in 0x754 byte(s) of memory. The problem occurred while processing the ...… 查看全部问答> |




