打印

GD32 MCU 常见外设介绍(RCU模块、GPIO模块)

[复制链接]
1625|15
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 智芯云技术 于 2023-12-15 12:17 编辑

RCU 时钟介绍 众所周知,时钟是MCU能正常运行的基本条件,就好比心跳或脉搏,为所有的工作单元提供时间基数。时钟控制单元提供了一系列频率的时钟功能,包括一个内部RC振荡器时钟(IRC)、一个外部高速晶体振荡器时钟(HXTAL)、一个外部低速晶体振荡器时钟(LXTAL)、一个HXTAL时钟监视器、时钟预分频器、时钟多路复用器和时钟门控电路等。本章,我们将通过一个“输出HXTAL时钟信号”的实验来熟悉RCU的工作流程。



RCU 配置


GD32系列MCU在启动后首先会执行Reset Handler,紧接着就会执行SystemInit()函数,而时钟的初始化,就是在这个函数中进行,其主要的功能是配置系统时钟CK_SYS(即主频),AHB、APB1以及APB2时钟。SystemInit()函数由GD32官方库提供,不同系列的MCU有一些差别,但实现方式基本相同:首先将RCU关于CK_SYS,AHB、APB1以及APB2时钟配置的一些寄存器恢复到默认值,然后再执行system_clock_config()函数,用于具体的时钟配置。实际上用户可以不用过于关心上述的实现方式,因为GD32库已经为您提供了多种时钟源及时钟选择,您只需按照以下步骤即可将时钟设置为您期望的值(以GD32F30x为例,其他系列类似):(1) 在system_gd32f30x.c中,用户可通过选择宏来进行预设的时钟配置,如时钟配置选择宏定义,选择了HXTAL作为PLL时钟源,且配置CK_SYS为120MHz。
时钟配置选择宏定义  

但这种情况下您使用的外部晶振需要是默认值,此值由HXTAL_VALUE定义,如为8000000,那么您应该选择8MHz的外部晶振。当然,您可以使用其他规格的外部晶振,这种情况下就需要去修改RCU配置函数里面的一些参数,主要是分频和倍频系数,以达到期望的配置,具体如何修改,可以结合GD32的User manual中定义的RCU寄存器来对配置函数进行分析。
(2) 设置HXTAL_VALUE的值。
此数值和RCU的初始化其实并没有太大关系,但如果您使用的外部晶振不是默认值,那么除了按照步骤(1)修改配置参数外,您还必须将此HXTAL_VALUE的值修改为实际的外部晶振频率,这是因为在一些通信外设配置时,库函数会调用HXTAL_VALUE值来设置波特率,如此值设置错误,会导致通信异常。

非默认外部晶振配置时钟实例
游客,如果您要查看本帖隐藏内容请回复


硬件连接说明


本文通过“输出HXTAL时钟信号”实验来熟悉RCU的工作流程。通过前面内容讲解可知,本章实验为“输出HXTAL时钟信号”,即通过PA8口将HXTAL输出,我们使用示波器,将探头连接到PA8口,从示波器上读取PA8口波形即可。

软件配置说明

本小节讲解RCU_Example例程中RCU的配置说明,主要包括外设时钟配置、GPIO引脚配置、主函数介绍以及运行结果。软件设计的流程如下:
(1)使能GPIOA时钟
(2)初始化PA8,将此端口设置为备用功能模式(AFIO)
(3)通过调用库函数选择HXTAL作为PA8时钟信号源

外设时钟配置

外设时钟配置如RCU例程时钟配置所示,在GD32全系列MCU中需打开GPIOA时钟。
RCU例程时钟配置



GPIO 引脚配置


RCU 例程引脚配置


主函数说明
RCU 例程主函数

如 RCU例程主函数,该主函数主要分成四部分,RCU时钟配置、GPIO配置、RCU输出相关库函数调用和while(1)主循环,其中RCU输出相关库函数请读者结合各系列MCU Datasheet、User Manual进行RCU例程的分析。
注意:因为是输出HXTAL,所以必须要使能HXTAL,否则PA8将无波形输出。一个简单的办法是将HXTAL作为CK_SYS时钟源,请参考本章第一节内容。

运行结果
如图RCU 例程运行结果为 RCU 例程运行结果,可看出,PA8 口正确输出了 HXTAL 波形。
图RCU 例程运行结果


                                                                         GPIO 模块介绍
