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

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

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

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

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

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

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

2、修改PLL倍頻系數寄存器PLLMULCFG=4,對應數據手冊可以看到是6倍頻12M*6=72M

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

2、編寫如下使用內部晶振的時鐘初始化函數,在main函數中調用
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啟動失敗的處理程序*/
}
}
如果要知道系統現在的時鐘配置是多少,可以參考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());
使用串口來打印當前時鐘配置,注意這個打印是基于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主頻的測試結果。
注:文章作者在原帖中提供了例程文件,有需要請至原文21ic論壇下載
原文地址:https://bbs.21ic.com/icview-3459364-1-1.html
-
mcu
+關注
關注
147文章
18669瀏覽量
388954 -
寄存器
+關注
關注
31文章
5590瀏覽量
129248 -
時鐘
+關注
關注
11文章
1955瀏覽量
134615 -
SDK
+關注
關注
3文章
1095瀏覽量
51282
原文標題:APM32芯得 EP.65 | 基于APM32E030解讀APM庫的高速時鐘配置
文章出處:【微信號:geehysemi,微信公眾號:Geehy極海半導體】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
MCU的SWD端口復用為GPIO端口功能的配置方法及注意事項詳細說明
極海半導體新品上市—工業增強型APM32F091xC系列MCU
極海APM32F030系列MCU通過IEC 60730軟件安全認證
RL78族噪聲的相關注意事項及對策應用說明
精準定位 高效驅動丨基于極海APM32E030的磁電式絕對值編碼器參考方案,加速工業智能化轉型

極海APM32E030 MCU中高速時鐘的配置和相關注意事項
評論