GD32F450的时钟笔记
创始人
2024-01-25 17:51:31
0

GD32F450 标称 200MHz,但是在手册中又说 它是 240MHz。本文以 手册中的 240MHz 进行举例,我保险起见,产品中使用还是在 200MHz 下使用。

时钟树

手册上的时钟树图如下
在这里插入图片描述

GD32F450的 外部时钟源 有2个

  • LXTAL 外部低速时钟源 32.768 kHz
  • HXTAL 外部高速时钟源 4~32 MHz

GD32F450的 内部时钟源 有3个

  • IRC32K 内部 32KHz 时钟源
  • IRC16M 内部 16MHz 时钟源
  • IRC48M 内部 48MHz 时钟源

重要时钟

对于 GD32F450 的使用,主要关注

  • CK_SYS 系统时钟
    _
  • HCLK ( AHB bus,Cortex-M4,SRAM,DMA,peripherals )
  • PCLK1 ( APB1 peripherals )
  • CKTIMERx ( TIMER1,2,3,4,5,6,11,12,13 )
  • PCLK2 ( APB2 peripherals )
  • CKTIMERx ( TIMER0,7,8,9,10 )
  • CK_ADCX ( ADC 0,1,2 )

主要的外设时钟还是下面这三个时钟,它们衍生出其它外设时钟。

  • AHB 最高时率为 240 MHz
  • APB2 最高时率为 120 MHz
  • APB1 最高时率为 60 MHz

对于单片机内核,仅需要关注 HCLK
上述的时钟 主要还是 通过 CK_SYS 时钟衍生出来的,因此需要先配置好它,才能对接下来的 外设时钟进行配置。

GD32F450的PLL

CK_SYS 有 3 个 时钟源,如下图所示:

在这里插入图片描述
即,

  • IRC16M 内部16MHz (默认)
  • HXTAL 外部高速时钟
  • PLLP 倍频时钟P

CK_SYS 要想达到240MHz,必须要通过 倍频时钟P 得到。

GD32F450有3个PLL,与CK_SYS有关的只有PLL,如下图所示

在这里插入图片描述

根据上图,可以明确倍频步骤了。

  1. 打开外部时钟源(HXTAL)
  2. 切换内核时钟为非PLL时钟(当前例程为选择内部16MHz时钟)
  3. 确定切换成功
  4. 关闭PLL
  5. 配置 PLLSEL 选择外部时钟源(鄙人的开发板外部晶振为8MHz)
  6. 配置输入分频系数,倍频系数N,输出P分频系数
  7. 使能 PLL
  8. 配置SCS切换时钟
  9. 确定切换成功

查看相关寄存器,即可进行配置了。

代码如下

