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

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

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

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

SystemClockConfig()會根據(jù)宏定義來進行時鐘初始化。

SDK默認配置的是8M外部無源晶振,配置主頻72M。

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

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

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

2、編寫如下使用內(nèi)部晶振的時鐘初始化函數(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);
}
如果想要在程序運行中切換主頻頻率,比如將外部晶振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啟動失敗的處理程序*/
}
}
如果要知道系統(tǒng)現(xiàn)在的時鐘配置是多少,可以參考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());
使用串口來打印當(dāng)前時鐘配置,注意這個打印是基于HSE_VALUE與實際相符的情況才是準確的,需要注意核對。
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);
}
}

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