本帖最后由 banalmaster 于 2013-9-15 18:15 编辑
用的是MSP430G2353单片机,UART在9600波特率下可以成功发送数据,但是是在主函数里发送的,没有进入发送中断。
但是测试接收数据功能时,就是进不去中断。
我没有用外部晶振,MCLK、SMLCK的时钟来源均为内部DCO,UART时钟来源为SMCLK,但是进不去中断。一开始以为是时钟问题,将UART时钟调为ACLK后,还是进不去中断。
后来测试了下看门狗的中断程序,也无法进入中断。
论坛的大大们看看可能是什么原因?
顺便把接收的代码贴出来:#include <msp430g2353.h>
void CLK_INIT(void);
void USCI_UART_INIT(void);
int flag=1;
void main(void)
{
volatile unsigned int i;
WDTCTL = WDTPW + WDTHOLD; // 关闭看门狗
CLK_INIT(); // SMCLK=1.6MHz
_EINT()
USCI_UART_INIT();
void CLK_INIT(void)
{
BCSCTL1 = 0X00; // 将寄存器的内容清零; XT2震荡器开启; LFTX1工作在高频模式; ACLK的分频因子为1
DCOCTL |= DCO1+DCO0;
BCSCTL1 |= RSEL3; // DCO Rsel=8,DC0=3,MOD=0(Freq=1.6MHz)
BCSCTL2 |= 0x00; // MCLK和SMCLK的时钟源为DCOCLK,分频因子为1
}
void USCI_UART_INIT(void)
{
P1SEL |= 0x06; // P1.1,1.2作为UART的RXD/TXD
P1SEL2 |= 0x06;
UCA0CTL0=0x00; // 默认设置:无校验位、8位字符、1位停止位、UART模式
UCA0CTL1 |= UCSSEL1; // UCLK = SMCLK
//ME1 |= UTXE0 + URXE0; // 使能USART0的TXD/RXD,ME1为使能寄存器
//9600
UCA0BR1 = 0x00;
UCA0BR0 = 0xA6; // 1.6MHz/9600 = 1600000/9600=166.67 ≈ 166 (00A6h)
// UCA0MCTL = 0x57; // 波特率调整控制寄存器 */
UCA0CTL1 &= ~UCSWRST; // Initialize USCI state machine
IE2 |= UCA0RXIE; // IE1 |= UCA0TXIE+UCA0RXIE; 只使能USART0 RX中断,否则会发生乱码
UCA0TXBUF=0x03;
}
#pragma vector=USCIAB0RX_VECTOR
__interrupt void USCI0RX_ISR(void)
{
while (!(IFG2&UCA0TXIFG)); // USCI_A0 TX buffer ready?
UCA0TXBUF = UCA0RXBUF; // TX -> RXed character
}
|