《APM32芯得》系列內(nèi)容為用戶使用APM32系列產(chǎn)品的經(jīng)驗(yàn)總結(jié),均轉(zhuǎn)載自21ic論壇極海半導(dǎo)體專區(qū),全文未作任何修改,未經(jīng)原文作者授權(quán)禁止轉(zhuǎn)載。
每一家MCU廠家的SDK寫(xiě)法和寄存器功能都有所不同,如果不熟悉的話就會(huì)配置錯(cuò)誤,導(dǎo)致MCU運(yùn)行不穩(wěn)定。接下來(lái)就以APM32E030的手冊(cè)和SDK,解讀下高速時(shí)鐘的配置和相關(guān)注意事項(xiàng)。
實(shí)現(xiàn)了解MCU的高速時(shí)鐘要先看下用戶手冊(cè)。
高速時(shí)鐘源分內(nèi)部時(shí)鐘源和外部時(shí)鐘源:
內(nèi)部時(shí)鐘源
內(nèi)部時(shí)鐘包含 HSICLK(高速內(nèi)部時(shí)鐘信號(hào))和 LSICLK(低速內(nèi)部時(shí)鐘信號(hào))。HSICLK 時(shí)鐘信號(hào)由內(nèi)部 8MHz 的 RC 振蕩器產(chǎn)生。不同芯片的 RC 振蕩器頻率不同,且同一顆芯片隨著溫度、電壓的變化也會(huì)存在差異;每個(gè)芯片的 HSICLK 時(shí)鐘頻率在出廠前已經(jīng)被廠家校準(zhǔn)到 1%(25℃、VDD=VDDA=3.3V)
外部時(shí)鐘源
外部時(shí)鐘信號(hào)包括 HSECLK(高速外部時(shí)鐘信號(hào))和 LSECLK(低速外部時(shí)鐘信號(hào))。
外部的時(shí)鐘源有兩種:
外部晶體/陶瓷諧振器(常規(guī)的無(wú)源晶振)
用戶外部時(shí)鐘(有源晶振或者是其他芯片提供的時(shí)鐘)

從APM32E030的用戶手冊(cè)可以看出,E030的最大主頻也就是SYSCLK最大是72Mhz。系統(tǒng)時(shí)鐘源可以從HSECLK(外部時(shí)鐘的時(shí)鐘),PLLCLK(PLL的時(shí)鐘)、HSICLK(內(nèi)部8M時(shí)鐘)這三個(gè)中來(lái)選擇。
HSECLK的輸入時(shí)鐘范圍是4~32Mhz,可通過(guò)PLL的分頻器和倍頻器配置成PLL最大72M主頻。HSICLK的時(shí)鐘頻率是8M,并且需要固定2分頻到PLL的倍頻器,最大16倍頻,所以最大主頻只能配到64Mhz.
系統(tǒng)時(shí)鐘會(huì)再經(jīng)過(guò)AHBPSC和APBPSC分頻配置后到各外設(shè)。其中TMR的時(shí)鐘需要注意,所有 TMRxCLK(定時(shí)器時(shí)鐘)頻率分配由硬件按以下 2 種情況自動(dòng)設(shè)置:
如果相應(yīng)的 APB 預(yù)分頻系數(shù)是 1,定時(shí)器的時(shí)鐘頻率與所在 APB 總線頻率一致。
否則,定時(shí)器的時(shí)鐘頻率被設(shè)為與其相連的 APB 總線頻率的 2 倍
具體的寄存器在用戶手冊(cè)中,主要是時(shí)鐘控制寄存器 1(RCM_CTRL1)和時(shí)鐘配置寄存器 1(RCM_CFG1),具體功能可以查看用戶手冊(cè)。
除了RCM相關(guān)的寄存器,還有Flash的等待周期與預(yù)取使能與時(shí)鐘相關(guān)需要注意。

理論部分主要就這些,更詳細(xì)的建議查看用戶手冊(cè),接下來(lái)是代碼的相關(guān)部分。芯片上電實(shí)現(xiàn)會(huì)運(yùn)行到啟動(dòng)文件,初始化完中斷向量表后會(huì)進(jìn)入到SystemInit()函數(shù)進(jìn)行默認(rèn)的時(shí)鐘初始化。