GPIO的全称为通用输入输出口,是很多外设能够正常工作的必要条件。除了一些特定功能的引脚(如电源脚)外,MCU上其他的引脚都可以当做GPIO来使用。本章,我们将对GPIO进行简单介绍,并通过一个“流水灯”的实验来熟悉GPIO的工作模式。

GPIO 基础知识

GD32系列MCU的GPIO口是以“组”的形式工作,命名方式为PX(X=A,B,C,D,E···),每组配置有16个pin脚。每个pin脚都可由软件配置为输出(推挽或开漏)、输入、外设备用功能或者模拟模式。每个 GPIO 引脚都可以配置为上拉、下拉或浮空。除模拟模式外,所有的 GPIO 引脚都具备大电流驱动能力。
GPIO的主要特性
◼ 输入/输出方向控制;
◼ 施密特触发器输入功能使能控制;
◼ 每个引脚都具有弱上拉/下拉功能;
◼ 推挽/开漏输出使能控制;
◼ 置位/复位输出使能;
◼ 可编程触发沿的外部中断—使用EXTI配置寄存器
◼ 模拟输入/输出配置;
◼ 备用功能输入/输出配置;
◼ 端口锁定配置;

GPIO结构框图
标准I/O端口位的基本结构为标准I/O端口位的基本结构图。

GPIO引脚配置


在复位期间或或复位之后,备用功能并未激活,所有GPIO端口都被配置成输入浮空模式,这种输入模式禁用上拉(PU)/下拉(PD)电阻。用户可通过软件配置GPIO为输入或输出模式。当 GPIO引脚配置为输入引脚时,所有的GPIO引脚内部都有一个可选择的弱上拉和弱下拉电阻。当GPIO引脚配置为输出引脚,用户可以配置端口的输出速度和选择输出驱动模式:推挽或开漏模式。

输入配置
当GPIO引脚配置为输入时:
◼ 施密特触发输入使能;
◼ 可选择的弱上拉和下拉电阻;
◼ 当前I/O引脚上的数据在每个APB2时钟周期都会被采样并存入端口输入状态寄存器;
◼ 输出缓冲器禁用。
输入配置是I/O引脚的输入配置。

输出配置
当GPIO引脚配置为输出时:
◼ 施密特触发输入使能;
◼ 弱上拉和下拉电阻禁用;
◼ 输出缓冲器使能;
◼ 开漏模式:输出控制寄存器设置为“0”时,相应引脚输出低电平;输出控制寄存器设置为“1”,相应管脚处于高阻状态;
◼ 推挽模式:输出控制寄存器设置为“0”时,相应引脚输出低电平;输出控制寄存器设置为“1”,相应引脚输出高电平;
◼ 对端口输出控制寄存器进行读操作,将返回上次写入的值;
◼ 对端口输入状态寄存器进行读操作,将获得当前I/O口的状态。
输出配置是I/O端口的输出配置

模拟配置
当GPIO引脚配置为模拟模式时:
◼ 弱上拉和下拉电阻禁用;
◼ 输出缓冲器禁用;
◼ 施密特触发输入禁用;
◼ 端口输入状态寄存器相应位为“0”。
模拟配置是I/O端口的输出配置

备用功能(AF)
除了用作通用 IO 口以外,所有的 GPIO 都有备用功能。对于 GD32F10x/20x/30x/403/E10x 系列 MCU,用户可通过软件将某一个 GPIO 配置为复用模式,然后再使能相应外设即可使用 IO 对应的复用功能。对于 GD32F1x0/3x0/4xx/E23x 系列 MCU,用户可通过软件将某一个 GPIO 配置为复用模式,同时还需要设置 GPIO 备用功能选择寄存器选择 16 个备用功能中的一个。以 GD32F130 为例,说下具体的配置流程。
(1) 设置 GPIO 模式 gpio_mode_setgpio_mode_set函数原型为:

其中形参gpio_periph为需要设置的GPIO口组,其对应的实参为GPIOx(x = A,B,C,D,E,F,G),形参mode为需要设置的GPIO模式,对应的实参为:
形参pin为pin脚号,实参为GPIO_PIN_x(x=0..15)。(2) 设置 AF 类型 gpio_af_set当需要将GPIO设置为复用模式时,除了调用gpio_mode_se设置GPIO模式外,还需要调用函数gpio_af_set进行复用类型的设置。gpio_af_set函数原型为:

