目录

时钟控制单元(CCTL)

GD32F405时钟配置代码解析


时钟控制单元(CCTL)

时钟控制单元提供了一系列频率的时钟功能,包括一个内部16M RC振荡器时钟(IRC16M)、一
个内部48M RC 振荡器时钟(IRC48M)、一个外部高速晶体振荡器时钟(HXTAL)、一个内部32K
RC振荡器时钟(IRC32K)、一个外部低速晶体振荡器时钟(LXTAL)、三个锁相环(PLL)、一个
HXTAL时钟监视器、时钟预分频器、时钟多路复用器和时钟门控电路。这几个时钟源的具体用途是什么呢?看下图的时钟树配置。

1. 32K RC震荡时钟(IRC32K):

IRC32K内部RC振荡器时钟担当一个低功耗时钟源的角色,它的时钟频率大约32 kHz,为独立
看门狗和实时时钟电路提供时钟。

2. 内部 16M RC 振荡器时钟(IRC16M)

内部16MHz RC振荡器时钟,简称IRC16M时钟,拥有16MHz的固定频率,设备上电后CPU默
认选择其做为系统时钟源。 IRC16M RC振荡器能够在不需要任何外部器件的条件下为用户提
供更低成本类型的时钟源。

3. 内部 48M RC 振荡器时钟(IRC48M)
内 部 48MHz RC 振 荡 器 时 钟 , 简 称 IRC48M 时 钟 , 拥 有 48MHz 的 固 定 频 率 , 当 使 用
USBFS/USBHS/TRNG/SDIO模块时, IRC48M振荡器在不需要任何外部器件的条件下为用户
提供了一种成本更低的时钟源选择。

4. 外部低速晶体振荡器时钟(LXTAL)

LXTAL是一个频率为32.768kHz的外部低速晶体或陶瓷谐振器。它为实时时钟电路提供一个低
功耗且高精准的时钟源。

5. 外部高速晶体振荡器时钟(HXTAL)

4到32MHz的外部高速晶体振荡器可为系统时钟提供更为精确时钟源。带有特定频率的晶体必
须靠近两个HXTAL的引脚连接。和晶体连接的外部电阻和电容必须根据所选择的振荡器来调整。

6. 锁相环(PLL)
存在三个内部锁相环, PLL、 PLLI2S和PLLSAI。 PLLP时钟可做为系统时钟(不超过
200MHz) ,PLLQ时钟可以做为USBFS/USBHS/TRNG/SDIO模块的时钟源。 PLLI2S时钟可以
做为I2S模块的时钟源。 PLLSAI可以做为CK48M或TLI模块的时钟源。

总结一下,这几个时钟源有不同的用途:

1. 内部或外部32K时钟主要用于RTC和看门狗的时钟。

2. 内部48M时钟主要用于USBFS/USBHS/TRNG/SDIO的时钟。

3. 内部16M时钟上电后作为系统默认时钟源,若没有使用外部时钟,则可以使用此时钟。

4. 外部时钟HXTAL提供根据接入的晶振提供4到32MHz的时钟信号。

由时钟树可知,AHB、 APB和Cortex®-M4时钟都源自系统时钟(CK_SYS),系统时钟的时钟源可以选择IRC16M、HXTAL或PLL。系统时钟的最大运行时钟频率可以达到200MHz。

另外,时钟树中还可以看到AHB、APB1和APB2总线的时钟需要配置。AHB和APB到底是什么?

AHB(Advanced High Performance Bus):高级性能总线,AHB用于高性能、高时钟频率的系统结构,典型的应用如ARM核与系统内部的高速RAM、NAND FLASH、DMA、Bridge的连接。

APB (Advanced Peripheral Bus):高级外设总线,APB用于连接外部设备,对性能要求不高,而考虑低功耗问题。

从时钟树可以看到,CK_AHB由CK_SYS时钟分频而来,最大频率可以等于CK_SYS。

CK_AHB出来后,给到

1. HCLK AHB总线的时钟信号

2. CK_CST SysTick系统滴答定时器的时钟(分频8)

3. 分频后给到CK_APB1,也就是PCLK1

4. 分频后给到CK_APB2,也就是PCLK2

5. 分频后给到ADC

GD32F405时钟配置代码解析

