2984|0

9726

帖子

24

TA的资源

版主

楼主
 

使用msp430低功耗延时函数遇到的问题和解决办法 [复制链接]


最近在用MSP430做东西
对发热有一些要求
为了尽可能减少发热
单片机一直运行在低功耗模式
包括代码中的延时函数
自己写了一个低功耗延时函数
给定时器设置一个时间
然后让单片机进入睡眠状态
通过定时器中断唤醒并将一个标志清零
因为其它中断也有唤醒代码
醒后判断标志是否被定时器清零0
如果清零代码继续执行
如果没清零继续进入睡眠状态

代码是下边这样

  1. void delay_ms_lpm3(uint16_t ms)
  2. {
  3.     if(ms > 5957)while(1);
  4.     TA1CCTL0 = CCIE;                                                            // CCR0 interrupt enabled
  5.     TA1CCR0 = 11*ms;
  6.     TA1CTL = TASSEL_1 + MC_1;                                                   // ACLK = 11KHz, Up to CCR0  
  7.     delay_flag = 1;                                                             //设置延时标志
  8.     while(delay_flag)                                                          //等待延时标志被中断清除
  9.     {   
  10.       __bis_SR_register(LPM3_bits + GIE);                                         // CPU off, interrupts enabled
  11.     }
  12. }

  13. #pragma vector=TIMER1_A0_VECTOR
  14. __interrupt void Timer1_A0 (void)
  15. {
  16.     delay_flag = 0;
  17.     TA1CTL &= ~(MC_1);
  18.     TA1CCTL0 &= ~(CCIE);
  19.     __bic_SR_register_on_exit(LPM3_bits);        // Exit LPMx
  20. }
复制代码


以前运行没发现问题,后来在串口中断里作了一些数据处理
现在的代码运行一会儿就会卡在while(delay_flag)
delay_flag会一直为1


经过分析发现这个延时函数存在一些隐患
比如
delay_flag = 1; 是在定时器配置好以后设置的
如果代码正好在定时器配置好,还没有将delay_flag置1
此时定时器已经工作,如果有其它中断产生,比如UART,然后在中断函数里占用了一定时间
这个时间超过定时器的定时时间
中断退出后此定时器到达指定时间会产生中断,将delay_flag置0,其实delay_flag本来就是0
接下来继续执行代码,将delay_flag置1,然后等待delay_flag被定时器中断清零
因为定时器中断函数已经执行过,所以delay_flag会一直为1,代码才会卡在这里
解决办法是将delay_flag=1放在配置定时器之前
修改后的代码运行了一段时间,还没有发现之前的问题

  1. void delay_ms_lpm3(uint16_t ms)
  2. {
  3.     if(ms > 5957)while(1);
  4.         delay_flag = 1;                                                             //设置延时标志
  5.     TA1CCTL0 = CCIE;                                                            // CCR0 interrupt enabled
  6.     TA1CCR0 = 11*ms;
  7.     TA1CTL = TASSEL_1 + MC_1;                                                   // ACLK = 11KHz, Up to CCR0  
  8.     while(delay_flag)                                                          //等待延时标志被中断清除
  9.     {   
  10.       __bis_SR_register(LPM3_bits + GIE);                                         // CPU off, interrupts enabled
  11.     }
  12. }
复制代码


 
点赞 关注
个人签名虾扯蛋,蛋扯虾,虾扯蛋扯虾

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

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

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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

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

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

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