MSP430F5438學習筆記 UART ACLK 9600-8-N-1
1.初始化UART0之前需要先初始化ACLK、SMCLK和MCLK。示例代碼中使用XT1,ACLK為32768,SMCLK和MCLK約為8MHZ。
2.UART的時鐘可以參考ACLK或者SMCLK,本例參考ACLK。由于參考ACLK時鐘,所以串口速率不能超過32768。選擇9600較為合適。
3.MSP430波特率的產生有兩種模式,低頻波特率產生和過采樣波特率產生。代碼中使用低頻波特率產生。
4.代碼的開頭調用了stdio,在函數(shù)中宏重寫了putchar函數(shù),定向到UART單字節(jié)輸出。
5.代碼初始化之后輸出 Hello MSP430,隨后直接反射串口接收到的數(shù)據(jù),例如發(fā)送123456即返回123456。
//時鐘默認情況
//FLL時鐘FLL選擇XT1
//輔助時鐘ACLK選擇XT132768Hz
//主系統(tǒng)時鐘MCLK選擇DCOCLKDIV8000000Hz
//子系統(tǒng)時鐘SMCLK選擇DCOCLKDIV8000000Hz
//UART時鐘選擇ACLK
//低頻波特率產生9600-8-N-1
#include
#include
voidclock_config(void);
voidselect_xt1(void);
voiddco_config(void);
voiduart_config(void);
intmain(void)
{
clock_config();//初始化時鐘
uart_config();
_EINT();
P4DIR|=BIT0;//P4.0輸出
printf("HelloMSP430!rn");
while(1)
{
P4OUT^=BIT0;
__delay_cycles(1000000);
}
}
voidclock_config(void)
{
WDTCTL=WDTPW+WDTHOLD;//停止看門狗
select_xt1();//選擇XT1
dco_config();//ACLK=XT1=32.768K
//MCLK=SMCLK=8000K
}
voidselect_xt1(void)
{
//啟動XT1
P7SEL|=0x03;//P7.0P7.1外設功能
UCSCTL6&=~(XT1OFF);//XT1打開
UCSCTL6|=XCAP_3;//內部電容
do
{
UCSCTL7&=~XT1LFOFFG;//清楚XT1錯誤標記
}while(UCSCTL7&XT1LFOFFG);//檢測XT1錯誤標記
}
voiddco_config(void)
{
__bis_SR_register(SCG0);//禁止FLL功能
UCSCTL0=0x0000;//SetlowestpossibleDCOx,MODx
UCSCTL1=DCORSEL_5;//DCO最大頻率為16MHz
UCSCTL2=FLLD_1+243;//設置DCO頻率為8MHz
//MCLK=SMCLK=Fdcoclkdiv=(N+1)X(Ffllrefclk/n)
//N為唯一需要計算的值
//FfllrefclkFLL參考時鐘,默認為XT1
//n取默認值,此時為1
//(243+1)*32768=8MHz
__bic_SR_register(SCG0);//使能FLL功能
//必要延時
__delay_cycles(250000);
//清楚錯誤標志位
do
{
UCSCTL7&=~(XT2OFFG+XT1LFOFFG+XT1HFOFFG+DCOFFG);
//清除所有振蕩器錯誤標志位
SFRIFG1&=~OFIFG;//清除振蕩器錯誤
}while(SFRIFG1&OFIFG);//等待清楚完成
}
voiduart_config(void)
{
P3SEL=0x30;//選擇P3.4和P3.5的復用功能
UCA0CTL1|=UCSWRST;//軟件復位
UCA0CTL1 |= UCSSEL_1;