2319|0

5015

帖子

12

TA的资源

裸片初长成(初级)

楼主
 

【ULP Advisor Rule Table】规则2.1利用定时器完成延时操作 [复制链接]

很多时候我们偷懒采用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工程师炼成记》作者之一

回复
举报
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表