在SystemInit()函數(shù)中會(huì)復(fù)位時(shí)鐘相關(guān)的寄存器,然后進(jìn)入SystemClockConfig();進(jìn)行默認(rèn)的時(shí)鐘初始化。

SystemClockConfig()會(huì)根據(jù)宏定義來(lái)進(jìn)行時(shí)鐘初始化。

SDK默認(rèn)配置的是8M外部無(wú)源晶振,配置主頻72M。

如果需要配置更低的主頻,可以直接通過(guò)選擇不同的宏定義來(lái)直接切換。
如果使用的外部高速晶振是其他頻率,比如4M、12M、16M等,就不能直接修改宏定義來(lái)配置主頻,還需要做如下修改。
1、將HSE_VALUE改成實(shí)際的晶振頻率,例如使用12M晶振就修改成:
#define HSE_VALUE ((uint32_t)12000000)

2、修改PLL倍頻系數(shù)寄存器PLLMULCFG=4,對(duì)應(yīng)數(shù)據(jù)手冊(cè)可以看到是6倍頻12M*6=72M

如果產(chǎn)品應(yīng)用對(duì)時(shí)鐘精度要求不高,想不接外部晶振,使用內(nèi)部晶振倍頻到64M的操作。
1、屏蔽默認(rèn)的使用外部晶振的宏定義

2、編寫(xiě)如下使用內(nèi)部晶振的時(shí)鐘初始化函數(shù),在main函數(shù)中調(diào)用
void SystemClock_HSI_PLL_Init()
{
RCM_Reset();
/* Enable HSI */
RCM_EnableHSI();
while (RCM->CTRL1_B.HSIRDY** == RESET);
FMC_EnablePrefetchBuffer();
FMC_SetWS2();
RCM_ConfigAHB(RCM_SYSCLK_DIV_1);
RCM_ConfigAPB(RCM_HCLK_DIV_1);
/* SYSCLKFreq = (HSI * 16) / 2 */
RCM_ConfigPLL(RCM_PLL_SEL_HSI_DIV2, RCM_PLLMF_16);
/* Enable PLL */
RCM_EnablePLL();
while (RCM->CTRL1_B.PLLRDY** == BIT_RESET);
/* Selct PLL as Sysclk */
RCM_ConfigSYSCLK(RCM_SYSCLK_SEL_PLL);
while (RCM->CFG1_B.SCLKSWSTS != 0x02);
}
如果想要在程序運(yùn)行中切換主頻頻率,比如將外部晶振72M的配置切換到36M
void SystemClock_HSE_PLL_Init()
{
uint32_t i;
/* Select HSI as System Clock at first */
RCM_ConfigSYSCLK(RCM_SYSCLK_SEL_HSI);
/* Disable PLL */
RCM_DisablePLL();
/* Wait until Pll is ready */
while (RCM->CTRL1_B.PLLRDY** == SET);
RCM_ConfigHSE(RCM_HSE_OPEN);
for (i = 0; i < HSE_STARTUP_TIMEOUT; i++)
{
if (RCM->CTRL1_B.HSERDY**)
{
break;
}
}
if (RCM->CTRL1_B.HSERDY**)
{
FMC_EnablePrefetchBuffer();
FMC_SetWS2();
RCM_ConfigAHB(RCM_SYSCLK_DIV_1);
RCM_ConfigAPB(RCM_HCLK_DIV_1);
/* Config PLL source and multiplication factor
SYSCLKFreq = (HSE * 6) / 4 */
RCM_ConfigPLL(RCM_PLL_SEL_HSE, RCM_PLLMF_9);
RCM_ConfigCLKDIV(RCM_CLK_DIV_2);
/* Enable PLL */
RCM_EnablePLL();
while (RCM->CTRL1_B.PLLRDY** == BIT_RESET);
/* Selct PLL as Sysclk */
RCM_ConfigSYSCLK(RCM_SYSCLK_SEL_PLL);
while (RCM->CFG1_B.SCLKSWSTS != 0x02);
}
else
{
/*可增加HSE啟動(dòng)失敗的處理程序*/
}
}
如果要知道系統(tǒng)現(xiàn)在的時(shí)鐘配置是多少,可以參考SDK中的RCB-->RCM_ClockSwitch 例程
/* Initiatate the usart */
APM_TINY_COMInit(COM1);
printf("sysSource = %s ", RCM_SYSCLK_SEL_TAB[RCM_ReadSYSCLKSource()]);
printf("sysClock = %" PRId32 " ", RCM_ReadSYSCLKFreq());
使用串口來(lái)打印當(dāng)前時(shí)鐘配置,注意這個(gè)打印是基于HSE_VALUE與實(shí)際相符的情況才是準(zhǔn)確的,需要注意核對(duì)。
int main(void)
{
APM_TINY_LEDInit(LED2);
APM_TINY_LEDInit(LED3);
APM_TINY_PBInit(BUTTON_KEY1, BUTTON_MODE_EINT);
APM_TINY_PBInit(BUTTON_KEY2, BUTTON_MODE_EINT);
APM_TINY_COMInit(COM1);
ClockOutputInit();
printf("sysSource = %s ", RCM_SYSCLK_SEL_TAB[RCM_ReadSYSCLKSource()]);
printf("sysClock = %" PRId32 " ", RCM_ReadSYSCLKFreq());
SystemClock_HSE_PLL_Init();
for (;;)
{
Delay();
APM_TINY_LEDToggle(LED2);
}
}

