【GD32F303红枫派使用手册】第一节 RCU-时钟配置及输出实验

1.1 实验内容

通过本实验主要学习以下内容:

  • RCU时钟原理及配置;
  • RCU时钟输出验证。

1.2 实验原理

1.2.1 RCU时钟树原理

GD32F303系列MCU的时钟树如下图所示,由该图可知,GD32F303系列MCU的时钟树可大致分为三个部分:1、主系统时钟以及外设时钟配置,如下图所示,GD32F303系列MCU最高主频为120MHz(CK_SYS),该系统时钟根据SCS[1:0]控制位进行选择,可选择来源于HSI8M、PLL或者HXTAL,PLL时钟源可根据PLLSEL控制位选择来自于HSI8M/2或者HXTAL以及HSI48M,之后经过2-63倍频(PLLMF)得到PLL时钟,PLL时钟可以通过USB分频输出给USB模块,系统时钟会直接输出给IIS外设使用,AHB时钟可由系统时钟分频而来,AHB时钟最高120M,AHB时钟会输出给内核以及外设使用;2、RTC以及独立看门狗时钟配置,如图中2所示,RTC时钟可选择HXTAL/128分频、LXTAL或者IRC40K,独立看门狗仅可选择IRC40K使用;3、时钟输出配置,如图中3所示,内部系统时钟、IRC8M、HXTAL以及PLL/2可通过CKOUT0SEL控制位控制输出到CKOUT引脚。

1.2.2 外部高速晶振原理

外部高速晶振可选择4-32M时钟,若系统应用中有异步通信以及高精度定时等应用建议选择使用外部高速晶振,外部高速晶振具有更高的精度,在GD32F303应用系统中建议选择8M/16M/24M晶振,因为外部晶振输入给PLL的时钟源仅可进行1分频或者2分频,选择其他频率的晶振难以配置到最高120M系统时钟。

HXTAL具有时钟监测的功能,置位CKMEN控制位将会使能该功能,使能后一旦监测到HXTAL失效,HXTAL将自动被禁止,中断寄存器RCU_INT中的HXTAL时钟阻塞中断标志位CKMIF将被置‘1’,并产生NMI不可屏蔽中断,使用者可在NMI中断中切换到内部时钟并重新进行时钟配置,可用于HXTAL失效情况下的异常处理。

1.2.3 内部高速时钟原理

GD32F303系列MCU的内部高速时钟有IRC8M和IRC48M,IRC8M较为常用,且具有更高的精度,另外需注意内部高速时钟并非晶振,电路上为RC振荡器,因而比较容易受外部环境的影响,如下图所示,常温下IRC8M的精度约为1%。

1.2.4 内部低速时钟原理

GD32F303系列MCU内部有IRC40K低速时钟,该低速时钟可以为RTC或FWDG使用,如下图所示,据测试IRC40K精度较差,如果作为RTC时钟源可能存在较大偏差的情况,如果使用者使用RTC建议可以选择LXTAL外部低频晶振,或者使用内部高速时钟对IRC40K进行校准(校准方法为使用内部高速时钟对IRC40K进行捕获,然后调整IRC40K的trim值)。

1.2.5 外部低速晶振原理

外部低速晶振一般选择32.768KHZ的晶振,外部低速晶振可以选择作为RTC时钟,在这种情况下,RTC可以在VDD掉电以及VBAT不掉电的情况下工作。

1.2.6 时钟输出功能

时钟输出功能可以输出4-120MHz的时钟,具体通过配置CKOUT0SEL控制位进行实现,另外需要将CKOUT引脚(一般为PA8引脚)配置为推挽输出的模式,有关时钟输出选择配置如下表所示。

1.3 硬件设计

本节主要介绍开发板外挂高速晶振以及低速晶振电路。

1.3.1 外部高速晶振电路设计

外部高速晶振电路如下图所示,其中外部高速晶振选择8MHZ,匹配电容选择20pf,该匹配电容可以参考以下公式:C1=C2=2*(Cload-CS),其中Cload为晶体负载电容,Cs为PCB以及MCU引脚的杂散电容,典型值为10pf,因而可以选择负载电容约为20pf的晶振,匹配电容即可选择20pf,需要注意晶振尽量靠近MCU引脚摆放,且晶振引脚走线尽量等长,PCB区域尽量禁空,走线可以包地,另外若走线不等长,匹配电容可以适当选择不同的匹配电容以适配不同的杂散电容。R28的1M欧姆为晶振引脚的反馈电阻,该反馈电阻的作用为减少晶振输出波形的谐波分量,提高晶振稳定性,该电阻并非必须,MCU内部也有400K的反馈电阻,从笔者使用来看,并不影响晶振起振及使用,但建议电路上可以选择保留。R29的100R电阻为晶振引脚串联电阻,用于限流以及引脚保护。另外测量晶振引脚波形时可能存在OSC_IN脚波形为较好的正弦波,OSC_OUT引脚波形可能存在畸变,该现象为正常现象,不影响使用,MCU内部使用的为OSC_IN引脚的波形,并通过内部整形方波供给MCU使用。