GD32F405在启动过程的时钟配置在SystemIni函数(system_gd32f4xx.c),SystemInit函数会对MCU的复位和时钟单元RCU进行配置,复位后调用system_clock_config()。可以看到根据定义的宏选择不同的时钟配置函数,一下是官方预定义的一些配置。主要是时钟源和频率的组合。因此,如果想在MCU启动过程中完成系统时钟的配置,只需要修改相关宏定义即可。

static void system_clock_config(void)
{
#ifdef __SYSTEM_CLOCK_IRC16Msystem_clock_16m_irc16m();
#elif defined (__SYSTEM_CLOCK_HXTAL)system_clock_hxtal();
#elif defined (__SYSTEM_CLOCK_120M_PLL_IRC16M)system_clock_120m_irc16m();
#elif defined (__SYSTEM_CLOCK_120M_PLL_8M_HXTAL)system_clock_120m_8m_hxtal();
#elif defined (__SYSTEM_CLOCK_120M_PLL_25M_HXTAL)system_clock_120m_25m_hxtal();
#elif defined (__SYSTEM_CLOCK_168M_PLL_IRC16M)system_clock_168m_irc16m();
#elif defined (__SYSTEM_CLOCK_168M_PLL_8M_HXTAL)system_clock_168m_8m_hxtal();
#elif defined (__SYSTEM_CLOCK_168M_PLL_25M_HXTAL)system_clock_168m_25m_hxtal();
#elif defined (__SYSTEM_CLOCK_200M_PLL_IRC16M)system_clock_200m_irc16m();
#elif defined (__SYSTEM_CLOCK_200M_PLL_8M_HXTAL)system_clock_200m_8m_hxtal();
#elif defined (__SYSTEM_CLOCK_200M_PLL_25M_HXTAL)system_clock_200m_25m_hxtal();
#endif /* __SYSTEM_CLOCK_IRC16M */
}
/* select a system clock by uncommenting the following line */
//#define __SYSTEM_CLOCK_IRC16M                   (uint32_t)(__IRC16M)
//#define __SYSTEM_CLOCK_HXTAL                    (uint32_t)(__HXTAL)
//#define __SYSTEM_CLOCK_120M_PLL_IRC16M          (uint32_t)(120000000)
//#define __SYSTEM_CLOCK_120M_PLL_8M_HXTAL          (uint32_t)(120000000)
//#define __SYSTEM_CLOCK_120M_PLL_25M_HXTAL       (uint32_t)(120000000)
//#define __SYSTEM_CLOCK_168M_PLL_IRC16M          (uint32_t)(168000000)
//#define __SYSTEM_CLOCK_168M_PLL_8M_HXTAL        (uint32_t)(168000000)
//#define __SYSTEM_CLOCK_168M_PLL_25M_HXTAL       (uint32_t)(168000000)
// #define __SYSTEM_CLOCK_200M_PLL_IRC16M          (uint32_t)(200000000)
//#define __SYSTEM_CLOCK_200M_PLL_8M_HXTAL        (uint32_t)(200000000)
#define __SYSTEM_CLOCK_200M_PLL_25M_HXTAL         (uint32_t)(200000000)

除此之外还需要注意,当使用外部高速晶体振荡器HXTAL作为系统时钟源时,还需要根据使用的HXTAL的具体时钟频率来修改宏定义HXTAL_VALUE的值,该值会影响SystemCoreClock、AHB、APB1、APB2等时钟的计算,最终会影响部分外设的使用,如USART、I2C等。

