3952|3

25

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

MSP430F5529A中断相应程序的退出 [复制链接]

大家好,我又来问愚蠢的问题了。

下面是ADC12多通道转换例程的中断响应程序:


#pragma vector = ADC12_VECTOR

__interrupt void ADC12ISR(void)

{

  results[0] = ADC12MEM0;                                         // 保存第一通道值

  results[1] = ADC12MEM1;                                         // 保存第二通道值

  results[2] = ADC12MEM2;                                         // 保存第三通道值

  results[3] = ADC12MEM3;                                         // 保存第四通道值

}








但是程序在实际测试中会出现一个问题,当执行完一次中断响应之后,还会继续执行中断响应,results[]被不断赋值,并不会返回主程序进入休眠状态。

我现在想执行完中断响应之后回到主程序,应该如何修改代码?中断响应程序是不是需要修改?

还有,返回主程序会指向哪一句呢?




谢谢各位!




附程序如下:


void main(void)

{

  do{

  unsigned int i;

  WDTCTL = WDTPW+WDTHOLD;                                         // 关闭看门狗

  P7SEL |= 0x03;                                                  // 使能时钟端口

  UCSCTL6 |= XCAP_3;                                              // 配置晶振电容

  while ( !(SFRIFG1 &OFIFG))                                       // 判断晶振是否起振

  {   

    UCSCTL7 &= ~(XT1LFOFFG + DCOFFG);                             // 清除失效标志位

    SFRIFG1 &= ~OFIFG;                                            // 清除失效中断标志位

  }

  UCSCTL4 = SELM__DCOCLK + SELS__DCOCLK;                          // 选择时钟源

  P7DIR &= ~(BIT4 + BIT5);                                        // P6.7口A7输入

  P7SEL |= (BIT4 + BIT5);                                         // P7口第二功能

  ADC12CTL2 = ADC12RES_2 + ADC12REFOUT;                           // AD基本配置

  ADC12CTL0 = ADC12ON + ADC12MSC + ADC12SHT03 + ADC12REFON + ADC12REF2_5V;                                       

  ADC12MCTL0 |= ADC12SREF_1 + ADC12INCH_10;                       // 采样温度

  ADC12MCTL1 |= ADC12SREF_1 + ADC12INCH_11;                       // 采样VACC/2

  ADC12MCTL2 |= ADC12INCH_12;                                     // 通道12输入

  ADC12MCTL3 |= ADC12INCH_13 + ADC12EOS;                          // 通道13输入

  ADC12CTL1 = ADC12SHP + ADC12CONSEQ_3;                           // 选择转换模式                  

  for (i=0;i<0xFFFF;i++);                                         // 等待基准电压建立                       

  UCSCTL8 |= MODOSCREQEN;  

  ADC12IE |= 0X08;                                                // 使能通道4中断

  ADC12CTL0 |= ADC12ENC;                                          // 开启转换

  _EINT();                                                         // 打开总中断

  ADC12CTL0 |= ADC12SC;                                           // 转换开始

  LPM3;                                                           // 进入低功耗3

  }while(1);

  }





最新回复

首先,关看门狗不需要每个循环都关,只要关一次就行了。 ——上面那句是看完完整的程序之前敲上去的。留着是为了让你了解看程序的时候应该发现哪些问题。 随着程序的阅读,我发现好多语句都只需要执行一次就可以了的,然而程序却都仍在了do{}while(1);循环中。 于是程序的架构就出来了:这个do-while循环本来就只执行了一次! 程序是这么运行的: 进入main之后,先完成一系列的配置,然后打开总中断,开启ADC连续转换,进入低功耗模式LPM3。 于是程序进入了深度睡眠状态,在转换完成的时候中断唤醒,将结果赋值到results数组,由于中断服务程序里没有唤醒MCU的语句,因此完成中断服务之后会回到原来的休眠模式,也就是LPM3模式,再等待下一次中断服务唤醒。 需要中断服务结束之后回到主函数,那么只需要在中断服务里增加 LPM3_EXIT; 语句即可。程序会回到上次进入休眠前的那条语句继续执行。也就是从LPM3;的下一句开始执行。这里LPM3;下一句已经是do-while循环的花括号尾了,所以会从do语句重新开始执行。也就是我上面看起来相当不正常的“怎么需要关那么多次看门狗”~~ 由于你的主函数里主循环的内容本来就不妥当,所以如果要修改的话,需要重新构建一个主循环结构,将那些配置语句放在主循环外面。   详情 回复 发表于 2015-7-12 00:41
 
点赞 关注

回复
举报

1万

帖子

2853

TA的资源

管理员

沙发
 
记得好像是进入中断程序后有个标记位会被标记表示响应中断,中断跑完后是要清的,不然就认为一直处于要响应中断的状态。学艺不精加好久没碰这些东西了记不清啦。你朝这个方向查查芯片资料看看吧。
加EE小助手好友,
入技术交流群
EE服务号
精彩活动e手掌握
EE订阅号
热门资讯e网打尽
聚焦汽车电子软硬件开发
认真关注技术本身
 
个人签名玩板看这里:
https://bbs.eeworld.com.cn/elecplay.html
EEWorld测评频道众多好板等你来玩,还可以来频道许愿树许愿说说你想要玩的板子,我们都在努力为大家实现!
 

回复

1万

帖子

2853

TA的资源

管理员

板凳
 
也叫做开中断,结束后关中断吧貌似
加EE小助手好友,
入技术交流群
EE服务号
精彩活动e手掌握
EE订阅号
热门资讯e网打尽
聚焦汽车电子软硬件开发
认真关注技术本身
 
个人签名玩板看这里:
https://bbs.eeworld.com.cn/elecplay.html
EEWorld测评频道众多好板等你来玩,还可以来频道许愿树许愿说说你想要玩的板子,我们都在努力为大家实现!
 
 

回复

1193

帖子

0

TA的资源

纯净的硅(高级)

4
 
首先,关看门狗不需要每个循环都关,只要关一次就行了。

——上面那句是看完完整的程序之前敲上去的。留着是为了让你了解看程序的时候应该发现哪些问题。

随着程序的阅读,我发现好多语句都只需要执行一次就可以了的,然而程序却都仍在了do{}while(1);循环中。

于是程序的架构就出来了:这个do-while循环本来就只执行了一次!

程序是这么运行的:
进入main之后,先完成一系列的配置,然后打开总中断,开启ADC连续转换,进入低功耗模式LPM3。
于是程序进入了深度睡眠状态,在转换完成的时候中断唤醒,将结果赋值到results数组,由于中断服务程序里没有唤醒MCU的语句,因此完成中断服务之后会回到原来的休眠模式,也就是LPM3模式,再等待下一次中断服务唤醒。

需要中断服务结束之后回到主函数,那么只需要在中断服务里增加 LPM3_EXIT; 语句即可。程序会回到上次进入休眠前的那条语句继续执行。也就是从LPM3;的下一句开始执行。这里LPM3;下一句已经是do-while循环的花括号尾了,所以会从do语句重新开始执行。也就是我上面看起来相当不正常的“怎么需要关那么多次看门狗”~~

由于你的主函数里主循环的内容本来就不妥当,所以如果要修改的话,需要重新构建一个主循环结构,将那些配置语句放在主循环外面。

 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

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

 
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
快速回复 返回顶部 返回列表