|
用TI的例程跑一个uart数据回收的一个程序,感觉TI中只分频(不知道此处是否理解错误)就加了一个时钟设置,可是用串口调试软件测试时,收到的都是乱码,波特率按照程序应该是9600,我也设置对了的,就是跑不对。之前自己没加那个时钟设置时,收到的依然是乱码,现在凌乱了,新手不懂啊,求各位大大指导! 或者各位大大有正确的程序可以给我一下,让我学习一下吗
#include "msp430x54x.h"
#define FLL_FACTOR 549
void Init_CLK(void)
{
WDTCTL = WDTPW + WDTHOLD ; // 关看门狗
P7SEL |= 0x03 ; // 端口选择外部低频晶振XT1
UCSCTL6 &=~XT1OFF ; // 使能外部晶振
UCSCTL6 |= XCAP_3 ; // 设置内部负载电容,选择的是标准的12pf
UCSCTL3 |= SELREF_2 ; // DCOref = REFO,选择REFOCLK为默认时钟源
UCSCTL4 |= SELA_0 ; // ACLK = XT1 XT1作为辅助时钟源
__bis_SR_register(SCG0) ; // 关闭FLL控制回路,内部函数,对状态寄存器里SCGO位置1
UCSCTL0 = 0x0000 ; // 设置DCOx, MODx
UCSCTL1 = DCORSEL_7 ; // 设置DCO振荡范围
UCSCTL2 = FLLD__1 + FLL_FACTOR ; // ?Fdco = ( FLL_FACTOR + 1)×FLLRef = (649 + 1) * 32768 = 21.2992MHz
__bic_SR_register(SCG0) ; // 打开FLL控制回路 ,对SCGO位置0
__delay_cycles(1024000) ;
do
{
UCSCTL7 &= ~(XT2OFFG + XT1LFOFFG + XT1HFOFFG + DCOFFG); // 清除 XT2,XT1,DCO 错误标志
SFRIFG1 &= ~OFIFG ;
}while(SFRIFG1&OFIFG) ; // 检测振荡器错误标志,当OFIFG=1时,有错误,进入循环,清除错误标志
}
void main(void)
{
WDTCTL = WDTPW + WDTHOLD; // Stop WDT
Init_CLK( );
_EINT() ;
P3SEL = 0x30; // P3.4,5 = USCI_A0 TXD/RXD
P3OUT |= 0x10;
UCA0CTL1 |= UCSWRST; // **Put state machine in reset**
UCA0CTL1 |= UCSSEL_1; // ACLK
UCA0BR0 = 0x03;
UCA0BR1 = 0x00;
UCA0MCTL = UCBRS_3 + UCBRF_0 ;
UCA0CTL1 &= ~UCSWRST; // **Initialize USCI state machine**
UCA0IE |= UCRXIE; // Enable USCI_A0 RX interrupt
__bis_SR_register(GIE); // interrupts enabled
// __no_operation(); // For debugger
while(1);
}
// Echo back RXed character, confirm TX buffer is ready first
#pragma vector=USCI_A0_VECTOR
__interrupt void USCI_A0_ISR(void)
{
switch(__even_in_range(UCA0IV,4))
{
case 0:break; // Vector 0 - no interrupt
case 2: // Vector 2 - RXIFG
while (!(UCA0IFG&UCTXIFG)); // USCI_A0 TX buffer ready?
UCA0TXBUF = UCA0RXBUF; // TX -> RXed character
break;
case 4:break; // Vector 4 - TXIFG
default: break;
}
}
|
阿莫论坛20周年了!感谢大家的支持与爱护!!
月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!
|