打印

msp430f149 如此中断嵌套可以吗?

[复制链接]
6939|22
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
4027379|  楼主 | 2012-2-10 15:08 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
开了串口0中断,不停的等待GPRS传过来的数据。
还开了个定时器中断,每2秒进一次中断。
怕在定时器进中断的时候,GPRS传过来数据,所以在定时器中断里加了 _EINT();

这样可以吗?
我发现程序跑着,串口有时接收和发送的速度慢下来了,就像突然换了时钟,不知道是不是上面的原因?

相关帖子

沙发
tianm| | 2012-2-10 17:54 | 只看该作者
定时器中断 进出一次要多久

使用特权

评论回复
板凳
TI_MCU| | 2012-2-10 18:17 | 只看该作者
是可以通过_EINT()使能中断进行中断嵌套的,只是这时中断没有优先级了,只要有中断就会嵌套进入中断。

不知道楼主的程序中还有没有别的中断?速度慢下来是指的发送频率变低了还是传输的波特率降低了?

使用特权

评论回复
地板
FVJFIFE| | 2012-2-12 16:07 | 只看该作者
详细说说用了几个中断,每个中断的优先级以及做了什么事情,执行需要多长时间

使用特权

评论回复
5
永远的不知| | 2012-2-13 12:56 | 只看该作者
中断嵌套后的时序楼主推敲一下啊

使用特权

评论回复
6
4027379|  楼主 | 2012-2-14 15:29 | 只看该作者
中断优先级可以自己设吗?
我用到两个中断,串口0中断和定时器A中断。
定时器2秒一次中断,
担心怕定时器进中断的时候,GPRS向串口0传过来数据,所以在定时器中断优先级要高于串口0.
速度慢下来是指,系统时钟好像慢了。

使用特权

评论回复
7
4027379|  楼主 | 2012-2-14 15:31 | 只看该作者
本帖最后由 4027379 于 2012-2-16 14:37 编辑