上圖就是啟動(dòng)文件不初始化時(shí)鐘,在main中配置64M主頻的測(cè)試結(jié)果。
注:文章作者在原帖中提供了例程文件,有需要請(qǐng)至原文21ic論壇下載
原文地址:https://bbs.21ic.com/icview-3459364-1-1.html
-
mcu
+關(guān)注
關(guān)注
147文章
18669瀏覽量
388883 -
寄存器
+關(guān)注
關(guān)注
31文章
5590瀏覽量
129248 -
時(shí)鐘
+關(guān)注
關(guān)注
11文章
1955瀏覽量
134615 -
SDK
+關(guān)注
關(guān)注
3文章
1095瀏覽量
51273
原文標(biāo)題:APM32芯得 EP.65 | 基于APM32E030解讀APM庫(kù)的高速時(shí)鐘配置
文章出處:【微信號(hào):geehysemi,微信公眾號(hào):Geehy極海半導(dǎo)體】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
LPC1200系列ARM高頻時(shí)鐘配置注意事項(xiàng)手冊(cè)下載
MCU的SWD端口復(fù)用為GPIO端口功能的配置方法及注意事項(xiàng)詳細(xì)說(shuō)明
極海半導(dǎo)體新品上市—工業(yè)增強(qiáng)型APM32F091xC系列MCU
極海APM32F030系列MCU通過(guò)IEC 60730軟件安全認(rèn)證
APM32F030X8_配置差異_APM32庫(kù)在main前時(shí)鐘配置出現(xiàn)異常
APM32F030C8T6_Flash_Flash讀寫(xiě)設(shè)計(jì)注意事項(xiàng)
RL78族噪聲的相關(guān)注意事項(xiàng)及對(duì)策應(yīng)用說(shuō)明
HK32MCU應(yīng)用筆記(十七)| HK32F103xC/D/E-flash擦寫(xiě)應(yīng)用及注意事項(xiàng)
HK32MCU應(yīng)用筆記(十四)| HK32F103x/C/D/E-TIM1的應(yīng)用及注意事項(xiàng)
HK32MCU應(yīng)用筆記(十三)| HK32F103xC/D/E-ADC的應(yīng)用及注意事項(xiàng)
HK32MCU應(yīng)用筆記(十一)| HK32F103xC/D/E的flash讀保護(hù)應(yīng)用及注意事項(xiàng)
精準(zhǔn)定位 高效驅(qū)動(dòng)丨基于極海APM32E030的磁電式絕對(duì)值編碼器參考方案,加速工業(yè)智能化轉(zhuǎn)型
極海APM32E030/F402系列MCU通過(guò)IEC 60730/60335功能安全認(rèn)證

極海APM32E030 MCU中高速時(shí)鐘的配置和相關(guān)注意事項(xiàng)
評(píng)論