零基础国产GD32单片机编程入门(二十一)系统时钟频率配置实战含源码

news2024/11/15 8:16:05

文章目录

    • 一.概要
    • 二.GD32F103C8T6单片机时钟源介绍
    • 二.GD32F103C8T6单片机外部高频晶振配置
    • 三.GD32F103C8T6单片机内部高频晶振配置
    • 四.GD32F103C8T6单片机使用内部8M晶振实验
    • 五.工程源代码下载
    • 六.小结

一.概要

GD32单片机的时钟源包括多种选项,时钟控制单元提供了一系列频率的时钟功能,包括一个内部8M RC振荡器时钟(IRC8M)、一个外部高速晶体振荡器时钟(HXTAL)、一个内部40K RC振荡器时钟(IRC40K)、一个外部低速晶体振荡器时钟(LXTAL)、一个锁相环(PLL)、一个HXTAL时钟监视器、时钟预分频器、时钟多路复用器和时钟门控电路。

二.GD32F103C8T6单片机时钟源介绍

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

IRC8M:高速内部8MHz时钟,内部8MHz RC振荡器时钟,简称IRC8M时钟,拥有8MHz的固定频率,设备上电后CPU默认选择的时钟源就是IRC8M时钟。他精度比较低,容易受温度影响,在CAN,USART等对时钟精度要求高的场合不适用。

HXTAL:高速外部时钟,4到16MHz的外部振荡器可为系统提供更为精确的主时钟。

PLL(Phase Locked Loop)锁相环时钟:
PLL时钟的源可以是IRC8M或HXTAL。PLL可以对输入的时钟信号进行倍频,以产生更高频率的时钟信号,从而提高系统的性能。

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

AHB、APB和Cortex™-M3时钟都源自系统时钟(CK_SYS),系统时钟的时钟源可以选择IRC8M、HXTAL或PLL。系统时钟的最大运行时钟频率可以达到108MHz。独立看门狗定时器有独立的时钟源(IRC40K),实时时钟(RTC)使用IRC40K、LXTAL或HXTAL的128分频作为时钟源。
在这里插入图片描述

二.GD32F103C8T6单片机外部高频晶振配置

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

HXTAL晶体振荡器可以通过设置控制寄存器RCU_CTL的HXTALEN位来启动或关闭,在控制寄存器RCU_CTL中的HXTALSTB位用来指示外部高速振荡器是否已稳定。在启动时,直到这一位被硬件置‘1’,时钟才被释放出来。这个特定的延迟时间被称为振荡器的启动时间。

在这里插入图片描述

 /* enable HXTAL */
    RCU_CTL |= RCU_CTL_HXTALEN;

    /* wait until HXTAL is stable or the startup time is longer than HXTAL_STARTUP_TIMEOUT */
    do{
        timeout++;
        stab_flag = (RCU_CTL & RCU_CTL_HXTALSTB);
    }while((0U == stab_flag) && (HXTAL_STARTUP_TIMEOUT != timeout));

三.GD32F103C8T6单片机内部高频晶振配置

内部8MHz RC振荡器时钟,简称IRC8M时钟,拥有8MHz的固定频率,设备上电后CPU默认选择其做为系统时钟源。IRC8M RC振荡器能够在不需要任何外部器件的条件下为用户提供更低成本类型的时钟源。IRC8M RC振荡器可以通过设置控制寄存器(RCU_CTL)中的IRC8MEN位被启动和关闭。控制寄存器RCU_CTL中的IRC8MSTB位用来指示IRC8M内部RC振荡器是否稳定。IRC8M振荡器的启动时间比HXTAL晶体振荡器要更短。

工厂会校准IRC8M时钟频率的精度,但是它的精度仍然比HXTAL时钟要差。用户可以根据需求、环境条件和成本决定选择哪个时钟作为系统时钟源。

 /* enable IRC8M */
  RCU_CTL |= RCU_CTL_IRC8MEN;
 /* wait until IRC8M is stable or the startup time is longer than IRC8M_STARTUP_TIMEOUT */
 do{
      timeout++;
      stab_flag = (RCU_CTL & RCU_CTL_IRC8MSTB);
  }
  while((0U == stab_flag) && (IRC8M_STARTUP_TIMEOUT != timeout));

四.GD32F103C8T6单片机使用内部8M晶振实验

STLINK接GD32F103C8T6开发板,STLINK接电脑USB口。