程序上次贴错了补充一下:
中断程序如下:
// UART0 RX ISR will for exit from LPM3 in Mainloop
#pragma vector=UART0RX_VECTOR
__interrupt void usart0_rx (void)
{
//***********************串口1看结果*************************
  while (!(IFG2 & UTXIFG1));                           
  TXBUF1 = RXBUF0;   
// ************************************************************/
  RecBuf[J]=RXBUF0;
  J++;
  LPM3_EXIT;
}
// Timer_A3 Interrupt Vector (TAIV) handler
#pragma vector=TIMERA1_VECTOR
__interrupt void Timer_A(void)
{
  _EINT();
  switch( TAIV )
  {
    case  2:  break;                                     // CCR1 not used
    case  4:  break;                                     // CCR2 not used
    case 10:  I++;
      LPM3_EXIT ;                              // 跳出LPM3
                  break;
  }

使用特权

评论回复
8
永远的不知| | 2012-2-15 10:35 | 只看该作者
如果2s定时中断要求不是很严格,可以通过查询2s定时的方法。
即查询定时器中断标志,但是中断发生后不进入中断函数。

使用特权

评论回复
9
a_b_c_d| | 2012-2-15 10:42 | 只看该作者
单片机中断是个难点,一定要好好学习

使用特权

评论回复
10
永远的不知| | 2012-2-15 10:46 | 只看该作者
看串口通信程序,似乎进入中断前程序处于LPM3模式休眠,所以后面有退出的语句,
但是定时中断里没有,不太明白。
另外程序是用的哪个时钟?
如果使用的是内部时钟,那么这个时钟不是很准,
和事先预想的会有差别,是否速度慢下来是它的原因?

使用特权

评论回复
11
爱之翼V| | 2012-2-15 14:03 | 只看该作者
楼上说得在理,楼主采纳一下

使用特权

评论回复
12
xhtwork| | 2012-2-15 23:54 | 只看该作者
1. 时钟看起来慢与2秒中断肯定无关
2. 应该是gprs中断频率高、中断服务时间长,相对而言主程序就没时间执行了,看起来显得慢。

使用特权

评论回复
13
TI_MCU| | 2012-2-16 09:22 | 只看该作者
楼主的代码应该不会影响系统的时钟。

楼主说的系统时钟慢了的判断依据是什么呢?

使用特权

评论回复
14
hbb.email| | 2012-2-16 12:56 | 只看该作者
我的 类似楼上的说法 1.与timerA的2秒中断是应该是无关的。
2.串口与GPRS通信只需要9600波特率,不要太高(GPRS模块的波特率,用AT+IPR=9600;设置AT&W保存),MSP430F149用LXFT1低频晶振32.768K做时钟源,UART的寄存器里选择ACLK
3.注意在UART中断里加上 内部时钟DCO激活。
这里有两个文档做参考,仔细看一下。

MSP430串口编程和调试技巧1.0.pdf

288.61 KB

MSP430系统时钟寄存器.pdf

123.54 KB

使用特权

评论回复
15
4027379|  楼主 | 2012-2-16 14:42 | 只看该作者
本帖最后由 4027379 于 2012-2-16 14:47 编辑
看串口通信程序,似乎进入中断前程序处于LPM3模式休眠,所以后面有退出的语句,
但是定时中断里没有,不太明白。
另外程序是用的哪个时钟?
如果使用的是内部时钟,那么这个时钟不是很准,
和事先预想的会有差别,是 ...
永远的不知 发表于 2012-2-15 10:46


程序上次贴错了,定时中断里有LPM3_EXIT ;                              // 跳出LPM3
现补充了。
我用的是外部的晶振,之所以感觉慢是因为在UART0向GPRS送数据,紧接着UART1向串口调式软件发刚送GPRS的数据,一段时间后发现串口调式软件里的数据速度降下来,怀颖中断嵌套造成的。

使用特权

评论回复
16
4027379|  楼主 | 2012-2-16 14:45 | 只看该作者
15# hbb.email

东西收下,谢谢。我会仔细研究的。

使用特权

评论回复
17
4027379|  楼主 | 2012-2-16 14:46 | 只看该作者
我的 类似楼上的说法 1.与timerA的2秒中断是应该是无关的。
2.串口与GPRS通信只需要9600波特率,不要太高(GPRS模块的波特率,用AT+IPR=9600;设置AT&W保存),MSP430F149用LXFT1低频晶振32.768K做时钟源,UART的寄 ...
hbb.email 发表于 2012-2-16 12:56

东西收下,谢谢。我会仔细研究的。

使用特权

评论回复
18
4027379|  楼主 | 2012-2-16 14:47 | 只看该作者
楼主的代码应该不会影响系统的时钟。

楼主说的系统时钟慢了的判断依据是什么呢?
TI_MCU 发表于 2012-2-16 09:22

UART0向GPRS送数据,紧接着UART1向串口调式软件发刚送GPRS的数据,一段时间后发现串口调式软件里的数据速度降下来,怀颖中断嵌套造成的。

使用特权

评论回复
19
hbb.email| | 2012-2-16 17:51 | 只看该作者
我认为你那样uart0收到数据后,单字节立即转发,转发时还要UART1还要用while判断是否准备好了,这样非常占用时间,而且你的Uart0、Uart1用的的同一个晶振?
测试方法可以这样
1.将uart0、uart1用不同的晶振,比如Uart0用LXFT1,Uart2用XT2;
2.或者将Uart0收到一段数据(而不是一个字节)后,再Uart1转发。
第二种方案,程序如下:
#define MAX_LEN 255
extern uchar UartRecLen0=0;//串口0接收数据的长度。
extern uchar UartRecBuf0[MAX_LEN];//串口0接收数据Buffer
extern uchar Glast_r=0;

#define UART1_FORWARD_QUICK 0
//#define UART1_FORWARD_QUICK 1

void RecVary0() //串口0接受消抖。
{

while(1)
  {
   Glast_r = UartRecLen0;
   Delay_ms(10);  
   if(Glast_r == UartRecLen0) break;   
  }                                 
}

void Uart1Send(uchar *buf1,uchar Len1) //串口1发送
{
uint i;
for(i=0;i<Len1;i++)
{
  while (!(IFG2 & UTXIFG1));                // USART1 TX buffer ready?
  TXBUF1 = buf1[i];
  while((UTCTL1&0x01)==0);
}
}

// UART0 RX ISR will for exit from LPM3 in Mainloop
#pragma vector=UART0RX_VECTOR
__interrupt void usart0_rx (void)
{
    while (!(IFG1 & UTXIFG0));               
    UartRecBuf0[UartRecLen0] = RXBUF0;       
    UartRecLen0++;
    if(UartRecLen0>=MAX_LEN) UartRecLen0=0;

#if UART1_FORWARD_QUICK==1 ////这种模式,快速转发串口0的数据(预编译命令,不占用程序时间。)
    RecVary0(); //如果Uart0还有数据还在继续,就一直等在这里,当然这里是ms级的,不会太久。
    Uart1Send(UartRecLen0,UartRecLen0); UartRecLen0=0 //串口1转发串口0数据
#endif
}

// Timer_A3 Interrupt Vector (TAIV) handler
#pragma vector=TIMERA1_VECTOR
__interrupt void Timer_A(void)
{
  _EINT();
  switch( TAIV )
  {
   #if UART1_FORWARD_QUICK==0 //这种模式,每2秒转发串口0的数据
     if(UartRecLen0>0)//退出低功耗模式前,判断串口0长度>0 转发消息。
     {
      RecVary0();
      Uart1Send(UartRecLen0,UartRecLen0);
     }
   #endif
    case  2:  break;                                     // CCR1 not used
    case  4:  break;                                     // CCR2 not used
    case 10:  I++;
      LPM3_EXIT ;                              // 跳出LPM3
                  break;
  }

main()
{
SystemInit();//看门狗、晶振与中断 等等初使化
GPRSInit();//打开GPRS电源,并连接上网络等等
_BIS_SR(LPM3_bits+GIE);//进入低功耗模式

#if UART1_FORWARD_QUICK==0 //这种模式,每2秒转发串口0的数据
if(UartRecLen0>0)//退出低功耗模式后,判断串口0长度>0 转发消息。
{
  RecVary0();
  Uart1Send(UartRecLen0,UartRecLen0);
}
#endif
}

我用MSP430F169,GPRS芯片,AT命令,做过估计与你一样的项目
下午无聊,交流也是进步,写了我小时啊!

使用特权

评论回复
评论
4027379 2013-5-17 09:58 回复TA
辛苦你了 
20
daisyly| | 2012-2-16 22:16 | 只看该作者
楼上的辛苦了。

使用特权

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

本版积分规则

12

主题

77

帖子

1

粉丝