1.3.2 外部低速晶振电路设计

外部低速晶振电路如下图所示,外部低速晶振选择32.768KHz,匹配电容选择10pf,C1 = C2 = 2*(CLOAD - CS),其中CS为PCB和MCU引脚的杂散电容, 经验值在2pF-7pF之间,建议以5pF为参考值计算。推荐选用外部晶体时,尽量选择晶体负载电容在10pF左右的,这样外部所接匹配电容C1和C2电容值为10pF即可,且PCB Layout时尽可能近地靠近晶振引脚。

 1.4 代码解析

本节主要进行例程代码解析,主要分成两个部分:时钟配置以及CKOUT时钟输出验证。

1.4.1 时钟配置代码解析

时钟配置是一个MCU系统的基础,读者在开发MCU项目时需要首先明确当前系统所运行的主频具体是多少,这样才能够准确的进行外设时钟配置,定时器定时才会准确,ADC采样率才会准确,通信的速率才会准确等等,系统超频也会带来不可预料的风险,因而建议开发者在开发初期就需要明确系统主频配置,有条件的情况下可以通过定时或者时钟输出进行校验。

本例程中时钟配置函数代码如以下所示,该代码实现通过外部8M晶振进行PLL倍频,实现120MHz主系统时钟的功能。

C
void rcu_system_clk_config_120M(void)
{
  uint32_t timeout = 0U;
    uint32_t stab_flag = 0U;

    /* 使能外部8M晶振 */
    RCU_CTL |= RCU_CTL_HXTALEN;

    /* 等待外部晶振ready,或者外部晶振未ready情况下超时退出 */
    do{
        timeout++;
        stab_flag = (RCU_CTL & RCU_CTL_HXTALSTB);
    }while((0U == stab_flag) && (HXTAL_STARTUP_TIMEOUT != timeout));

    /* 如果外部晶振未ready,程序卡死进入while(1),读者若避免卡死可在此处切换到内部振荡器使用 */
    if(0U == (RCU_CTL & RCU_CTL_HXTALSTB)){
        while(1){
        }
    }

    RCU_APB1EN |= RCU_APB1EN_PMUEN;
    PMU_CTL |= PMU_CTL_LDOVS;

    /* AHB一分频,系统时钟等于AHB时钟 */
    RCU_CFG0 |= RCU_AHB_CKSYS_DIV1;
    /* APB2一分频,APB2高速外设时钟等于AHB时钟 */
    RCU_CFG0 |= RCU_APB2_CKAHB_DIV1;
    /* APB1 二分频,APB1低速外设时钟等于AHB时钟/2 */
    RCU_CFG0 |= RCU_APB1_CKAHB_DIV2;

    /* 选择HXTAL/2作为PLL时钟源,开发板外部晶振为8M,即8/2=4M作为PLL时钟源*/
    RCU_CFG0 &= ~(RCU_CFG0_PLLSEL | RCU_CFG0_PREDV0);
    RCU_CFG0 |= (RCU_PLLSRC_HXTAL_IRC48M | RCU_CFG0_PREDV0);

    /* CK_PLL = (CK_HXTAL/2) * 30 = 120 MHz */
/* 若希望调整系统时钟,可以调整RCU_PLL_MUL30倍频因子即可 */
    RCU_CFG0 &= ~(RCU_CFG0_PLLMF | RCU_CFG0_PLLMF_4 | RCU_CFG0_PLLMF_5);
    RCU_CFG0 |= RCU_PLL_MUL30;

    /* 使能 PLL */
    RCU_CTL |= RCU_CTL_PLLEN;

    /* 等待PLL Ready */
    while(0U == (RCU_CTL & RCU_CTL_PLLSTB)){
    }

    /* 使能PLL高驱模式 */
    PMU_CTL |= PMU_CTL_HDEN;
    while(0U == (PMU_CS & PMU_CS_HDRF)){
    }

    /* 选择PLL高驱模式 */
    PMU_CTL |= PMU_CTL_HDS;
    while(0U == (PMU_CS & PMU_CS_HDSRF)){
    }

    /* 选择PLL作为系统时钟 */
    RCU_CFG0 &= ~RCU_CFG0_SCS;
    RCU_CFG0 |= RCU_CKSYSSRC_PLL;

    /* 等待PLL被选择作为系统时钟 */
    while(0U == (RCU_CFG0 & RCU_SCSS_PLL)){
    }
}