GD32 时钟配置解析(以GD32F405为例)相关推荐

  1. GD32F405时钟配置

    GD32F405时钟配置 1.时钟控制单元(CCTL) 2.时钟配置 2.1库函数自带时钟配置函数 2.2 用户自编写时钟配置函数 1.时钟控制单元(CCTL)   时钟控制单元提供了一系列频率的时钟 ...

  2. STM32的时钟配置——时钟树解析

    此文章由于讲得较详细因此篇幅较长,请带着一点耐心去读,相信会有收获! 目录 STM32为什么要有复杂的时钟系统 详解STM32时钟系统 STM32有几个时钟源 关于时钟输出 软件配置时钟 STM32为 ...

  3. STM32F103 时钟树以及系统时钟配置

    1.时钟树 STM32的时钟树大致可分为3部分: 陶瓷晶振输入,进入预分频器 预分频器输出信号给到PLL倍频器 最终AHB桥总线速度,以及各总线的速度 晶振信号输入到芯片后有两条支路可以走,第一条是直 ...

  4. python3.6爬虫环境安装要多少内存_Python3爬虫环境配置——解析库安装(附tesserocr安装方法)...

    Python3爬虫环境配置--解析库安装(附tesserocr安装方法) 抓取网页代码后,第二步就是提取信息,为了方便程序设计,这里不采用繁琐的正则提取,利用社区里强大的Python解析库,如lxml ...

  5. 华大单片机HC32L136J8TA读取DS18B20温度(源码+时钟配置)

    免费的C语言和linuxPDF文档:传送门 有一点C语言基础和华大单片机开发经验,应该就能看得懂就不多介绍了,有疑问可以留言,看到就回了; 关于协议具体解析:传送门@不脱发的程序猿 注(2021-05 ...

  6. SpringBoot默认日志logback配置解析

    SpringBoot默认日志logback配置解析 前言 今天来介绍下Spring Boot如何配置日志logback,我刚学习的时候,是带着下面几个问题来查资料的,你呢 如何引入日志? 日志输出格式 ...

  7. Dubbo 框架设计与源码解读(配置解析优先级、线程分配、负载均衡、容错方案)

    整体框架设计 图例说明: 图中左边淡蓝背景的为服务消费⽅使⽤的接⼝,右边淡绿⾊背景的为服务提供⽅使⽤的接⼝,位于中轴线上的为双⽅都⽤到的接⼝. 图中从下⾄上分为⼗层,各层均为单向依赖,右边的⿊⾊箭头代 ...

  8. Spring Boot:(六)默认日志logback配置解析

    Spring Boot:(六)默认日志logback配置解析 前言 今天来介绍下Spring Boot如何配置日志logback,我刚学习的时候,是带着下面几个问题来查资料的,你呢 如何引入日志? 日 ...

  9. 如何修改IMX6UL开发板时钟配置?

    启扬i.MX6UL开发板时钟由24Mhz与32.768Khz晶振提供,这里不具体介绍NXP公司整体的时钟规划,只从软件API接口方面去分析如何去修改一个外设的时钟. 接下来的讲解将以CAN总线的时钟为 ...

最新文章

  1. 例解基于UML的面向对象分析与设计
  2. 产生线程安全的原因(3)(操作系统)
  3. apply和call用法
  4. chrome91 后 SameSite by default cookies 不对外开放 解决方案
  5. PHP移动互联网开发(1)——环境搭建及配置
  6. 2017-10-26 消息队列设计
  7. CF1042A Benches
  8. Android学习之文本编辑控件的使用
  9. 不用vpn的谷歌翻译网址
  10. 计算机平均分函数a,平均值计算函数Average、Averagea、AverageIfs、Trimmean
  11. AI产品经理,如何面对数据挖掘?
  12. 夜神模拟器连接手柄无反应_夜神模拟器手柄设置
  13. python学习——matplotlib颜色设置适合论文的配色
  14. 使用 keepalived 设置虚拟 IP 环境
  15. 电影、酒店、外卖红包天天领
  16. linux版英特尔酷睿i7,英特尔酷睿i7 1165G7和AMD Ryzen 7 Pro 4750U Linux性能对比
  17. IDEA的设置(背景颜色、字体大小、注释颜色)
  18. java读取csv文件的两种方式
  19. 五招教你做好企业年终绩效考核,太实用了!
  20. python统计水仙花数个数_Python一句代码实现找出所有水仙花数的方法

热门文章

  1. 以管理创新推动零售企业ERP应用(转)
  2. 2021中石油程序设计平台新生热身赛6-挨打记录2021/11/23
  3. 访问共享文件夹里的office文档时提示内存或磁盘空间不足
  4. 爱心宠物诊所系统(禹州实训项目)
  5. WiFi 移植记录及心得 一
  6. 瑞芯微RK3399Pro平台YOLOv4 pytorch模型转RKNN模型失败
  7. 2022年起重机司机(限桥式起重机)考试题模拟考试题库及模拟考试
  8. 勘探地球物理-FWI
  9. 监控属于计算机应用的,实时监控
  10. 最新最酷Android手机游戏灵活的球球代码