打印

关于中断退出低功耗问题

[复制链接]
1295|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
yuson102|  楼主 | 2015-8-13 11:51 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 yuson102 于 2015-8-13 11:59 编辑

  使用芯片型号:msp430fr4133
  编译器:IAR
  问题描述:在主循环处进入低功耗。在通讯中断退出低功耗,使程序能够在主循环里处理接收到的数据。但是这么做会经常无法进入接收中断。比如说本来接收到的是8个byte,但是只有前面2、3个byte 能够进入中断接收到,其他的全部miss。
具体程序架构如下。如果将中断中__low_power_mode_off_on_exit();语句去掉。又可以正常进入中断接收到所有数据。
哪位大侠知道原因,谢谢!
while(1)
{
                if(CommIsr == 0)
                {
                        __bis_SR_register(LPM3_bits + GIE);    //Enter LPM3 w/ interrupt
                }
                 WDTCTL = WDTPW + WDTCNTCL + WDTSSEL0 + WDTIS0+WDTIS1 ;        // Set watchdog
               
               if(CommIsr > 0)
                {
                        UartDataProcess();
                        CommIsr--;
                }
               
}
        
        
#pragma vector=USCI_A0_VECTOR
__interrupt void USCI_A0_ISR(void)
{

                RxdTemp = UCA0RXBUF;

                RxdBuffer[RecCnt] = RxdTemp ;

                if(CommIsr < 0xff)
                {
                        CommIsr++;
                                       
                }
                __low_power_mode_off_on_exit();//接收中断退出低功耗                        

}


相关帖子

沙发
JY-DX-JY| | 2015-8-13 16:37 | 只看该作者
你是先接收数据又退出低功耗。

使用特权

评论回复
板凳
yuson102|  楼主 | 2015-8-13 17:45 | 只看该作者
JY-DX-JY 发表于 2015-8-13 16:37
你是先接收数据又退出低功耗。

是的,先将数据存到buff里,然后退出低功耗,让程序返回到主循环时候能够处理接收到的数据。可以看以上示例程序。

使用特权

评论回复
地板
dirtwillfly| | 2015-8-13 21:50 | 只看该作者
我估计是你的程序在执行下面一段时被串口通讯中断打断了
               if(CommIsr > 0)
                {
                        UartDataProcess();
                        CommIsr--;
                }

使用特权

评论回复
5
yirongfu| | 2015-8-14 00:43 | 只看该作者
建议:
1)整组报文接收完毕再退出中断进行报文解析,不要接收一个字节就退出一次,那样很容易丢报文;
2)尽可能让波特率低些,主频相对波特率高些;
3)安排好优先级,通讯期间尽量不处理其他事件。

使用特权

评论回复
6
yuson102|  楼主 | 2015-8-14 09:34 | 只看该作者
dirtwillfly 发表于 2015-8-13 21:50
我估计是你的程序在执行下面一段时被串口通讯中断打断了
               if(CommIsr > 0)
                 ...

目前现象是连中断也进不去!

使用特权

评论回复
7
yuson102|  楼主 | 2015-8-14 09:37 | 只看该作者
yirongfu 发表于 2015-8-14 00:43
建议:
1)整组报文接收完毕再退出中断进行报文解析,不要接收一个字节就退出一次,那样很容易丢报文;
2)尽 ...

报文是在中断里已经存在buff里面,处理报文函数是判断整个报文是否完整。如果不这么做就在中断里判断整个报文的完整性了,这样设计更不合理。现在主频是1m,波特率为1200。

使用特权

评论回复
8
yirongfu| | 2015-8-15 01:13 | 只看该作者
yuson102 发表于 2015-8-14 09:37
报文是在中断里已经存在buff里面,处理报文函数是判断整个报文是否完整。如果不这么做就在中断里判断整个 ...

在中断里判断报文的结束就行了,结束后再退出低功耗模式。结束的判断可以是特定的字符,也可以是字节数,辅以一些标志位。
你说了“如果将中断中__low_power_mode_off_on_exit();语句去掉。又可以正常进入中断接收到所有数据。”,这已经很说明问题了,就是因为现在每个字节都要唤醒出去主程序转一圈,所以才容易丢失数据。如果只在接收一串报文后再唤醒处理一次,就能省去N多唤醒+判断+再休眠的循环(包括你没有贴出来的代码可能还会占用一些再次休眠之前的时钟周期)。在中断里判断完整性,按照你while部分的代码,耗不了多少时钟周期,不会错过连续字节的完整接收。
尽量减少MCU同时处理多个任务的机会,就能提高每个任务的效率。我用2系列的时候,波特率跑在9600,就是这种思路,就不会出你出的这种问题。

使用特权

评论回复
9
firstblood| | 2015-8-15 12:58 | 只看该作者
退出中断的方式很多的。

使用特权

评论回复
10
yuson102|  楼主 | 2015-8-18 08:54 | 只看该作者
yirongfu 发表于 2015-8-15 01:13
在中断里判断报文的结束就行了,结束后再退出低功耗模式。结束的判断可以是特定的字符,也可以是字节数, ...

这个是我们其中的解决方案之一,但由于架构限制,用了另外一种方案。但我始终觉得问题关键还没找到。但是还是感谢你的回答!

使用特权

评论回复
11
smilingangel| | 2015-8-19 00:04 | 只看该作者
这个本来就是中断响应的时候就自动退出了低功耗模式的啦。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

6

主题

20

帖子

1

粉丝