1.1. ME32F030R8T6的時(shí)鐘樹(shù)
時(shí)鐘是MCU運(yùn)行的基礎(chǔ),時(shí)鐘信號(hào)推動(dòng)單片機(jī)內(nèi)各個(gè)部分執(zhí)行相應(yīng)的指令。時(shí)鐘系統(tǒng)就是CPU的脈搏,決定cpu速率,像人的心跳一樣 只有有了心跳,人才能做其他的事情,而MCU有了時(shí)鐘,才能夠運(yùn)行執(zhí)行指令,才能夠做準(zhǔn)確、穩(wěn)定的進(jìn)行一系列的操作 (例如:串口通信、PWM信號(hào)、ADC采樣等等),因此時(shí)鐘的重要性不言而喻。
ME32F030系列 具有非常靈活的時(shí)鐘控制系統(tǒng)。用戶(hù)可根據(jù)不同應(yīng)用需求來(lái)配置時(shí)鐘,從而取得最高的性能及優(yōu)化的能耗管理。下圖為 ME32F030R8T6 的時(shí)鐘系統(tǒng)概要圖:

從圖中可以看出,MCU的時(shí)鐘源有內(nèi)部高速的IRC_OSC 和 低速的 WDT_OSC 時(shí)鐘可供選擇。
IRC_OSC:它屬于高速時(shí)鐘,可以由內(nèi)部晶體振蕩器控制寄存器(IRCCTRL)配置為 40/48MHz的主頻, 缺省值是40MHz 頻率,由工廠(chǎng)出廠(chǎng)預(yù)設(shè)并由引導(dǎo)程序?qū)懭?。一般作為系統(tǒng)主時(shí)鐘的時(shí)鐘源。
WDT_OSC:它屬于低速時(shí)鐘,由看門(mén)狗振蕩器控制寄存器控制。振蕩器包含模擬和數(shù)字兩部分。振蕩器的模擬部分用于產(chǎn)生模擬時(shí)鐘(Fclkana)。在振蕩器數(shù)字部分,模擬時(shí)鐘(Fclkana)輸出一個(gè)32KHz 頻率時(shí)鐘。然后再被DIVSEL 控制的分頻器分頻輸出到 WDT_CLK,作為看門(mén)狗時(shí)鐘源。
看門(mén)狗振蕩器輸出頻率可用下列公式推算:
WDT_CLK = Fclkana/(4 ×DIVSEL) = 8K Hz ~ 250 Hz (標(biāo)稱(chēng)值)
1.2. ME32F030R8T6時(shí)鐘源的應(yīng)用控制
介紹完系統(tǒng)的時(shí)鐘源,接下來(lái)說(shuō)說(shuō)時(shí)鐘源主要運(yùn)用到了哪些方面。
ME32F030R8T6的外設(shè)非常多,但我們實(shí)際使用的時(shí)候只會(huì)用到有限的幾個(gè)外設(shè),使用任何外設(shè)都需要時(shí)鐘才能啟動(dòng),但并不是所有的外設(shè)都需要系統(tǒng)時(shí)鐘那么高的頻率,為了兼容不同速度的設(shè)備,有些高速,有些低速,如果都用高速時(shí)鐘,勢(shì)必造成浪費(fèi)。并且,同一個(gè)電路,時(shí)鐘越快功耗越快,同時(shí)抗電磁干擾能力也就越弱,所以較為復(fù)雜的MCU都是采用多時(shí)鐘源的方法來(lái)解決這些問(wèn)題。
WDT_CLK:由看門(mén)狗振蕩器控制寄存器來(lái)選擇輸入時(shí)鐘,作為看門(mén)狗的工作時(shí)鐘。

MAIN_CLK:由MAINCLK_SEL選擇輸入時(shí)鐘源,上電默認(rèn)選擇IRC_OSC_CLK作為時(shí)鐘源,也可以通過(guò)置位來(lái)選擇WDT_OSC_CLK。

SYSTEM_CLK:由MAINCLK通過(guò)AHB 接口時(shí)鐘分頻器寄存器(SYSAHBCLKDIV)分頻而來(lái),默認(rèn)不分頻。SYSTEM_CLK時(shí)鐘供內(nèi)核、外設(shè)和存儲(chǔ)器使用。其中外設(shè)通過(guò) AHB 接口時(shí)鐘控制寄存器(SYSAHBCLKCTRL)來(lái)控制外設(shè)的時(shí)鐘使能,上電默認(rèn)外設(shè)的時(shí)鐘都是打開(kāi)的。

