0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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

Geehy极海半导体 来源:21ic论坛极海半导体专区 作者:21ic论坛极海半导体 2025-11-04 09:19 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

《APM32芯得》系列内容为用户使用APM32系列产品的经验总结,均转载自21ic论坛极海半导体专区,全文未作任何修改,未经原文作者授权禁止转载。

每一家MCU厂家的SDK写法和寄存器功能都有所不同,如果不熟悉的话就会配置错误,导致MCU运行不稳定。接下来就以APM32E030的手册和SDK,解读下高速时钟的配置和相关注意事项。

实现了解MCU的高速时钟要先看下用户手册。

高速时钟源分内部时钟源和外部时钟源:

内部时钟源

内部时钟包含 HSICLK(高速内部时钟信号)和 LSICLK(低速内部时钟信号)。HSICLK 时钟信号由内部 8MHz 的 RC 振荡器产生。不同芯片的 RC 振荡器频率不同,且同一颗芯片随着温度、电压的变化也会存在差异;每个芯片的 HSICLK 时钟频率在出厂前已经被厂家校准到 1%(25℃、VDD=VDDA=3.3V)

外部时钟源

外部时钟信号包括 HSECLK(高速外部时钟信号)和 LSECLK(低速外部时钟信号)。

外部的时钟源有两种:

外部晶体/陶瓷谐振器(常规的无源晶振)

用户外部时钟(有源晶振或者是其他芯片提供的时钟)

b495665a-b791-11f0-8c8f-92fbcf53809c.png

从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的等待周期与预取使能与时钟相关需要注意。

b4eddfa6-b791-11f0-8c8f-92fbcf53809c.png

理论部分主要就这些,更详细的建议查看用户手册,接下来是代码的相关部分。芯片上电实现会运行到启动文件,初始化完中断向量表后会进入到SystemInit()函数进行默认的时钟初始化。

b54b47fe-b791-11f0-8c8f-92fbcf53809c.png

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

b54b47fe-b791-11f0-8c8f-92fbcf53809c.png

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

b5ffeee8-b791-11f0-8c8f-92fbcf53809c.png

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

b65d089e-b791-11f0-8c8f-92fbcf53809c.png

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

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

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

#define HSE_VALUE ((uint32_t)12000000)

b6b5919e-b791-11f0-8c8f-92fbcf53809c.png

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

b717c1fc-b791-11f0-8c8f-92fbcf53809c.png

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

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

b77507b8-b791-11f0-8c8f-92fbcf53809c.png

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

}

}

b7d2bf8e-b791-11f0-8c8f-92fbcf53809c.png

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

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

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

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • mcu
    mcu
    +关注

    关注

    147

    文章

    19126

    浏览量

    403709
  • 寄存器
    +关注

    关注

    31

    文章

    5619

    浏览量

    130408
  • 时钟
    +关注

    关注

    11

    文章

    1999

    浏览量

    135228
  • SDK
    SDK
    +关注

    关注

    3

    文章

    1111

    浏览量

    52011

原文标题:APM32芯得 EP.65 | 基于APM32E030解读APM库的高速时钟配置