其中形参gpio_periph为需要设置的GPIO口组,其对应的实参为GPIOx(x = A,B,C,D,E,F,G),形参alt_func_num为需要设置复用类型,对应的实参为:
GPIO_AF_0(复用类型0)
GPIO_AF_1(复用类型1)
GPIO_AF_2(复用类型2)
GPIO_AF_3(复用类型3)
GPIO_AF_4(复用类型4)
GPIO_AF_5(复用类型5)
GPIO_AF_6(复用类型6)
GPIO_AF_7(复用类型7)
F1x0、F3x0、F4xx(F405\F407\F450)、E23x系列MCU的GPIO的复用类型可以从对应MCU的Datasheet中查得,如GD32F130系列的复用类型表如下图(部分截图):

形参pin为pin脚号,实参为GPIO_PIN_x(x=0..15)。根据以上介绍,如设置PA0为复用模式,且设置功能为USART0_CTS功能,函数调用如下:


I/O 重映射功能
本节内容只适用于GD32F10x/30x/403/E103系列MCU。
介绍为了扩展GPIO的灵活性或外设功能使用,通过配置AFIO端口配置寄存器(AFIO_PCF0/AFIO_PCF1),每个I/O引脚都可以配置多达4种不同的功能。通过使用外设 IO 的重映射功能可以选择合适的引脚位置。主要特性
◼ EXTI 源选择
◼ 每个引脚具有多达4种备用功能的配置
外设重映射配置
以GD32F30x的USART0 AF重映射来说明重映射配置。

由表可 看 出 , 当 USART0_REMAP = 0 时 ,USART0_TX 和 USART0_RX 功 能 映 射 在 PA9 、 PA10 上 , 而 当 USART0_REMAP = 1 时 ,USART0_TX和USART0_RX功能映射在PB6、PB7上。可 看 出 , 当 USART0_REMAP = 0 时 ,USART0_TX 和 USART0_RX 功 能 映 射 在 PA9 、 PA10 上 , 而 当 USART0_REMAP = 1 时 ,USART0_TX和USART0_RX功能映射在PB6、PB7上。
其他外设端口重映射或其他系列MCU重映射表,请参考各系列MCU的User Manual。
JTAG/SWD 备用功能重映射
为了减少用于调试的 GPIO 端口,用户可以配置 AFIO_PCF0 寄存器中的 SWJ_CFG [2:0]位为不同的值。具体情况调试端口映射。

注意:当JTAG或SWD定义的IO口被用户设置为其他功能时,需要根据调试端口映射将JTAG或SWD功能关闭,否则可能会出现MCU无法运行的情况。
硬件连接说明
本章以一个“流水灯”的实验来熟悉GPIO的工作模式。
“流水灯”实验硬件连接图


如图所示,LED2、LED3通过470Ω电阻和MCU的PF0、PF1连接,另一端接GND,可通过配置PF0、PF1的输出电平,来达到控制LED2、LED3亮灭的目的。读者可以根据典型硬件连接图和相应系列的Datasheet设计出自己的硬件连接方式。
软件配置说明

本小节讲解GPIO_Example例程中GPIO的配置说明,主要包括外设时钟配置、GPIO引脚配置、主函数介绍以及运行结果。软件设计的流程如下:
(1) 使能GPIOF时钟
(2) 初始化PF0和PF1,将这两个引脚配置为推挽输出
(3) 通过调用库函数配置PF0和PF1的电平,再通过一些延时处理,使LED2和LED3交替点亮,以实现流水灯
外设时钟配

外设时钟配置如GPIO例程时钟配置所示,在GD32全系列MCU中需打开GPIOF时钟。

GPIO 引脚配置
GPIO 例程引脚配置



如GPIO例程引脚配置 ,GD32F10X、GD32F30X、GD32F20X、GD32E10X系列GPIO配置为推挽输出相同,调用gpio_init函数(由标准库提供)即可,此函数原型为:


其中形参gpio_periph为需要设置的GPIO口组,其对应的实参为GPIOx(x = A,B,C,D,E,F,G),形参mode为需要设置的GPIO模式,对应的实参为:

形参speed为GPIO的速度设置,对应的实参为:

形参pin为pin脚号,实参为GPIO_PIN_x(x=0..15)。实际上GPIO的速度设置只在设置为输出模式下才有效,输入模式下是无效的。F1x0、F4xx、F3x0、E23x系列GPIO配置为推挽输出相同,需调用gpio_mode_set和gpio_output_options_set函数。
(1) gpio_mode_set函数
gpio_mode_set函数原型为:


