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

news2024/11/14 20:44:52

2.GPIO 模块介绍

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

2.1.GPIO 基础知识

GD32系列MCU的GPIO口是以“组”的形式工作,命名方式为PX(X=A,B,C,D,E···),每组配置有16个pin脚。每个pin脚都可由软件配置为输出(推挽或开漏)、输入、外设备用功能或者模拟模式。每个 GPIO 引脚都可以配置为上拉、下拉或浮空。除模拟模式外,所有的 GPIO 引脚都具备大电流驱动能力。

GPIO的主要特性

◼ 输入/输出方向控制;

◼ 施密特触发器输入功能使能控制;

◼ 每个引脚都具有弱上拉/下拉功能;

◼ 推挽/开漏输出使能控制;

◼ 置位/复位输出使能;

◼ 可编程触发沿的外部中断—使用EXTI配置寄存器;

◼ 模拟输入/输出配置;

◼ 备用功能输入/输出配置;

◼ 端口锁定配置;

◼ 单周期输出翻转功能;

GPIO结构框图 

如图所示为标准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端口的输出配置

2.2.备用功能(AF)

除了用作通用 IO 口以外,所有的 GPIO 都有备用功能。

对于 GD32F10x/20x/30x/403/E10x/E50x/A501/VF103 系列 MCU,用户可通过软件将某一个 GPIO配置为复用模式,然后再使能相应外设即可使用 IO 对应的复用功能。

对于 GD32F1x0/3x0/4xx/E23x/A501 系列 MCU,用户可通过软件将某一个 GPIO 配置为复用模式,同时还需要设置 GPIO 备用功能选择寄存器选择 16 个备用功能中的一个。以 GD32F130 为例,说下具体的配置流程。

(1) 设置 GPIO 模式 gpio_mode_setgpio_mode_set函数原型为:

void gpio_mode_set(uint32_t gpio_periph, uint32_t mode, uint32_t pull_up_down, uint32_t pin)
{
xxx
xxx
}

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

GPIO_MODE_INPUT(输入模式)
GPIO_MODE_OUTPUT(输出模式)
GPIO_MODE_AF(复用模式)
GPIO_MODE_ANALOG(模拟模式)

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

GPIO_PUPD_NONE(无上下拉)
GPIO_PUPD_PULLUP(上拉)
GPIO_PUPD_PULLDOWN(下拉)

形参pin为pin脚号,实参为GPIO_PIN_x(x=0..15)。

(2) 设置 AF 类型 gpio_af_set

当需要将GPIO设置为复用模式时,除了调用gpio_mode_se设置GPIO模式外,还需要调用函数gpio_af_set进行复用类型的设置。gpio_af_set函数原型为:

void gpio_mode_set(uint32_t gpio_periph, uint32_t alt_func_num, uint32_t pin)
{
xxx
xxx
}

其中形参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功能,函数调用如下:

gpio_mode_set(GPIOA,GPIO_MODE_AF,GPIO_PUPD_NONE,GPIO_PIN_0);
gpio_af_set (GPIOA,GPIO_AF_1,GPIO_PIN_0);

2.3.I/O 重映射功能

本节内容只适用于GD32F10x/30x/403/E103/E50x/A501/VF103系列MCU。

介绍

为了扩展 GPIO 的 灵 活 性 或 外 设 功 能 使 用 , 通 过 配 置 AFIO 端 口 配 置 寄 存 器(AFIO_PCF0/AFIO_PCF1),每个I/O引脚都可以配置多达4种不同的功能。通过使用外设 IO 的重映射功能可以选择合适的引脚另外,通过配置相应的EXTI源选择寄存器(AFIO_EXTISSx)选择触发中断或事件,GPIO引脚可以用作EXTI中断线。

主要特性

◼ EXTI 源选择

◼ 每个引脚具有多达4种备用功能的配置外设重映射配置以GD32F30x的USART0 AF重映射来说明重映射配置。

由上表可看出,当 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 端口的情况下表所示。

为了减少用于调试的 GPIO 端口,用户可以配置 AFIO_PCF0 寄存器中的 SWJ_CFG [2:0]位为不同的值。具体情况参照下表调试端口映射。

注意:当JTAG或SWD定义的IO口被用户设置为其他功能时,需要根据此表将JTAG或SWD功能关闭,否则可能会出现MCU无法运行的情况。

