USCI无法进入串口中断(其他中断也进不去)

[复制链接]
2817|6
 楼主| banalmaster 发表于 2013-9-15 10:28 | 显示全部楼层 |阅读模式
本帖最后由 banalmaster 于 2013-9-15 18:15 编辑

用的是MSP430G2353单片机,UART在9600波特率下可以成功发送数据,但是是在主函数里发送的,没有进入发送中断。
但是测试接收数据功能时,就是进不去中断。
我没有用外部晶振,MCLK、SMLCK的时钟来源均为内部DCO,UART时钟来源为SMCLK,但是进不去中断。一开始以为是时钟问题,将UART时钟调为ACLK后,还是进不去中断。
后来测试了下看门狗的中断程序,也无法进入中断。
论坛的大大们看看可能是什么原因?
顺便把接收的代码贴出来:
  1. #include <msp430g2353.h>
  2. void CLK_INIT(void);
  3. void USCI_UART_INIT(void);
  4. int flag=1;

  5. void main(void)
  6. {
  7.   volatile unsigned int i;
  8.    WDTCTL = WDTPW + WDTHOLD;                 // 关闭看门狗
  9.   CLK_INIT();                               // SMCLK=1.6MHz
  10.   _EINT()
  11.   USCI_UART_INIT();


  12. void CLK_INIT(void)
  13. {
  14.   BCSCTL1 = 0X00;                           // 将寄存器的内容清零; XT2震荡器开启; LFTX1工作在高频模式; ACLK的分频因子为1      
  15.   DCOCTL  |= DCO1+DCO0;
  16.   BCSCTL1 |= RSEL3;                                         // DCO Rsel=8,DC0=3,MOD=0(Freq=1.6MHz)
  17.   BCSCTL2 |= 0x00;                         // MCLK和SMCLK的时钟源为DCOCLK,分频因子为1
  18. }

  19. void USCI_UART_INIT(void)
  20. {
  21.   P1SEL |= 0x06;                            // P1.1,1.2作为UART的RXD/TXD
  22.   P1SEL2 |= 0x06;
  23.   UCA0CTL0=0x00;                                                        // 默认设置:无校验位、8位字符、1位停止位、UART模式
  24.   UCA0CTL1 |= UCSSEL1;                                // UCLK = SMCLK
  25.   //ME1 |= UTXE0 + URXE0;                     // 使能USART0的TXD/RXD,ME1为使能寄存器

  26.   //9600
  27.   UCA0BR1 = 0x00;
  28.   UCA0BR0 = 0xA6;                           // 1.6MHz/9600 = 1600000/9600=166.67 ≈ 166 (00A6h)                              
  29. //  UCA0MCTL = 0x57;                          // 波特率调整控制寄存器 */
  30.   UCA0CTL1 &= ~UCSWRST;                     // Initialize USCI state machine
  31.   IE2 |= UCA0RXIE;                          // IE1 |= UCA0TXIE+UCA0RXIE;  只使能USART0 RX中断,否则会发生乱码
  32.   UCA0TXBUF=0x03;
  33. }


  34. #pragma vector=USCIAB0RX_VECTOR
  35. __interrupt void USCI0RX_ISR(void)
  36. {
  37.   while (!(IFG2&UCA0TXIFG));                // USCI_A0 TX buffer ready?
  38.   UCA0TXBUF = UCA0RXBUF;                    // TX -> RXed character
  39. }


dirtwillfly 发表于 2013-9-15 10:57 | 显示全部楼层
你关了看门狗,怎么可能会进入看门狗中断
dirtwillfly 发表于 2013-9-15 10:57 | 显示全部楼层
本帖最后由 dirtwillfly 于 2013-9-15 11:04 编辑

也没看到你开中断功能
 楼主| banalmaster 发表于 2013-9-15 18:12 | 显示全部楼层
dirtwillfly 发表于 2013-9-15 10:57
你关了看门狗,怎么可能会进入看门狗中断

这个是串口的程序,看门狗的代码没有关看门狗的语句。
 楼主| banalmaster 发表于 2013-9-15 18:14 | 显示全部楼层
dirtwillfly 发表于 2013-9-15 10:57
也没看到你开中断功能

_EINT()语句有没有都进不去中断,贴代码的时候我把_EINT()注释掉了,所以就给删了:P。
不知道还有没有别的可能?
现在在主函数里可以收到串口数据。
mmbs 发表于 2013-9-15 23:13 | 显示全部楼层
你的主函数写全了?
mmbs 发表于 2013-9-15 23:13 | 显示全部楼层
还有while呢吧
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:email:life.2@qq.com QQ:1917294316 欢迎探讨嵌入式、单片机知识。

2

主题

128

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部