uint8_t CLock_Init(void)
{uint16_t overTimeCnt;RCU_CTL |= RCU_CTL_HXTALEN;												// 高速晶体振荡器(HXTAL)使能overTimeCnt = 0x0fff;do{overTimeCnt--;if(!overTimeCnt)return FAILED;													// 等待超时} while (!(RCU_CTL & RCU_CTL_HXTALSTB));								// 等待 外部晶振HXTAL 稳定RCU_CFG0 = (RCU_CFG0 & ~RCU_CFG0_SCS) | RCU_CKSYSSRC_IRC16M;			// 系统时钟 选择内部16MHzoverTimeCnt = 0x0fff;do{overTimeCnt--;if(!overTimeCnt)return FAILED;													// 等待超时} while ((RCU_CFG0 & RCU_CFG0_SCSS) != RCU_SCSS_IRC16M);				// 等待 系统时钟 选择内部16MHzRCU_CTL &= ~RCU_CTL_PLLEN;												// 关闭 PLLoverTimeCnt = 0x0fff;do{overTimeCnt--;if(!overTimeCnt)return FAILED;													// 等待超时} while ((RCU_CTL & RCU_CTL_PLLEN));									// 等待 关闭 PLLRCU_PLL = 	( RCU_PLL & ~(RCU_PLL_PLLPSC | RCU_PLL_PLLN | RCU_PLL_PLLP | RCU_PLL_PLLSEL | RCU_PLL_PLLQ) ) | \( 8 << 0)    | ( 480 << 6)  | ( 0 << 16)   | RCU_PLL_PLLSEL | ( 10 << 24);// 输入8分频     | 倍频480倍    | PLLP 2分频   | 选择外部晶振   | PLLQ 10分频// 输入 1MHz     | VCO=480MHz   | PLLP=240MHz  |                | PLLQ=48MHzRCU_CTL |= RCU_CTL_PLLEN;												// 使能 PLLoverTimeCnt = 0x0fff;do{overTimeCnt--;if(!overTimeCnt)return FAILED;													// 等待超时} while (!(RCU_CTL & RCU_CTL_PLLSTB));									// 等待 PLL 稳定RCU_CFG0 = (RCU_CFG0 & ~(RCU_CFG0_AHBPSC | RCU_CFG0_APB1PSC | RCU_CFG0_APB2PSC)) | \(0 << 4)     | (5 << 10)        | (4 << 13);// AHB不分频     | APB1 4分频       | APB2 2分频// 240MHz        | 60MHz            | 120MHzRCU_CFG0 = (RCU_CFG0 & ~RCU_CFG0_SCS) | RCU_CKSYSSRC_PLLP;				// 系统时钟 选择PLLPoverTimeCnt = 0x0fff;do{overTimeCnt--;if(!overTimeCnt)return FAILED;													// 等待超时} while ((RCU_CFG0 & RCU_CFG0_SCSS) != RCU_SCSS_PLLP);					// 等待 系统时钟 选择PLLPreturn SUCCEED;
}

简单的方法

其实厂家已经帮我们初始化好了时钟,在 system_gd32f4xx.c 文件中 通过 选择宏定义就能 将单片机 配置成常用的时钟频率了。

AHB 不分频
APB1 四分频
APB2 二分频


/* 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)
//#define __SYSTEM_CLOCK_240M_PLL_IRC16M          (uint32_t)(240000000)
// #define __SYSTEM_CLOCK_240M_PLL_8M_HXTAL        (uint32_t)(240000000)
//#define __SYSTEM_CLOCK_240M_PLL_25M_HXTAL       (uint32_t)(240000000)

相关内容

热门资讯

适合新手的15个小本创业好项目... 没经验也可以创业,关键你要选对项目,新手能做的创业项目有哪些呢?不仅火爆,而且低成本?一起来看看吧!...
2018年穷人专区 看完让你慌... 创业并不一定是缺钱,也有可能是不满足于现状,不过对于大多数人来说,创业确实是一个摆脱贫困的方法。当然...
2018年几个能赚大钱的小本创... 据分析,目前广州市面旗袍的价格大约在200元到5000元之间。由于穿旗袍的人具有一定的消费能力,所以...
五大2019小本创业首选项目小... 2019小本创业项目有哪些呢?创业首先就是要确定一个好的创业项目,有了好的创业项目创业就会事半功倍,...
适合白手起家的6个 适合白手... "生活中有很多不为人知的冷门生意,只要你胆子大,也许你就可以靠它们发家!很多人对于创业只是空有想法,...
【15年创业好项目】15年创业... 为什么穷人多不敢去创业蛋糕创业蛋糕店创业30岁女人创业做什么适合女性创业的大学生适合什么创业毕业生如...
0加盟费用的小本创业项目有哪些... 加盟商开展加盟主要有2个目的:1、通过加盟来赚取更多利润,其中费用会涉及到,加盟费或者代理费,设备费...
小本创业加盟什么项目好,月入2... 随着经济的发展,新兴行业不断增多,正如雷军曾说的“站在风口上,猪都可以飞起来”,在现实生活中,抓住行...
2020年最具潜力的小本创业项... 照片书就是一个把照片做成书的项目,整个微商界并没有一款像照片书这样老小皆宜的个性化定制产物,所以才显...
2018年有特色的小本投资创业... 3、拼图小店针对时下很多人追求既有个性又能带来情味的休闲方式,可开一家既能让消费者怡情消遣,又可以装...