想测试一下MSP430F149从LPM3模式退出后8M时钟能否正常工作,时钟用8M,SMCLK=8M,UART1用SMCLK时钟分到115200。从LPM3模式退出后串口发送错误,本来程序里发送一个字节,结果收到两个字节,感觉LPM3退出后串口波特率有问题,如果不进LPM3模式则串口发送正确,请各位高手给分析一下位什么串口发送出错。
void clk_init(void)
{
BCSCTL1&=~XT2OFF; //
do
{IFG1 &= ~OFIFG; //清OSCFault标志
for(i=0xFF;i>0;i–); //延时等待
}
while((IFG1 & OFIFG) != 0); //查OSCFault,为0时转换完成
BCSCTL2|= SELM1 +SELS;
}
//****************************************************************************
//串口初始化
//****************************************************************************
void InitUART(void)
{
P3DIR|=BIT6;
P3DIR&=~BIT7;
P3SEL |= 0xC0; // P3.6,7 = USART0 TXD/RXD
ME2 |= URXE1 + UTXE1; // Enable USART1 T/RXD
UCTL1 |= CHAR; // 8-bit character
UTCTL1 |= SSEL1; // UCLK =SMCLK
UBR01 = 0x45; // 115200
UBR11 = 0x00; //
UMCTL1 = 0x4A; // Modulation
UCTL1 &= ~SWRST; // Initialize USART state machine
IE2 |=0x10;
IFG2&= ~URXIFG1;
}
int main( void )
{
// Stop watchdog timer to prevent time out reset
WDTCTL = WDTPW + WDTHOLD;
clk_init();
InitUART();
P2IE |= BIT0; // P2.0中断使能,在端口中断里退出LPM3
P2IES |= BIT0; // P2.0 IO口边沿中断触发模式,下边沿有效
P2IFG &= ~BIT0;
__enable_interrupt(); //开全局中断
while(1)
{
BCSCTL1|=XT2OFF; LPM3;
clk_init();
TXBUF1=0x47;
while (!(IFG2 & UTXIFG1));
}}
/// P2口中断服务程序
#pragma vector=PORT2_VECTOR
__interrupt void Port_2(void)
{
LPM3_EXIT; //
P2IFG &= ~BIT0; // P2.0清除相应中断标志位
}
yun li4:
回复 灰小子:
发送完加个延时就好了,谢谢解答