MSP430F5438學(xué)習(xí)筆記 UART SMCLK 115200-8-N-1
MSP430中 UCBR0、UCBR1和UCBRF的設(shè)置值可以通過(guò)計(jì)算,也通過(guò)通過(guò)查表獲得。我個(gè)人傾向于查表法。具體可以參考以下兩張圖表。默認(rèn)情況,ACLK為32768MHZ,而SMCLK為1048576。選擇ACLK時(shí)波特率最大為9600,大于9600的情況只能使用SMCLK,波特率的設(shè)置和SMCLK的時(shí)鐘頻率有關(guān),我個(gè)人更傾向于設(shè)置SMCLK和MCLK為8MHz。
//時(shí)鐘默認(rèn)情況
//FLL時(shí)鐘FLL選擇XT1
//輔助時(shí)鐘ACLK選擇XT132768Hz
//主系統(tǒng)時(shí)鐘MCLK選擇DCOCLKDIV8000000Hz
//子系統(tǒng)時(shí)鐘SMCLK選擇DCOCLKDIV8000000Hz
//UART時(shí)鐘選擇SMCLK
//低頻波特率產(chǎn)生115200-8-N-1
#include
#include
voidclock_config(void);
voidselect_xt1(void);
voiddco_config(void);
voiduart_config(void);
intmain(void)
{
clock_config();//初始化時(shí)鐘
uart_config();
_EINT();
P4DIR|=BIT0;//P4.0輸出
printf("HelloMSP430!rn");
while(1)
{
P4OUT^=BIT0;
__delay_cycles(1000000);
}
}
voidclock_config(void)
{
WDTCTL=WDTPW+WDTHOLD;//停止看門(mén)狗
select_xt1();//選擇XT1
dco_config();//ACLK=XT1=32.768K
//MCLK=SMCLK=8000K
}
voidselect_xt1(void)
{
//啟動(dòng)XT1
P7SEL|=0x03;//P7.0P7.1外設(shè)功能
UCSCTL6&=~(XT1OFF);//XT1打開(kāi)
UCSCTL6|=XCAP_3;//內(nèi)部電容
do
{
UCSCTL7&=~XT1LFOFFG;//清楚XT1錯(cuò)誤標(biāo)記
}while(UCSCTL7&XT1LFOFFG);//檢測(cè)XT1錯(cuò)誤標(biāo)記
}
voiddco_config(void)
{
__bis_SR_register(SCG0);//禁止FLL功能
UCSCTL0=0x0000;//SetlowestpossibleDCOx,MODx
UCSCTL1=DCORSEL_5;//DCO最大頻率為16MHz
UCSCTL2=FLLD_1+243;//設(shè)置DCO頻率為8MHz
//MCLK=SMCLK=Fdcoclkdiv=(N+1)X(Ffllrefclk/n)
//N為唯一需要計(jì)算的值
//FfllrefclkFLL參考時(shí)鐘,默認(rèn)為XT1
//n取默認(rèn)值,此時(shí)為1
//(243+1)*32768=8MHz
__bic_SR_register(SCG0);//使能FLL功能
//必要延時(shí)
__delay_cycles(250000);
//清楚錯(cuò)誤標(biāo)志位
do
{
UCSCTL7&=~(XT2OFFG+XT1LFOFFG+XT1HFOFFG+DCOFFG);
//清除所有振蕩器錯(cuò)誤標(biāo)志位
SFRIFG1&=~OFIFG;//清除振蕩器錯(cuò)誤
}while(SFRIFG1&OFIFG);//等待清楚完成
}
voiduart_config(void)
{
P3SEL=0x30;//選擇P3.4和P3.5的復(fù)用功能
UCA0CTL1|=UCSWRST;//軟件復(fù)位
UCA0CTL1|=UCSSEL_2;//選擇SMCLK時(shí)鐘
UCA0BR0 = 69; //