在这里插入图片描述

主要代码:

/***************************************************************************//**
  文件: main.c
  作者: Zhengyu https://gzwelink.taobao.com
  版本: V1.0.0
  时间: 202101201
  平台:MINI-GD32F103C8T6开发板


*******************************************************************************/
#include "gd32f10x.h"
#include "gd32f10x_libopt.h"
#include "systick.h"


int main(void)
{
	rcu_apb2_clock_config(RCU_APB2_CKAHB_DIV1);//设置主频108M(#define __SYSTEM_CLOCK_108M_PLL_IRC8M         (uint32_t)(108000000)),8M内部晶振  
  systick_config();//配置1ms SysTick
	rcu_periph_clock_enable(RCU_AF);//AF时钟使能 
	
	gpio_pin_remap_config(GPIO_SWJ_NONJTRST_REMAP, ENABLE);//下载口NJTRST引脚当做普通I/O口
	rcu_periph_clock_enable(RCU_GPIOB);//GPIOB时钟打开
	gpio_init(GPIOB, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_4);//PB4配置成输出
	
    while(1)
    {
        delay_1ms(1000);//等待1000ms
        gpio_bit_set(GPIOB, GPIO_PIN_4);//PB4输出高
        delay_1ms(1000);
        gpio_bit_reset(GPIOB, GPIO_PIN_4);//PB4输出低
    }
 
}

#define __IRC8M           (IRC8M_VALUE)            /* internal 8 MHz RC oscillator frequency */
#define __HXTAL           (HXTAL_VALUE)            /* high speed crystal oscillator frequency */
#define __SYS_OSC_CLK     (__IRC8M)                /* main oscillator frequency */

/* select a system clock by uncommenting the following line */
/* use IRC8M */
//#define __SYSTEM_CLOCK_48M_PLL_IRC8M            (uint32_t)(48000000)
//#define __SYSTEM_CLOCK_72M_PLL_IRC8M            (uint32_t)(72000000)
#define __SYSTEM_CLOCK_108M_PLL_IRC8M           (uint32_t)(108000000)

/* use HXTAL (XD series CK_HXTAL = 8M, CL series CK_HXTAL = 25M) */
//#define __SYSTEM_CLOCK_HXTAL                    (uint32_t)(__HXTAL)
//#define __SYSTEM_CLOCK_24M_PLL_HXTAL            (uint32_t)(24000000)
//#define __SYSTEM_CLOCK_36M_PLL_HXTAL            (uint32_t)(36000000)
//#define __SYSTEM_CLOCK_48M_PLL_HXTAL            (uint32_t)(48000000)
//#define __SYSTEM_CLOCK_56M_PLL_HXTAL            (uint32_t)(56000000)
//#define __SYSTEM_CLOCK_72M_PLL_HXTAL            (uint32_t)(72000000)
//#define __SYSTEM_CLOCK_96M_PLL_HXTAL            (uint32_t)(96000000)
//#define __SYSTEM_CLOCK_108M_PLL_HXTAL           (uint32_t)(108000000)

/*!
    \brief      configure the system clock to 108M by PLL which selects IRC8M as its clock source
    \param[in]  none
    \param[out] none
    \retval     none
*/
static void system_clock_108m_irc8m(void)
{
    uint32_t timeout = 0U;
    uint32_t stab_flag = 0U;
    
    /* enable IRC8M */
    RCU_CTL |= RCU_CTL_IRC8MEN;

    /* wait until IRC8M is stable or the startup time is longer than IRC8M_STARTUP_TIMEOUT */
    do{
        timeout++;
        stab_flag = (RCU_CTL & RCU_CTL_IRC8MSTB);
    }
    while((0U == stab_flag) && (IRC8M_STARTUP_TIMEOUT != timeout));

    /* if fail */
    if(0U == (RCU_CTL & RCU_CTL_IRC8MSTB)){
      while(1){
      }
    }

    /* IRC8M is stable */
    /* AHB = SYSCLK */
    RCU_CFG0 |= RCU_AHB_CKSYS_DIV1;
    /* APB2 = AHB/1 */
    RCU_CFG0 |= RCU_APB2_CKAHB_DIV1;
    /* APB1 = AHB/2 */
    RCU_CFG0 |= RCU_APB1_CKAHB_DIV2;

    /* CK_PLL = (CK_IRC8M/2) * 27 = 108 MHz */
    RCU_CFG0 &= ~(RCU_CFG0_PLLMF | RCU_CFG0_PLLMF_4);
    RCU_CFG0 |= RCU_PLL_MUL27;

    /* enable PLL */
    RCU_CTL |= RCU_CTL_PLLEN;

    /* wait until PLL is stable */
    while(0U == (RCU_CTL & RCU_CTL_PLLSTB)){
    }

    /* select PLL as system clock */
    RCU_CFG0 &= ~RCU_CFG0_SCS;
    RCU_CFG0 |= RCU_CKSYSSRC_PLL;

    /* wait until PLL is selected as system clock */
    while(0U == (RCU_CFG0 & RCU_SCSS_PLL)){
    }
}