2.4.硬件连接说明

本章以一个“流水灯”的实验来熟悉GPIO的工作模式。

“流水灯”实验硬件连接图

如实验硬件连接图所示,LED2、LED3通过470Ω电阻和MCU的PF0、PF1连接,另一端接GND,可通过配置PF0、PF1的输出电平,来达到控制LED2、LED3亮灭的目的。

读者可以根据典型硬件连接图和相应系列的Datasheet设计出自己的硬件连接方式。

2.5.软件配置说明

本小节讲解GPIO_Example例程中GPIO的配置说明,主要包括外设时钟配置、GPIO引脚配置、主函数介绍以及运行结果。

软件设计的流程如下:

(1) 使能GPIOF时钟

(2) 初始化PF0和PF1,将这两个引脚配置为推挽输出

(3) 通过调用库函数配置PF0和PF1的电平,再通过一些延时处理,使LED2和LED3交替点亮,以实现流水灯

外设时钟配置

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

void rcu_config(void)
{
/* enable the led clock */
rcu_periph_clock_enable(RCU_GPIOF);
}

 GPIO 引脚配置

代码清单 0-9.GPIO 例程引脚配置

void gpio_config(void)
{
/* configure led GPIO port */ 
#if defined GD32F10X_HD || GD32F30X_HD || GD32F20X_CL || GD32E10X 
gpio_init(GPIOF, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_0);
gpio_init(GPIOF, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_1);
#elif GD32F1X0 || GD32F4XX || GD32F3X0 || GD32E23X
gpio_mode_set(GPIOF,GPIO_MODE_OUTPUT,GPIO_PUPD_NONE,GPIO_PIN_0);
gpio_mode_set(GPIOF,GPIO_MODE_OUTPUT,GPIO_PUPD_NONE,GPIO_PIN_1);
gpio_output_options_set(GPIOF,GPIO_OTYPE_PP,GPIO_OSPEED_50MHZ,GPIO_PIN_0);
gpio_output_options_set(GPIOF,GPIO_OTYPE_PP,GPIO_OSPEED_50MHZ,GPIO_PIN_1);
#endif
}

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

void gpio_init(uint32_t gpio_periph, uint32_t mode, uint32_t speed, uint32_t pin)
{
xxx
xxx
}

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

GPIO_MODE_AIN(模拟输入)
GPIO_MODE_IN_FLOATING(浮空输入)
GPIO_MODE_IPD(下拉输入)
GPIO_MODE_IPU(上拉输入)
GPIO_MODE_OUT_OD(开漏输出)
GPIO_MODE_OUT_PP(推挽输出)
GPIO_MODE_AF_OD(复用开漏输出)
GPIO_MODE_AF_PP(复用推挽输出)

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

GPIO_OSPEED_2MHZ
GPIO_OSPEED_10MHZ
GPIO_OSPEED_50MHZ
GPIO_OSPEED_MAX(只有部分系列 MCU 的 GPIO 支持大于 50MHz)

形参pin为pin脚号,实参为GPIO_PIN_x(x=0..15)。

实际上GPIO的速度设置只在设置为输出模式下才有效,输入模式下是无效的。

如代码清单GPIO例程引脚配置 ,F1x0、F4xx、F3x0、E23x系列GPIO配置为推挽输出相同,需调用gpio_mode_set和gpio_output_options_set函数。

(1) gpio_mode_set函数

gpio_mode_set函数原型为:

void gpio_mode_set(uint32_t gpio_periph, uint32_t mode, uint32_t pull_up_down, uint32_t pin)
{
xxx
xxx
}

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

GPIO_MODE_INPUT(输入模式)
GPIO_MODE_OUTPUT(输出模式)
GPIO_MODE_AF(复用模式)
GPIO_MODE_ANALOG(模拟模式)

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

GPIO_PUPD_NONE(无上下拉)
GPIO_PUPD_PULLUP(上拉)
GPIO_PUPD_PULLDOWN(下拉)

形参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函数原型为:

void gpio_output_options_set(uint32_t gpio_periph, uint8_t otype, uint32_t speed, uint32_t pin)
{
xxx
xxx
}

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

GPIO_OTYPE_PP(推挽模式)
GPIO_OTYPE_OD(开漏模式)

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