其中形参gpio_periph为需要设置的GPIO口组,其对应的实参为GPIOx(x = A,B,C,D,E,F,G),形参mode为需要设置的GPIO模式,对应的实参为:

形参pull_up_down为GPIO的上下拉设置,对应的实参为:

形参pin为pin脚号,实参为GPIO_PIN_x(x=0..15)。
(2) gpio_output_options_set函数
当需要将GPIO设置为输出模式时,除了调用gpio_mode_set设置GPIO模式外,还需要调用函数gpio_output_options_set进行GPIO的速度及输出类型的设置。gpio_output_options_set函数原型为:


其中形参gpio_periph为需要设置的GPIO口组,其对应的实参为GPIOx(x = A,B,C,D,E,F,G),形参otype为需要设置的GPIO输出类型,对应的实参为:

形参speed为引脚速度,实参为:

形参pin为pin脚号,实参为GPIO_PIN_x(x=0..15)。
主函数说明
代码清单 5-10. GPIO 例程主函数


如图所示,该主函数主要分成四部分,systick 配置、RCU 时钟配置、GPIO 配置和 while(1)主循环,其中 systick 配置用于产生延时,while(1)主循环通过控制相应GPIO 的 BC 和 BOP 寄存器来控制 GPIO 的输出电平。
运行结果

GPIO 使用注意事项
1. 当出现在调试状态下程序可运行,但run模式下MCU无法启动,需要查看是否使用了JTAG口定义的IO,用户需要在程序中将JTAG口功能屏蔽,具体请参考5.2.3节。
2. 当JTAG和SWD功能都被禁用后,MCU将无法通过仿真器连接。

8415657bd0fa0067f.png (21.62 KB )

8415657bd0fa0067f.png

94744657bd147b8d9d.png (2.12 KB )

94744657bd147b8d9d.png

84896657bd28f3a615.png (14.39 KB )

84896657bd28f3a615.png

使用特权

评论回复
沙发
tpgf| | 2024-1-4 12:20 | 只看该作者
我们说的rcu模块专指内部的晶振模块吗

使用特权

评论回复
板凳
nawu| | 2024-1-4 13:47 | 只看该作者
一个单片机分频的倍数分的越细越好吗

使用特权

评论回复
地板
gwsan| | 2024-1-4 14:17 | 只看该作者
gd的io只有开漏模式和推挽模式吗

使用特权

评论回复
5
智芯云技术|  楼主 | 2024-1-4 14:57 | 只看该作者
nawu 发表于 2024-1-4 13:47
一个单片机分频的倍数分的越细越好吗

不同外设有不同的时钟要求   如果定时器外设能做到更高倍数的分频当然是很好的

使用特权

评论回复
6
智芯云技术|  楼主 | 2024-1-4 15:01 | 只看该作者
gwsan 发表于 2024-1-4 14:17
gd的io只有开漏模式和推挽模式吗

还有复用,和输入功能

使用特权

评论回复
7
智芯云技术|  楼主 | 2024-1-4 15:07 | 只看该作者
tpgf 发表于 2024-1-4 12:20
我们说的rcu模块专指内部的晶振模块吗

指的应该是时钟模块

使用特权

评论回复
8
tfqi| | 2024-1-4 21:39 | 只看该作者
我想看一下楼主配置时钟的实例

使用特权

评论回复
9
zljiu| | 2024-1-4 22:12 | 只看该作者
这个模块能够管理所有的时钟源吗

使用特权

评论回复
10
aoyi| | 2024-1-4 22:44 | 只看该作者
为什么波形会有毛刺 是电阻不匹配的问题吗

使用特权

评论回复
11
Rakzzzi| | 2024-1-5 15:51 | 只看该作者
楼主讲得好

使用特权

评论回复
12
LKHZGD| | 2024-1-7 15:20 | 只看该作者
新手看看

使用特权

评论回复
13
药无尘| | 2024-1-30 22:28 | 只看该作者
正好需要,这个很有帮助

使用特权

评论回复
14
CYBT| | 2024-3-14 22:24 | 只看该作者
多谢分享,帮大忙了!

使用特权

评论回复
15
JLJ0036| | 2024-4-11 21:38 | 只看该作者
谢谢分享

使用特权

评论回复
16
JLJ0036| | 2024-4-12 08:10 | 只看该作者
好人一生平安

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

12

主题

125

帖子

7

粉丝