首先,你要明白STM8的驅(qū)動時鐘可以采用外部晶振,也可采用STM8內(nèi)部的RC振蕩器,二者只能選其一。?三個語句中的HSI表明是采用內(nèi)部RC振蕩器。
成都創(chuàng)新互聯(lián)公司,專注為中小企業(yè)提供官網(wǎng)建設(shè)、營銷型網(wǎng)站制作、響應(yīng)式網(wǎng)站設(shè)計、展示型網(wǎng)站設(shè)計制作、成都網(wǎng)站設(shè)計等服務(wù),幫助中小企業(yè)通過網(wǎng)站體現(xiàn)價值、有效益。幫助企業(yè)快速建站、解決網(wǎng)站建設(shè)與網(wǎng)站營銷推廣問題。
你先看STM8內(nèi)部的時鐘樹結(jié)構(gòu):
其中HSI RC 16MHz就是其內(nèi)部含有的RC振蕩器,是ST芯片在出廠前就經(jīng)過校正的但有一定誤差的振蕩器。時鐘經(jīng)過HSIDIV[1:0]這個分頻器,可以獲得16MHz、8MHz、4MHz、2MHz的輸出tHsiDIV,該輸出經(jīng)過Master Clock Switch(通過配置來選擇外部晶振還是內(nèi)部晶振)后,再分配到CPU時鐘和外圍設(shè)備時鐘。
因此,STM8可以運行的時鐘頻率最大可以達(dá)到16MHz,你也可以讓它低于這個頻率運行(有利于低功耗設(shè)計)。搞清楚了以上幾點,可以知道第一句是配置STM8,讓它知道用內(nèi)部RC振蕩器,不要用外部晶振,這樣省了一個晶振的錢[成本降低了嘛:)],第二句是讓內(nèi)部振蕩器的輸出進(jìn)行8分頻,你也可以讓它1分頻、2分頻、4分頻,但不能3分頻、5分頻,因為它內(nèi)部只設(shè)計了這幾種分頻,況且奇數(shù)分頻很難實現(xiàn),你學(xué)過數(shù)字電路就應(yīng)該知道。然后第三句話你要看一下庫函數(shù)的定義
CLK_Source_TypeDef ??CLK_GetSYSCLKSource(void)
{
return((CLK_Source_TypeDef)CLK-CMSR);
}
意思是返回寄存器CMSR的值,這個你就要參考一下《STM8S中文參考手冊》了,里面搜索CMSR這個詞,我的是在第54頁,
看到了嗎?它是表明時鐘準(zhǔn)備好了沒有的狀態(tài)標(biāo)志,就像你去叫別人辦事,別人要經(jīng)過考慮,這就需要等待,同理,你在STM8S內(nèi)部配置好了時鐘后,內(nèi)部需要產(chǎn)生一定的延遲,而且受各種狀況的影響,比如外部供電電壓變化、引腳干擾等,有可能導(dǎo)致配置時鐘失敗,這就要經(jīng)過查詢這個寄存器的值來看是否配置好時鐘沒有,如果這個寄存器不等于0,則配置成功,否則失敗。第三句的while里的意思就是不斷地取CMSR的值,看是否等于宏定義CLK_SOURCE_HSI(OXE1),如果相等了,則跳過循環(huán),繼續(xù)執(zhí)行以后的語句。
math是C語言庫函數(shù),跟單片機類型關(guān)系不大,只要編譯器支持C語言,就可用這個庫
#define Relay1 GPIO_PIN_2
#define Relay2 GPIO_PIN_3
GPIO_Init(GPIOA,(GPIO_Pin_TypeDef)(Relay1|Relay2),GPIO_MODE_OUT_PP_LOW_SLOW);
用宏定義可方便以后修改
這跟單片機沒關(guān)系,這是C語言的庫函數(shù)
使用時只需將 putc函數(shù)(被printf函數(shù)調(diào)用)換成串囗發(fā)送函數(shù)即可,換了之后優(yōu)先調(diào)用用戶編寫的putc函數(shù)