GPIO_OSPEED_2MHZ
GPIO_OSPEED_10MHZ
GPIO_OSPEED_50MHZ
GPIO_OSPEED_MAX(只有部分系列 MCU 的 GPIO 支持大于 50MHz)

 形参pin为pin脚号,实参为GPIO_PIN_x(x=0..15)。

主函数说明

代码清单 GPIO 例程主函数

int main(void)
{
systick_config();
rcu_config();
gpio_config();
GPIO_BC(GPIOF) = GPIO_PIN_0;
GPIO_BC(GPIOF) = GPIO_PIN_1;
while(1){
 /* turn on led2, turn off led3 */
GPIO_BC(GPIOF) = GPIO_PIN_0;
GPIO_BOP(GPIOF) = GPIO_PIN_1;
delay_1ms(1000);
/* turn on led3, turn off led2 */
GPIO_BC(GPIOF) = GPIO_PIN_1;
GPIO_BOP(GPIOF) = GPIO_PIN_0;
delay_1ms(1000);
 }
}

如代码清单 GPIO 例程主函数,该主函数主要分成四部分,systick 配置、RCU 时钟配置、GPIO 配置和 while(1)主循环,其中 systick 配置用于产生延时,while(1)主循环通过控制相应 GPIO 的 BC 和 BOP 寄存器来控制 GPIO 的输出电平。

运行结果

2.6.GPIO 使用注意事项

  1. 当出现在调试状态下程序可运行,但run模式下MCU无法启动,需要查看是否使用了JTAG口定义的IO,用户需要在程序中将JTAG口功能屏蔽,具体请参考2.3节。

  2. 当JTAG和SWD功能都被禁用后,MCU将无法通过仿真器连接。

 本章内容每日持续更新,如有兴趣,请关注收藏

更多GD32 MCU相关咨询:https://www.gd32bbs.com/ 

 

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

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

相关文章

力扣刷题-图论-岛屿类问题-集合实现(c++实现)

我的老师:力扣链接这道题题解中最高赞的回答nettee,从这篇题解中我学到了dfs框架以及解决思路,并独立完成了该题解里的几道习题本人刷题的习惯是学会一个板子,然后之后的同类题都机械的用这个板子去做,最好不做创新&am…

广州某展厅门牌创新案例:1*2 OLED柔性屏的精致应用

在广州这座繁华都市的心脏地带,一座现代感十足的展厅悄然矗立,其独特的门牌设计成为了过往行人目光的焦点。这座展厅的门牌采用了前沿的1*2 OLED柔性屏技术,不仅展现了科技与艺术的完美融合,更彰显了展厅的高端定位与创新精神。 项…

容器 string 的模拟实现

容器 string 的模拟实现 开篇解释代码实现:myString.h 头文件myString.cpp 实现文件 模拟实现 string 能对 STL 有更深刻的认识,底层了解越丰富,使用起来越顺手 接下来我会以 .h 头文件以及其 .cpp 的实现文件展示其大致模拟,这只…

【代码】Python3|Scrapy框架初探(汽车之家大连市二手车车辆数据爬取、清洗与可视化)

本篇主要是整个项目的介绍,没提到太多琐碎的技术细节,以后有空的话会整理一下 Scrapy 和原生爬虫的差异,还有它坑人的一些地方,单发出来。 开源地址:https://github.com/shandianchengzi/car_home_spider 使用说明&a…

学习日记:数据类型2

目录 1.转义字符 2.隐式类型转换 2.1 强制类型转换 2.2 不同类型间赋值 3.运算符 表达式 3.1 算术运算符 3.2 算术运算优先级 3.3 赋值运算 3.3.1 不同类型间混合赋值 3.4 逗号运算 4.生成随机数 5. 每日一练 1.转义字符 \n 表示换行 \t …

Vue3可媲美Element Plus Tree组件实战之移除节点

Element Plus Tree自定义节点内容示例中介绍了移除节点的用法,个人觉得作为提供给用户API,应该遵循迪米特法则,把功能实现的细节封装在组件内部,而提供给用户最简单的操作方式,同时在此基础上支持用户的扩展。 因此&a…

ITK-中值滤波

作者:翟天保Steven 版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处 中值滤波原理 中值滤波是一种常用的非线性滤波技术,用于去除图像中的噪声,特别是椒盐噪声和脉冲噪声。它…

