[原创] 【ULP Advisor Rule Table】规则2.1利用定时器完成延时操作

wstt   2013-6-9 23:42 楼主
很多时候我们偷懒采用CPU在那里空跑的方式来获得延时,下面看看有哪些延时语句
  1. __no_operation();
  2. _NOP();
这是空操作语句,其实我认为少量的这样的语句是可以接受的
  1. volatile int i = MAX_VALUE;
  2. while (i-- > 0);
这种是最常见的延时操作了
  1. __delay_cycles(NUMBER_OF_CYCLES);
相似的还有这个。

在ULP中出现上面的三种语句都会提示报警,其实我认为有时候为了调试或者一两个clk的等待使用NOP这样的语句(第一种)其实可以接受的,很少时间的CLK延时也去使用定时器,引入太多的中断源也不利于稳定。
当然,第二和第三中才是“罪大恶极”的延时语句,长时间让CPU处于一种无意义的运行状态是很耗费能量的。相比较而言定时器就要节能很多,所以建议采用定时器定时唤醒的方式。
COPY个例子过来:
  1. //******************************************************************************
  2. //  MSP430G2xx3 Demo - Timer_A, Toggle P1.0, CCR0 Cont. Mode ISR, DCO SMCLK
  3. //
  4. //  Description: Toggle P1.0 using software and TA_0 ISR. Toggles every
  5. //  50000 SMCLK cycles. SMCLK provides clock source for TACLK.
  6. //  During the TA_0 ISR, P1.0 is toggled and 50000 clock cycles are added to
  7. //  CCR0. TA_0 ISR is triggered every 50000 cycles. CPU is normally off and
  8. //  used only during TA_ISR.
  9. //  ACLK = n/a, MCLK = SMCLK = TACLK = default DCO
  10. //
  11. //           MSP430G2xx3
  12. //         ---------------
  13. //     /|\|            XIN|-
  14. //      | |               |
  15. //      --|RST        XOUT|-
  16. //        |               |
  17. //        |           P1.0|-->LED
  18. //
  19. //  D. Dang
  20. //  Texas Instruments Inc.
  21. //  December 2010
  22. //   Built with CCS Version 4.2.0 and IAR Embedded Workbench Version: 5.10
  23. //******************************************************************************

  24. #include

  25. void main(void)
  26. {
  27.    WDTCTL = WDTPW + WDTHOLD;                 // Stop WDT
  28.    P1DIR |= 0x01;                            // P1.0 output
  29.    CCTL0 = CCIE;                             // CCR0 interrupt enabled
  30.    CCR0 = 50000;
  31.    TACTL = TASSEL_2 + MC_2;                  // SMCLK, contmode

  32.    _BIS_SR(LPM0_bits + GIE);                 // Enter LPM0 w/ interrupt
  33. }

  34. // Timer A0 interrupt service routine
  35. #pragma vector=TIMER0_A0_VECTOR
  36. __interrupt void Timer_A (void)
  37. {
  38.    P1OUT ^= 0x01;                            // Toggle P1.0
  39.    CCR0 += 50000;                            // Add Offset to CCR0
  40. }
《MCU工程师炼成记》作者之一

回复评论

暂无评论,赶紧抢沙发吧
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复