极海APM32E030 MCU中高速时钟的配置和相关注意事项

潘小七的悠闲生活 2025-11-07 阅读:42204

《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 MCU中高速时钟的配置和相关注意事项

从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()函数进行默认的时钟初始化。

极海APM32E030 MCU中高速时钟的配置和相关注意事项

在SystemInit()函数中会复位时钟相关的寄存器,然后进入SystemClockConfig();进行默认的时钟初始化。

SystemClockConfig()会根据宏定义来进行时钟初始化。

极海APM32E030 MCU中高速时钟的配置和相关注意事项

SDK默认配置的是8M外部无源晶振,配置主频72M。

极海APM32E030 MCU中高速时钟的配置和相关注意事项

如果需要配置更低的主频,可以直接通过选择不同的宏定义来直接切换。

如果使用的外部高速晶振是其他频率,比如4M、12M、16M等,就不能直接修改宏定义来配置主频,还需要做如下修改。

1、将HSE_VALUE改成实际的晶振频率,例如使用12M晶振就修改成:

#define HSE_VALUE ((uint32_t)12000000)

极海APM32E030 MCU中高速时钟的配置和相关注意事项

2、修改PLL倍频系数寄存器PLLMULCFG=4,对应数据手册可以看到是6倍频12M*6=72M

极海APM32E030 MCU中高速时钟的配置和相关注意事项

如果产品应用对时钟精度要求不高,想不接外部晶振,使用内部晶振倍频到64M的操作。

1、屏蔽默认的使用外部晶振的宏定义

极海APM32E030 MCU中高速时钟的配置和相关注意事项

2、编写如下使用内部晶振的时钟初始化函数,在main函数中调用

void SystemClock_HSI_PLL_Init()

{

RCM_Reset();

/* Enable HSI */

RCM_EnableHSI();

/* Wait until HSI is ready */

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);

}

}

极海APM32E030 MCU中高速时钟的配置和相关注意事项

上图就是启动文件不初始化时钟,在main中配置64M主频的测试结果。

注:文章作者在原帖中提供了例程文件,有需要请至原文21ic论坛下载

原文地址:https://bbs.21ic.com/icview-3459364-1-1.html

  • 随机文章
  • 热门文章
  • 热评文章
热门文章
  • 原创粤语音乐剧《大状王》内地火爆上演 业者望助力行业发展,原创粤语音乐剧《大状王》内地火爆上演 业者望助力行业发展

    原创粤语音乐剧《大状王》内地火爆上演 业者望助力行业发展,原创粤语音乐剧《大状王》内地火爆上演 业者望助力行业发展
      中新社北京7月13日电 (记者 应妮)“今晚戏剧之神降临,给了我们一个特别的夜晚”,原创粤语音乐剧《大状王》12日晚在北京天桥艺术中心达成第50场公演,剧中扮演“阿细”的演员郑君炽如是说,语气中充满骄傲和感恩。   《大状王》由香港西九文化区委约创作,西九文化区及香港话剧团联合主办及制作,曾横扫第三十一届香港舞台剧奖,包括最佳制作、原创音乐、导演、男女主角在内十项大奖。此次内地巡演从上海开始,7月11日登台北京将连演11场。 原创粤语音乐剧《大状王》剧照。 (...
  • 一抹青色入夏来 “青·韵”特展亮相成都金沙,一抹青色入夏来 “青·韵”特展亮相成都金沙

    一抹青色入夏来 “青·韵”特展亮相成都金沙,一抹青色入夏来 “青·韵”特展亮相成都金沙
      中新网成都7月16日电 (记者 何浠)随着琵琶、竹笛与埙演奏的雅乐在成都金沙遗址博物馆悠扬响起,四川地区首个以文物为视角解读中国传统色彩美学的大型原创特展“青·韵——文物里的中国传统色彩美学”16日正式开幕。开幕活动现场,讲解员化身天才少年王希孟为观众引路,身着宋制汉服的NPC不时与观众互动。从兰汤洗尘、焚香品茗到手工香牌制作、文化典故聆听,观众可以全方位体验宋代“礼、香、茶、艺”的雅致生活。 参观者在展陈区参观。记者王磊摄   作为国家文物局2025年度“...
  • 贵州省贵阳市市场监督管理局联合多部门开展集市检查 筑牢农村食品安全防线

    贵州省贵阳市市场监督管理局联合多部门开展集市检查 筑牢农村食品安全防线
    中国食品安全网讯(向烨)为深入推进农村假冒伪劣食品整治工作,近日,贵州省贵阳市市场监督管理局联合公安、农业农村、综合执法等部门,对观山湖区窦关临时集市开展专项联合检查,切实守护群众“舌尖上的安全”。 图片来源:贵州省贵阳市市场监督管理局 此次检查以群众日常消费高频品类为重点,聚焦肉类、蔬菜、水果等农产品及散装白酒等产品,详细核查产品来源、质量合格证明、储存条件等关键信息,从严排查假冒伪劣、过期变质等问题。执法过程中,工作人员同步向经营者宣传食品安全法律法规及主体责任要...
  • 乌兰毛都草原上的札萨克图刺绣:指尖上盛开炽热之花,乌兰毛都草原上的札萨克图刺绣:指尖上盛开炽热之花

    乌兰毛都草原上的札萨克图刺绣:指尖上盛开炽热之花,乌兰毛都草原上的札萨克图刺绣:指尖上盛开炽热之花
      中新网兴安盟7月9日电 题:乌兰毛都草原上的札萨克图刺绣:指尖上盛开炽热之花   中新网记者 张玮   夏日的乌兰毛都草原上,象征美满如意的萨日朗花冠高高翘起,仿若熊熊燃烧的烈焰,微风轻拂而过,缕缕花香悠悠飘散。   “附近的草原都不及我家乡草原上的萨日朗开得炽热。”札萨克图刺绣绣娘秀云边摆弄着她手中的刺绣文创产品,边与记者聊着。 图为秀云(右一)为游客介绍札萨克图刺绣文创产品。 白领 摄   近日,记者走进位于内蒙古兴安盟科右前旗乌兰毛都苏木的萨日郎...
  • 正青春正时尚!广东推动粤剧“破圈”拥抱年轻一代,正青春正时尚!广东推动粤剧“破圈”拥抱年轻一代

    正青春正时尚!广东推动粤剧“破圈”拥抱年轻一代,正青春正时尚!广东推动粤剧“破圈”拥抱年轻一代
      中新网广州7月4日电 (程景伟 张跞乐 杨佳)“广东粤剧院秉持着‘粤剧正青春’的理念。”广东粤剧院副院长张晋琼日前结合自身戏剧研究经验,以粤剧《白蛇传·情》《谯国夫人》《红头巾》《最是女儿香》等剧目为例,系统阐释“以青春语态重构经典”的理念。   由广州市教育局主办、广东粤剧院承办的“2025年全市中小学粤剧提升交流活动”日前在广东粤剧艺术中心举办。来自广州市各区的80余名中小学艺术教师齐聚一堂,探讨粤剧艺术与校园教育的融合路径。张晋琼为教师们开展了《粤剧也时尚》主题讲...