进入串口中断至少应该具备四个条件:第一,串口使能;第二,串口中断使能;第三,开总中断;第四,设置对应的中断向量及中断服务函数。如下程序中相应为: ME2|=UTXE1+URXE1;//串口发送、接收使能; IE2|=URXIE1;//串口接收中断使能;_EINT(); //开总中断;#pragma vector=UART1RX_VECTOR //接收中断向量。其中测试过该波特率下串口发送和接收均无问题,但发送和接收中断均无法进入。求探讨。
#include
void delay(unsigned int j)
{
unsigned int m;
for(m=0;m
{
_NOP();
}
}
void main( void )
{
// Stop watchdog timer to prevent time out reset
WDTCTL = WDTPW + WDTHOLD;
BCSCTL2|=DIVM_3+SELS+DIVS_3;//DCO-MCLK 8分频 SMCLK-XT2-8分频 1M
//配置串口
UCTL1|=CHAR+SWRST;//8位数据模式;URAT模式;串口模块复位
UTCTL1|=SSEL1; //TX时钟 SSEL1(0x20)(SMCLK) SSEL0(0x10)(ACLK)
UBR01=0x68; //配置波特率9600
UBR11=0x00;
UMCTL1|=0x10;
ME2|=UTXE1+URXE1;//串口发送、接收使能
IE2|=URXIE1;//串口接收中断使能
_EINT(); //开总中断
//配置IO
P3SEL|=BIT6+BIT7;//P3.6 TX P3.7 RX
P3DIR|=BIT6; //配置为输出
// P3DIR&=~BIT7; //配置为输入
P2DIR|=BIT0+BIT1;
P2OUT&=~(BIT0+BIT1);
UCTL1&=~SWRST;//串口模块正常工作
TXBUF1='a'; //发送测试
while((UTCTL1&TXEPT)==0);
while(1); //等待接收中断
}
#pragma vector=UART1RX_VECTOR //接收中断
__interrupt void UART1_RX(void)
{
P2OUT|=BIT0+BIT1;
//将接收到的数据发送出去
TXBUF1=RXBUF1; //读取或写入缓冲区时中断标志位会自动清除
while((UTCTL1&TXEPT)==0);
P2OUT&=~(BIT0+BIT1);
}
引用: 其中测试过该波特率下串口发送和接收均无问题,但发送和接收中断均无法进入。
中断均无法进入你是怎么判断的?根据P2.0和P2.1 灯闪烁吗?
对的,如果进入中断得话,应该会点亮LED灯,但LED始终无法点亮。
对的,如果进入中断得话,应该会点亮LED灯,但LED始终无法点亮。
进入中断执行的程序非常快。你的灯其实已经亮了。执行TXBUF1=RXBUF1;
while((UTCTL1&TXEPT)==0); 这段程序的时间太短,灯又灭了。你的眼睛来不及反应,人眼察觉不到而已。
谢谢你的回答,话又说回来了,如果执行了中断按道理应该可以在串口助手观察到接收的数据,但没有。之前测试过该的程序,如果不使用中断而用查询的方式,接收和发送是没问题的。
也许是发送有问题。可以把程序改一下,每次进接收中断反转LED状态观察一下
问题已经解决了,分享一下我的经验吧:这是一个细节问题,USART模块初始化的顺序是:SWRST=1的情况下设置串口;后设置SWRST=0使模块正常工作;最后如果需要中断,则设置相应的中断使能。即我的问题是中断使能没有设置在SWRT=0后,使中断使能位一直处于复位状态。
请问是少了UCTL1 &= ~SWRST;这个吗?这句话应该加在哪里?我也遇到这么问题