如果读者使用的是其他频率的晶振,可以选择修改PLL倍频因子以及HXTAL的宏定义即可,比如若读者选择16MHz晶振,可以将历程中RCU_PLL_MUL30的倍频因子修改为RCU_PLL_MUL15,且将HXTAL_VALUE宏定义修改为16000000。

1.4.2 CKOUT时钟输出代码解析

CKOUT时钟输出配置代码如下所示,该函数无形参输入,首先将PA8配置为推挽输出,然后将系统时钟配置为CKOUT输出。

C
void ckout_config(void)
{
/* 以下两句配置PA8作为推挽输出,即作为CKOUT功能输出 */
rcu_periph_clock_enable(RCU_GPIOA);
gpio_init(GPIOA,GPIO_MODE_AF_PP,GPIO_OSPEED_MAX,GPIO_PIN_8);
/* 以下语句为配置系统时钟输出到CKOUT引脚,若希望输出其他时钟可以修改该函数形参,
在GD32F303上仅可以输出以下时钟:RCU_CKOUT0SRC_CKSYS,RCU_CKOUT0SRC_IRC8M,RCU_CKOUT0SRC_HXTAL,RCU_CKOUT0SRC_CKPLL_DIV2*/
rcu_ckout0_config(RCU_CKOUT0SRC_CKSYS);
}

1.4.3 主函数代码解析

本例程主函数如下所示,首先使用外部8M晶振倍频配置系统时钟为120MHZ,然后通过PA8将系统时钟输出。

C
int main(void)
{

  bsp_uart_init(&BOARD_UART);                                                                                                                                   /* 板载UART初始化 */
  printf("Example ofClock configuration and output.\r\n");
        rcu_system_clk_config_120M();                                                                                                                    /*使用外部8M晶振进行倍频,将系统时钟配置为120M*/
        
        ckout_config();                                                                                                                                                                            /*通过PA8(CKOUT)将系统时钟输出*/
        while (1)
        {}
}

1.5 实验结果

首先将PA8外接示波器,然后将本例程编译通过后,烧录到红枫派开发板中,通过示波器可以观察到系统时钟输出,如下图所示,本例程中系统时钟输出为120MHz。

由聚沃科技原创,来源于:【红枫派开发板】第一讲 RCU-时钟配置及输出实验 - 苏州聚沃电子科技有限公司 (gd32bbs.com)

GD32MCU技术交流群:859440462 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

外卖系统源码解读:校园外卖APP开发全攻略

外卖系统源码解读:校园外卖APP开发全攻略 今天,小编将深入解读外卖系统的源码,详细介绍如何开发一款功能齐全的校园外卖APP,帮助开发者快速上手,打造出高质量的外卖应用。 一、需求分析 应具备以下基本功能&#xff…

C++之对象的使用

1、static成员 2、static成员优点 2、static成员函数 静态成员函数不能访问非静态成员原因:因为没有this指针。也不可以访问非静态成员函数。 可以通过对象来访问静态成员,但是不推荐这么使用,会让人误解成这个x_是属于对象的,但…

使用prometheus监测MySQL主从同步状态方案

说明:本文介绍如何使用prometheus、alertmanager监测MySQL主从,当从节点中断同步时,发送邮箱报警,并使用grafana将数据视图化。 结构图如下: 安装 (1)安装应用 首先,来安装promet…

svg画简单的立方体

开发背景 要开发一个拖拽的大屏项目,其中涉及到一个装饰组件,是一个立方体cube,要求颜色可以修改,大小可以拖拽改变。 效果如下 分析 经过我一番奇思妙想,决定用svg实现,因为对svg比较熟悉。那就先来在草…

LabVIEW中实现Trio控制器的以太网通讯

在LabVIEW中实现与Trio控制器的以太网通讯,可以通过使用TCP/IP协议来完成。这种方法包括配置Trio控制器的网络设置、使用LabVIEW中的TCP/IP函数库进行数据传输和接收,以及处理通讯中的错误和数据解析。本文将详细说明实现步骤,包括配置、编程…

职责链设计模式

职责链设计模式(Chain of Responsibility Design Pattern)是一种行为设计模式,使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合。这些对象被链接成一条链,沿着这条链传递请求,直到有一…

【Vue】自动导入组件

1. 下载插件 npm install unplugin-vue-components 2. 修改vite.config.js import { fileURLToPath, URL } from node:urlimport { defineConfig } from vite import vue from vitejs/plugin-vue import Components from unplugin-vue-components/vite // 按需加载自定义组件/…