MM 7 -采购- 询报价

思维导图 说明 sap提供了 询价 报价和比价的功能。 不建议在sap管理。一般引导不在sap管理。 流程: 操作 询价 ME41 报价ME47 比价ME49 拒绝 对于不符合条件的报价进行拒绝 生成信息记录 后台表 Ekko ekpo 。采购凭证类别:A

csa笔记6-网络管理命令

nmcli命令 字符终端,可以立即生效且重启系统后配置也不会丢失 nmtui命令 可视终端,立即生效,重启有效 network.service 管理网络 RHEL 7 以前:使用network.service管理网络 RHEL 7:使用network.service和Netwo…

Docker(十一)-Docker运行nginx1.10容器实例

1.下载镜像 docker pull nginx:1.102.直接启动实例(目的:复制出配置文件) 2.1启动实例 docker run -d -p 80:80 --namenginx1.10 nginx:1.102.2将容器内文件拷贝到本地目录 docker cp nginx1.10:/etc/nginx /software/nginx/将/software/nginx/nginx目录改为/so…

07 JSP

文章目录 JSP1、JSP 概述2、JSP 脚本和缺点3、EL 表达式4、JSTL标签5、MVC模式和三层架构6、案例 JSP 1、JSP 概述 JSP(全称:Java Server Pages):Java 服务端页面 (1)是一种动态的网页技术 (2&…

11 逻辑运算符

逻辑运算符 and、or、not 常用来连接条件表达式构成更加复杂的条件表达式,并且 and 和 or 具有惰性求值或逻辑短路的特点,当连接多个表达式时只计算必须要计算的值。 运算符 and 和 or 并不一定会返回 True 或 False ,而是得到最后一个被计算…

WordPress主题追格企业官网主题免费开源版V1.1.6

追格企业官网主题免费开源版由追格开发的一款开源wordpress主题,专为企业建站和追格企业官网小程序(开源版)PC配套而设计,功能集新闻动态、留言反馈、产品与服务、公司简介、联系我们等模块。

【MySQL进阶篇】锁:全局锁、表级锁以及行级锁

一、锁的概述 锁是计算机协调多个进程或线程并发访问某一资源的机制。在数据库中除传统的计算资源(CPU、RAM、I/O)的争用以外,数据也是一种供许多用户共享的资源。如何保证数据并发访问的一致性、有效性是所有数据库必须要解决的一个问题&am…

Apache Doris + Paimon 快速搭建指南|Lakehouse 使用手册(二)

湖仓一体(Data Lakehouse)融合了数据仓库的高性能、实时性以及数据湖的低成本、灵活性等优势,帮助用户更加便捷地满足各种数据处理分析的需求。在过去多个版本中,Apache Doris 持续加深与数据湖的融合,已演进出一套成熟…

java学习--枚举

问题引入: 当需要解决一个季节类的问题,我们使用学到的类与对象,创建一个季节的类然后添加构造器在进行分装就可以实现,但问题也随之而来,这样不仅可以有正常的四季还可以添加其他不存在的四季以及可以更改四季的属性…

ElasticSearch学习篇15_《检索技术核心20讲》进阶篇之TopK检索

背景 学习极客实践课程《检索技术核心20讲》https://time.geekbang.org/column/article/215243,文档形式记录笔记。 相关问题: ES全文检索是如何进行相关性打分的?ES中计算相关性得分的时机?如何加速TopK检索?三种思路 精准To…

广州数据中心机房服务器搬迁规划原则

数据中心机房搬迁,需要各个技术团队的紧密配合,制定详细周密的搬迁方案和实施流程,分批实施。作为华南地区主流的数据中心服务商,友力科技(广州)有限公司,专注数据中心机房服务器搬迁&#xff0…

[数据集][目标检测]蝗虫检测数据集VOC+YOLO格式1501张1类别

数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):1501 标注数量(xml文件个数):1501 标注数量(txt文件个数):1501 标注…

Python服务器和客户端功能库之websockets使用详解

概要 WebSockets 是一种在单个 TCP 连接上进行全双工通信的协议,特别适用于需要低延迟和高频率数据传输的实时应用,例如在线游戏、聊天应用和实时数据流。websockets 是一个基于 asyncio 的 Python 库,旨在提供简单易用的 WebSockets 服务器…