UART:UART0/1有自己獨(dú)立的時(shí)鐘分頻器從MAIN_CLK分頻后取得UART時(shí)鐘。

CLK_OUT:MCU的內(nèi)部晶振器(IRC_OSC_CLK)、看門(mén)狗振蕩器(WDT_OSC_CLK),主時(shí)鐘(MAIN_CLK),系統(tǒng)時(shí)鐘(SYSTEM_CLK)都可以通過(guò)CLK_OUT作為輸出時(shí)鐘。
使用前需要通過(guò) CLKOUT 輸出時(shí)鐘源選擇寄存器 (CLKOUTCLKSEL)來(lái)確定想要輸出的時(shí)鐘源,再經(jīng)過(guò) CLKOUT 輸出時(shí)鐘分頻器寄存器 (CLKOUTDIV)分頻后輸出,該寄存器初始值默認(rèn)為0,即不輸出時(shí)鐘。需要輸出的話(huà),設(shè)置好分頻系數(shù)(1-255)便可以輸出了。


2、ME32F030R8T6的時(shí)鐘系統(tǒng)函數(shù)簡(jiǎn)介
為了便于開(kāi)發(fā)者快速上手,敏矽微電子為開(kāi)發(fā)者提供了豐富的庫(kù)函數(shù)和開(kāi)發(fā)例程。
借助于庫(kù)函數(shù),可以不用像普通單片機(jī)那樣去配置繁多的寄存器,從而加快開(kāi)發(fā)進(jìn)程。
借助于例程中,可以更深入理解寄存器配置及功能實(shí)現(xiàn)。
本例中,我們就借助于敏矽微電子提供的例程來(lái)簡(jiǎn)單介紹它的時(shí)鐘系統(tǒng)的跨函數(shù)。在sys.c文件中,包含了切換系統(tǒng)時(shí)鐘,配置時(shí)鐘主頻等函數(shù),供開(kāi)發(fā)者直接使用。
1.3. 主頻配置函數(shù)
①、配置IRC_CLK為40M主頻
voidSYS_IRCTrimto40M(void){volatileuint32_ti=0xFFFF;if(DIA->IRCTRIM!=0xFFFFFFFF)
{
SYSCON->IRCCTRL=DIA->IRCTRIM;while(i--==0);
FMC->FLASH_RDCYC=1;
SYSCON->SYSAHBCLKDIV=1;
SystemCoreClockUpdate();
}return;
}
②、配置IRC_CLK為48M主頻
voidSYS_IRCTrimto48M(void){volatileuint32_ti=0xFFFF;if(DIA->IRCTRIM48!=0xFFFFFFFF)
{
SYSCON->IRCCTRL=DIA->IRCTRIM48;while(i--==0);
FMC->FLASH_RDCYC=1;
SYSCON->SYSAHBCLKDIV=1;//coreclockto48M
SystemCoreClockUpdate();
}
return;
}
1.4. 時(shí)鐘源選擇函數(shù)
③、選擇MAIN_CLK的時(shí)鐘源,可以選擇IRC_CLK 或者 WATCHDOG_CLK。
voidSYS_SelectMainClkSrc(uint8_tsrc) { //switchmainclksource SYSCON->MAINCLKUEN_b.ENA=1;//disablemainclkupdate //switchmainclksourcetoSpecifyedsource if(src==IRC_CLK) SYSCON->MAINCLKSEL_b.SEL=0;elseif(src==WATCHDOG_CLK) SYSCON->MAINCLKSEL_b.SEL=2; SYSCON->MAINCLKUEN_b.ENA=0;//enablemainclkupdate SystemCoreClockUpdate(); return; }
④、設(shè)置AHB 接口時(shí)鐘分頻器的分頻系數(shù),在這里請(qǐng)注意,函數(shù)如果檢查到當(dāng)前時(shí)鐘為IR_CLK且分頻系數(shù)小于2,這樣系統(tǒng)時(shí)鐘SYSTEM_CLK的主頻肯定大于30M, 而FLASH的擦寫(xiě)速度最高支持到30MHz。此時(shí)CPU時(shí)鐘超過(guò)Flash的最大讀取速度,這就需要插入延遲時(shí)鐘,延遲時(shí)鐘由 RDCYC 寄存器控制。
voidSYS_SetAHBClkDivider(uint8_tdiv)
{
//setupflashaccessspeedifSystemCoreClockisgoingtomorethan30MHz
if((SYSCON->MAINCLKSEL_b.SEL==0) (div<2))??
?FMC->FLASH_RDCYC=1;
SYSCON->SYSAHBCLKDIV_b.DIV=div;//setupahbclockdivider
SystemCoreClockUpdate();//updateMainClockandSystemCoreClock
return;
}
//⑤、設(shè)置WDT_CLK的時(shí)鐘源,可以選擇IRC_CLK 或者 WATCHDOG_CLK。
voidSYS_SelectWDTClkSrc(uint8_tsrc){if(src==IRC_CLK)
SYSCON->WDTOSCCTRL_b.WDTCLKSRC=0;
elseif(src==WATCHDOG_CLK)
SYSCON->WDTOSCCTRL_b.WDTCLKSRC=1;
return;
}
//⑥、設(shè)置CLK_OUT的時(shí)鐘源,可以選擇IRC_CLK 、SYS_CLK、 WATCHDOG_CLK、MAIN_CLK中的一個(gè)。
voidSYS_SelectClkOutSrc(uint8_tsrc)
{switch(src)
{
caseIRC_CLK:
src=0;break;caseSYS_CLK:
src=1;break;caseWATCHDOG_CLK:
src=2;break;caseMAIN_CLK:
src=3;break;
default:return;
}
//switchclock
SYSCON->CLKOUTUEN_b.ENA=1;
SYSCON->CLKOUTCLKSEL_b.SEL=src;//selectclkoutsource
SYSCON->CLKOUTUEN_b.ENA=0;
return;
}
//⑦、設(shè)置CLK_OUT時(shí)鐘的輸出分頻系數(shù)。
voidSYS_SetClkOutDivider(uint8_tdiv)
{
SYSCON->CLKOUTDIV_b.DIV=div;
return;}
3、ME32F030R8T6時(shí)鐘系統(tǒng)例程
上面介紹了sys.c中關(guān)于系統(tǒng)時(shí)鐘的部分函數(shù),下面我們來(lái)編寫(xiě)一個(gè)關(guān)于時(shí)鐘配置的例程。使大家能夠?qū)r(shí)鐘配置有一個(gè)簡(jiǎn)單的了解。
本例實(shí)現(xiàn)的功能是:將AHB 接口時(shí)鐘進(jìn)行2分頻,IRC時(shí)鐘切換到48M主頻,最后將系統(tǒng)時(shí)鐘進(jìn)行分頻輸出。
intmain(void)
{
SYS_SetAHBClkDivider(2);//AHB接口時(shí)鐘進(jìn)行2分頻
SYS_IRCTrimto48M();//IRC時(shí)鐘切換到48M主頻
SYS_SelectClkOutSrc(SYS_CLK);//選擇SYS_CLK作為OUT_CLK輸出時(shí)鐘
SYS_SetClkOutDivider(10);//對(duì)OUT_CLK時(shí)鐘進(jìn)行10分頻
SYS_EnableClkOut();//使能OUT_CLK輸出端口
}
來(lái)源:敏矽MCU
-
mcu
+關(guān)注
關(guān)注
147文章
18925瀏覽量
398150 -
adc
+關(guān)注
關(guān)注
100文章
7511瀏覽量
555967 -
Cortex-M0
+關(guān)注
關(guān)注
4文章
127瀏覽量
40564 -
時(shí)鐘樹(shù)
+關(guān)注
關(guān)注
0文章
58瀏覽量
11256 -
時(shí)鐘系統(tǒng)
+關(guān)注
關(guān)注
1文章
128瀏覽量
12930
發(fā)布評(píng)論請(qǐng)先 登錄
TinyM0配套教程 LPC1100系列Cortex-M0最
TinyM0配套教程LPC1100系列Cortex-M0最小系統(tǒng)設(shè)計(jì)
MCU學(xué)習(xí)筆記_ARM Cortex M0_簡(jiǎn)介
基于ARM Cortex-M0核的MCU設(shè)計(jì)及應(yīng)用
敏矽微電子Cortex-M0學(xué)習(xí)筆記04——GPIO詳解及應(yīng)用實(shí)例
敏矽微電子Cortex-M0學(xué)習(xí)筆記02——Cortex-M0開(kāi)發(fā)環(huán)境的建立及調(diào)試
敏矽微電子Cortex-M0學(xué)習(xí)筆記03——時(shí)鐘系統(tǒng)設(shè)計(jì)例程
評(píng)論