2、PHP 8.1.0-dev 后门远程命令执行漏洞复现

1、青少年ctf,题目PHP后门 2、页面 3、bp抓包发现PHP版本为8.1.0-dev 4、尝试使用以前爆出过的漏洞(网上查相关案例) User-Agentt: zerodiumvar_dump(5*5); User-Agentt: zerodiumsystem("cat /flag"); 5、查找flag User-Agentt: z…

3.游戏中自定义数据类型的解读分析

知识来源于腾讯课堂易道云 结构的解释: 计算机里的所有东西都是用二进制表示的,二进制是数字,我们用的阿拉伯数字0-9这个数字是十进制,计算机用的是二进制只有0或1,然后都是一堆0或1的数字,游戏中怎么把这…

路径规划算法--BFS

系列文章目录 文章目录 系列文章目录一、BFS二、BFS伪代码BFS与Dijkstra区别 一、BFS BFS(Breadth First Search)为广度优先搜索,是一种用于遍历或搜索树或图的搜索算法,适用于无权图的遍历。BFS从根节点开始,探索其相…

AI大模型:大数据+大算力+强算法

前言:好久不见,甚是想念,我是辣条,我又回来啦,兄弟们,一别两年,还有多少老哥们在呢? 目录 一年半没更文我干啥去了? AI大模型火了 人工智能 大模型的理解 为什么学习…

【Python】 Python中__slots__的妙用:提升性能与内存管理

基本原理 在Python中,每个类默认都会继承自object类,而object类在Python中是一个动态类,允许动态地添加属性和方法。这种灵活性使得Python在某些情况下非常强大和灵活,但同时也带来了一些性能和内存使用上的开销。 为了解决这个…

简化跨网文件传输摆渡过程,降低IT人员工作量

在当今数字化时代,IT企业面临着日益增长的数据交换需求。随着网络安全威胁的不断演变,网关隔离成为了保护企业内部网络不受外部威胁的重要手段。然而,隔离的同时,企业也需要在不同网络间安全、高效地传输文件,这就催生…

ubuntu strace命令

strace 是 Linux 系统中的一个调试工具,用于跟踪并记录系统调用(system calls)和信号(signals)。在 Ubuntu 中,strace 命令可以帮助开发者和系统管理员了解一个程序在运行时如何与操作系统内核进行交互&…

渗透测试工具Cobalt strike-1.CS介绍与配置

Cobalt Strike是一款美国Red Team开发的渗透测试神器,常被业界人称为CS。最近这个工具大火,成为了渗透测试中不可缺少的利器。其拥有多种协议主机上线方式,集成了提权,凭据导出,端口转发,socket代理&#x…

骨折分类数据集1129张10类别

数据集类型:图像分类用,不可用于目标检测无标注文件 数据集格式:仅仅包含jpg图片,每个类别文件夹下面存放着对应图片 图片数量(jpg文件个数):1129 分类类别数:10 类别名称:["avulsion_fracture",…

使用 RT 矩阵进行 3D 点云变换详解(基于 PCL 和 Eigen 库)

在 3D 点云处理中,RT 矩阵是一个常用的工具,用于对点云进行旋转和平移操作。本文将详细介绍 RT 矩阵的概念,并通过一个示例程序演示如何基于 PCL 和 Eigen 库将一帧点云进行矩阵变换再输出。 本教程的示例代码和点云数据可在 GitHub 下载。 什…

100个 Unity小游戏系列六 -Unity 抽奖游戏专题四 翻卡游戏

一、演示效果 二、知识点讲解 2.1 布局 void CreateItems(){reward_data_list reward_data_list ?? new List<RewardData>();reward_data_list.Clear();for (int i 0; i < ItemCount; i){GameObject item;if (i 1 < itemParent.childCount){item itemParent…

垂类短视频:四川鑫悦里文化传媒有限公司

垂类短视频&#xff1a;内容细分下的新媒体力量 随着移动互联网的迅猛发展和智能手机的普及&#xff0c;短视频已成为当下最受欢迎的媒介形式之一。四川鑫悦里文化传媒有限公司而在短视频领域&#xff0c;一个新兴的概念——“垂类短视频”正逐渐崭露头角&#xff0c;以其独特…

⌈ 传知代码 ⌋ 高速公路车辆速度检测软件

&#x1f49b;前情提要&#x1f49b; 本文是传知代码平台中的相关前沿知识与技术的分享~ 接下来我们即将进入一个全新的空间&#xff0c;对技术有一个全新的视角~ 本文所涉及所有资源均在传知代码平台可获取 以下的内容一定会让你对AI 赋能时代有一个颠覆性的认识哦&#x…