文章出处:【微信号:geehysemi,微信公众号:Geehy极海半导体】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    CW32F030在使用中的注意事项有哪些?

    CW32F030在使用中的注意事项有哪些?
    发表于 11-18 06:20

    请问CW32F030的硬件注意事项有哪些?

    CW32F030的硬件注意事项有哪些
    发表于 12-25 08:20

    LPC1200系列ARM高频时钟配置注意事项手册下载

    LPC1200系列ARM高频时钟配置注意事项手册下载
    发表于 03-30 14:46 6次下载

    设计高速电路板的注意事项

    设计高速电路板的注意事项
    发表于 01-28 21:32 0次下载

    MCU的SWD端口复用为GPIO端口功能的配置方法及注意事项详细说明

    本篇应用笔记主要介绍华大半导体 MCU*的 SWD 端口复用为 GPIO 端口功能的配置方法及注意事项
    发表于 11-12 08:00 20次下载
    <b class='flag-5'>MCU</b>的SWD端口复用为GPIO端口功能的<b class='flag-5'>配置</b>方法及<b class='flag-5'>注意事项</b>详细说明

    半导体新品上市—工业增强型APM32F091xC系列MCU

    半导体工业增强型APM32F091xC系列新品MCU,其在APM32F030xC的产品性能上实现增强优化,为用户提供丰富的通信方式。
    发表于 07-26 14:27 7457次阅读
    <b class='flag-5'>极</b><b class='flag-5'>海</b>半导体新品上市—工业增强型<b class='flag-5'>APM</b>32F091xC系列<b class='flag-5'>MCU</b>

    APM32F030系列MCU通过IEC 60730软件安全认证

    随着物联网的飞速发展,越来越多智能家电走进我们的生活,针对家电产品日益增长的安全功能需求,近日APM32F030系列MCU顺利通过IEC 60730软件安全认证,并可提供符合IEC
    的头像 发表于 05-25 11:50 2897次阅读

    APM32F030X8_配置差异_APM32库在main前时钟配置出现异常

    APM32F030X8_配置差异_APM32库在main前时钟配置出现异常
    发表于 11-09 21:03 0次下载
    <b class='flag-5'>APM32F030</b>X8_<b class='flag-5'>配置</b>差异_<b class='flag-5'>APM</b>32库在main前<b class='flag-5'>时钟</b><b class='flag-5'>配置</b>出现异常

    APM32F030C8T6_Flash_Flash读写设计注意事项

    APM32F030C8T6_Flash_Flash读写设计注意事项
    发表于 11-09 21:03 3次下载
    <b class='flag-5'>APM32F030</b>C8T6_Flash_Flash读写设计<b class='flag-5'>注意事项</b>

    RL78族噪声的相关注意事项及对策应用说明

    噪声的相关注意事项 1.1 缩短布线长度 1.1.1 引脚的布线 1.1.2 时钟输入/输出引脚的布线 1.2 在V SS -V DD 之间连接旁路电容器 1.3 模拟输入引脚的布线处理 1.4
    的头像 发表于 02-09 21:25 1451次阅读

    HK32MCU应用笔记(十七)| HK32F103xC/D/E-flash擦写应用及注意事项

    HK32MCU应用笔记(十七)| HK32F103xC/D/E-flash擦写应用及注意事项
    的头像 发表于 09-18 10:58 2478次阅读
    HK32<b class='flag-5'>MCU</b>应用笔记(十七)| HK32F103xC/D/<b class='flag-5'>E</b>-flash擦写应用及<b class='flag-5'>注意事项</b>

    HK32MCU应用笔记(十四)| HK32F103x/C/D/E-TIM1的应用及注意事项

    HK32MCU应用笔记(十四)| HK32F103x/C/D/E-TIM1的应用及注意事项
    的头像 发表于 09-18 10:58 2012次阅读
    HK32<b class='flag-5'>MCU</b>应用笔记(十四)| HK32F103x/C/D/<b class='flag-5'>E</b>-TIM1的应用及<b class='flag-5'>注意事项</b>

    HK32MCU应用笔记(十三)| HK32F103xC/D/E-ADC的应用及注意事项

    HK32MCU应用笔记(十三)| HK32F103xC/D/E-ADC的应用及注意事项
    的头像 发表于 09-18 10:58 2391次阅读
    HK32<b class='flag-5'>MCU</b>应用笔记(十三)| HK32F103xC/D/<b class='flag-5'>E</b>-ADC的应用及<b class='flag-5'>注意事项</b>

    精准定位 高效驱动丨基于APM32E030的磁电式绝对值编码器参考方案,加速工业智能化转型

    攀升,将加速工业编码器国产化、智能化、高精度化发展。 编码器凭借卓越性能和广阔应用前景,已成为行业发展的核心驱动力之一。紧跟行业发展趋势,推出的APM32E030磁电式绝对值编码器参考方案,在保障高精度测量性能的同时
    发表于 05-13 13:46 1133次阅读
    精准定位 高效驱动丨基于<b class='flag-5'>极</b><b class='flag-5'>海</b><b class='flag-5'>APM32E030</b>的磁电式绝对值编码器参考方案,加速工业智能化转型

    APM32E030/F402系列MCU通过IEC 60730/60335功能安全认证

    近日,APM32E030系列基础拓展型MCUAPM32F402系列高性能高性价比MCU通过
    的头像 发表于 08-29 13:57 1357次阅读
    <b class='flag-5'>极</b><b class='flag-5'>海</b><b class='flag-5'>APM32E030</b>/F402系列<b class='flag-5'>MCU</b>通过IEC 60730/60335功能安全认证