实验结果:
可以看到LED D1灯(PB4引脚驱动)能间隔闪烁,间隔时间1s

五.工程源代码下载

通过网盘分享的文件:23.GPIO输出实验(8M内部晶振).zip
链接: https://pan.baidu.com/s/1a0FYU6g-etPINJOF5F_pPA 提取码: ixts

如果链接失效,可以联系博主给最新链接
程序下载下来之后解压就行

六.小结

一般我们在实际产品开发中,都会使用外部晶振,但有时候会遇到降低BOM成本,减少板子空间,增加单片机的GPIO利用率的场合,就可能会使用内部晶振。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2127140.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

滑动窗口+动态规划

前言:分析这个题目的时候,就知道要这两个线段要分开,但是要保证得到最优解,那么我们在选取第二根线段的时候,要保证我们第一根线段是左边最优解 并且我们选的两根线段的右端点一定是我们的数组的点(贪心思…

SprinBoot+Vue校园车辆管理系统的设计与实现

目录 1 项目介绍2 项目截图3 核心代码3.1 Controller3.2 Service3.3 Dao3.4 application.yml3.5 SpringbootApplication3.5 Vue 4 数据库表设计5 文档参考6 计算机毕设选题推荐7 源码获取 1 项目介绍 博主个人介绍:CSDN认证博客专家,CSDN平台Java领域优质…

HTML中的文字与分区标记

1.font标记&#xff1a;用来设置文字的字体&#xff0c;大小&#xff0c;颜色&#xff0c;等属性 <!--font:font标记用来设置字体大小颜色属性size:设置字号&#xff0c;默认是3号&#xff0c;1表示4号&#xff0c;-1表示2号&#xff0c;取值范围是[1,7]或[-7,-1]color:设置…

实战案例(4)如果想限制某些终端能上网,哪些不能上网有什么方法呢?

案例四&#xff1a;如果想限制某些终端能上网&#xff0c;哪些不能上网有什么方法呢&#xff1f; 实际中有这样的需求&#xff0c;客户那边希望某些区域只能boss上网或者boss随时都可以上&#xff0c;但是员工需要休息时间才能上&#xff0c;针对这样的需求我们来看看怎么去实现…

Leetcode3271. 哈希分割字符串

Every day a Leetcode 题目来源&#xff1a;3271. 哈希分割字符串 解法1&#xff1a;模拟 按题意模拟。 代码&#xff1a; /** lc appleetcode.cn id3271 langcpp** [3271] 哈希分割字符串*/// lc codestart class Solution { public:string stringHash(string s, int k){…

适用于 Windows 的 Citrix Workspace 中发现两项权限提升

在适用于 Windows 的 Citrix Workspace 应用程序中发现了两个高严重性漏洞CVE-2024-7889 和 CVE-2024-7890。 这些漏洞影响当前版本的 2405 之前的版本以及 LTSR 的 2402 CU1 之前的版本。 Citrix 建议客户立即更新其安装&#xff0c;以减轻使用 Citrix Workspace 环境的用户…

基于亲和性的 GPU 容器绑核策略 Copy

1.引言 在高性能计算和大规模并行任务处理中&#xff0c;GPU已经成为不可或缺的加速器。为了充分发挥GPU的计算能力&#xff0c;通过合理分配CPU核与GPU的绑定来优化CPU和GPU的关系至关重要。我们将探讨socket和NUMA&#xff08;非统一内存访问&#xff09;的概念&#xff0c;并…

计算机的错误计算(九十)

摘要 计算机的错误计算&#xff08;八十九&#xff09;探讨了反双曲余切函数 acoth(x)在 附近的计算精度问题。本节讨论绝对值为大数的反双曲余切函数值的计算精度问题。 Acoth(x) 函数的定义为&#xff1a; 其中 x 的绝对值大于 1 . 例1. 计算 acoth(1.000000000002e15) .…

ORCAD位号,BOOM表

1 ORCAD在页设置编号范围 2 输出BOOM表

基于python+django+vue的农产品销售管理系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、SSM项目源码 系统展示 【2025最新】基于pythondjangovueMySQL的农…

开发基础之Python 函数(Basic Python Functions for Development)

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:Linux运维老纪的首页…

【天池比赛】【零基础入门金融风控 Task2赛题理解】实战进行中……

2.3 代码示例 2.3.1 导入数据分析及可视化过程需要的库 import pandas as pd import numpy as np import matplotlib.pyplot as plt import seaborn as sns import datetime import warnings warnings.filterwarnings(ignore) 2.3.2 读取文件 #读取数据时相对路径载入报错时…

并发编程-JUC原子类、CAS和 Unsafe类

文章目录 零、说在前面一、CAS原理1.1 CAS简介1、线程安全的实现方案2、什么是CAS 1.2 CAS使用案例1.3 CAS存在的问题1、ABA问题2、只能保证一个共享变量之间的原子性操作3、无效CAS会带来开销问题4、总线风暴问题 1.4 CAS在JDK中的应用 二、Unsafe类详解2.1 Unsafe类介绍2.2 U…

使用 Azure 机器学习微调小型语言模型 (SLM) Phi-3

目录 概述 动手实验室 概述 小型语言模型 (SLM) 的动机 效率&#xff1a;SLM 的计算效率更高&#xff0c;需要的内存和存储空间更少&#xff0c;而且由于需要处理的参数更少&#xff0c;因此运行速度更快。成本&#xff1a;培训和部署 SLM 的成本较低&#xff0c;使其可供更广…

【MySQL】从0开始在Centos 7环境安装MySQL

&#x1f984;个人主页:修修修也 &#x1f38f;所属专栏:MySQL ⚙️操作环境:Xshell (操作系统:CentOS 7.9 64位) 目录 准备步骤 卸载原有环境 安装步骤 获取MySQL官方yum源 安装MySQL yum源 结语 准备步骤 卸载原有环境 第一步登录云服务器(注意安装yum需要在root身份下…

ctf.show靶场ssrf攻略

前言 欢迎来到我的博客 个人主页:北岭敲键盘的荒漠猫-CSDN博客 web351 解析:post传入url参数他就会访问。 解法: hackbar传入url参数写入https://127.0.0.1/flag.php web352 解析:post传入url参数&#xff0c;不能是127.0.0.1和localhost 解法:缩写127.1传入 web353 解析…

FTP、SFTP安装,整合Springboot教程

文章目录 前言一、FTP、SFTP是什么&#xff1f;1.FTP2.SFTP 二、安装FTP1.安装vsftp服务2.启动服务并设置开机自启动3.开放防火墙和SELinux4.创建用户和FTP目录4.修改vsftpd.conf文件5.启动FTP服务6.问题 二、安装SFTP总结 前言 在一般项目开发工程中&#xff0c;我们大多数会…

什么是数据治理?在企业数字化转型过程中有什么用?

建设背景 有效的数据治理不仅能够确保数据的安全和质量&#xff0c;还能为企业提供深入的业务洞察&#xff0c;推动决策制定和创新。数据治理是数字化转型的基础&#xff0c;是数据资源成为数据资产的基础&#xff0c;只有经过了数据治理&#xff0c;相应的数据资源才能产生价…

Ubuntu 24.04中安装virtualenv

在Ubuntu 24.04中安装virtualenv&#xff0c;可以按照以下步骤进行&#xff1a; 1. 确保Python已安装‌&#xff1a; 在终端中输入python --version或python3 --version来检查Python的安装情况。 python3 --version2. 安装pip‌&#xff08;如果尚未安装&#xff09;&#x…

【论文笔记】AutoLFADS (Nature Methods, 2022)

相关链接&#xff1a; Is This Tutorial For You? - AutoLFADS TutorialDANDI ArchiveNonhuman Primate Reaching with Multichannel Sensorimotor Cortex Electrophysiology Abstract 通过深度神经群体动力学模型实现最先进的性能需要对每个数据集进行广泛的超参数调整。 Au…