GD32F130之GPIO

news/2024/11/15 8:19:41/

简介

最多可支持 55 个通用 I/O 引脚(GPIO),分别为 PA0 ~ PA15,PB0 ~ PB15,PC0 ~ PC15,
PD2,PF0,PF1,PF4 ~ PF7,各片上设备用其来实现逻辑输入/输出功能。

每个 GPIO 端口有相关的控制和配置寄存器以满足特定应用的需求。GPIO 端口和其他备用功能(AFs)的备用引脚,在特定的封装下获得最大的的灵活性。GPIO引脚通过配置相关的寄存器可以用作备用功能输入/输出引脚。

每个 GPIO 引脚可以由软件配置为输出(推挽或开漏)、输入、外设备用功能或者模拟模式。

每个 GPIO 引脚都可以配置为上拉、下拉或无上拉/下拉。除模拟模式外,所有的 GPIO 引脚都
具备大电流驱动能力。

电气特性

  • 电流驱动能力:25mA max
  • 内部拉电阻阻值:30~50KΩ,典型值40KΩ
  • 5V容忍:部分引脚支持,详见数据手册

主要配置流程

首先要使用GPIO_CTL寄存器来配置GPIO工作模式,有下面四种工作模式:

  • 通用数字输出模式:主要用于输出数字信号,输出高/低电平
  • 通用数字输入模式:用于读取外部电路输入的数字信号,读取高/低电平
  • 备用功能模式:例如USART的RX,定时器的PWM输出通道,定时器的输入捕获通道等
  • 模拟模式:ADC或者DAC功能的通道

然后,根据不同的工作模式,选着性地使用其他寄存器来进行剩余的配置。如下图所示。例如在通用数字输出模式下,可以使用OMODE来选择推挽或者开漏输出,使用OSPD来配置输出信号的最高频率,使用PUD来配置内部拉电阻。在通用数字输入模式下,只需要使用PUD配置拉电阻即可,OMODE和OSPD无需使用。

通用数字输出模式

当GPIO_CTL[1:0]=10时,配置GPIO为通用数字输出模式,此模式下,GPIO引脚可以输出高低电平信号来驱动外部电路。

在通用数字输出模式下,通过OMODE寄存器配置为推挽输出或者开漏输出两种不同的输出模式。通过OSPD寄存器来配置输出信号的速度,这个速度指的是引脚高低电平翻转的最高频率。通过PUD寄存器来配置内部的上下拉电阻。

推挽输出

使用GPIO_OCTL寄存器的一个单独的位来锁存输出控制信号,控制对应的GPIO输出高或者低电平。当GPIO_OCTL位=1时,输出驱动中的PMOS导通,NMOS截止,使得引脚与内部Vdd连接,用于输出高电平;当GPIO_OCTL位=0时,输出驱动中的PMOS截止,NMOS导通,使得引脚与内部Vss连接,用于输出低电平。

程序可以直接写GPIO_OCTL来改变引脚上输出的信号,但是GPIO_BOP和GPIO_BC寄存器有更高的访问效率,通过写BOP和BC寄存器可以间接控制GPIO_OCTL的值,所以一般使用GPIO_BOP和GPIO_BC寄存器来设置引脚输出电平。

推挽输出模式时,输入驱动电路也是工作的,可以读取GPIO_ISTAT寄存器来获取引脚上的电平。虽然这样做几乎没什么意义。

开漏输出

和推挽输出一样,开漏输出同样使用GPIO_OCTL寄存器的一个单独的位来锁存输出控制信号,可以通过GPIO_BOP和GPIO_BC寄存器来简介控制GPIO_OCTL寄存器的值。但是当GPIO_OCTL位=1时,PMOS和NMOS都是截止的,使得引脚与内部输出驱动电路处于“断路”状态,引脚输出高阻态,没有驱动能力;当GPIO_OCTL位=0时,输出驱动中的PMOS截止,NMOS导通,使得引脚与内部Vss连接,可以正常输出低电平。

开漏输出时一般都会使用上拉电阻(内部的或者外部的),此时GPIO是一个双向IO,既可以输出高低电平(高电平由上拉电阻提供),也可以通过读取GPIO_ISTAT寄存器来获取引脚上的输入的信号。

通用数字输入模式

当CTL[1:0]=00时,配置GPIO为通用数字输入模式,此模式下,GPIO引脚作为输入来采集外部电路的电平信号供CPU读取。

通用数字输入模式下,输出驱动电路被禁用,只有输入电路是有效的。在AHB时钟驱动下对引脚上的电平信号进行采样:每来一个AHB时钟周期,就对引脚上的电平进行捕获一次,并解释为逻辑1或者逻辑0,存储在ISTAT寄存器对应位中,对ISTAT寄存器的对应位的读取,就可以反映出引脚上输入的电平信号。

通用数字输入模式时,一般会使用上拉/下拉电阻,避免浮空输入产生噪声干扰。可以使用PUD来启用内部上拉或者下拉电阻。

备用功能模式

当CTL[1:0]=10时,配置GPIO为备用功能模式。备用功能模式(AFIO,Alternate Function IO)又叫复用功能模式。单片机内部的一些外设(如UART,I2C,SPI,定时器等)需要借助IO口来和外部电路实现信号的输入/输出,此时IO的输入和输出都由内部外设接管控制,而非CPU,这便是引脚的备用功能。一个GPIO可以支持多个备用功能,但是任何时刻都只能使用其中一个。

那么一个引脚有多少备用功能?每个备用功能分别是什么?这些都可以通过查阅数据手册的:《GD32F130xx pin alternate functions》来知晓。下面表格是摘选:

引脚名AF0(备用功能0)AF1(备用功能1)AF2(备用功能2)...
PB6USART0_TXI2C0_SCLTIMER15_CH0_ON...
PB7USART0_RXI2C0_SDATIMER16_CH0_ON...
PB8/I2C0_SCLTIMER15_CH0...

在备用功能模式下,需要通过AFSEL0或AFSEL1寄存器来选择需要的备用功能。例如需要将PB6配置为USART0的TX引脚,通过上表格我们知道PB6的AF0是USART0的TX备用功能,则要配置AFSEL0[3:0]=0000来选择第0个备用功能即可。

输出作用的AFIO

在输出AFIO的备用功能模式下,输出驱动电路不再受GPIO_OCTL寄存器控制,而是受备用功能对应的片内外设控制,例如对于配置成USART的TX引脚,它输出的信号受USART的发送电路控制。

此时还可以通过OMODE寄存器配置为推挽输出或者开漏输出两种不同的输出模式。通过OSPD寄存器来配置输出信号的速度。通过PUD寄存器来配置内部的上下拉电阻。

输入作用的AFIO

在输入AFIO的备用功能模式下,引脚上输入的信号被采样后,输入到了备用功能对应的外设,例如对于配置成USART的RX引脚,它采集的信号输入到了USART的接收电路。同时也可以像普通数字输入IO那样,通过读取ISTAT来获取输入信号,虽然这样做很少有意义。

此时还可以通过PUD寄存器来配置内部的上下拉电阻。OMODE寄存器和OSPD寄存器无需使用。

模拟模式

当需要将引脚作为为ADC或者DAC的通道时,要将GPIO配置为模拟模式。

当GPIO_CTL[1:0]=11时,配置GPIO为模拟模式,此模式下时,输出驱动电路和输入驱动电路都被禁用,相当于ADC或者DAC电路直接与引脚相连。

一些例子

例子1:使用PB13的通用推挽输出来驱动LED,输出高电平时LED点亮。

//配置PB13的模式为通用数字输出模式,且不启用内部拉电阻
gpio_mode_set(GPIOB, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO_PIN_13); //配置PB13为推挽输出模式,速度为10MHz
gpio_output_options_set(GPIOB, GPIO_OTYPE_PP, GPIO_OSPEED_10MHZ, GPIO_PIN_13); //PB13输出高电平,点亮LED
gpio_bit_set(GPIOB,GPIO_PIN_13);//PB13输出低电平,熄灭LED
gpio_bit_reset(GPIOB,GPIO_PIN_13);//==========================【用宏封装】=============================
#define LED13_ON    gpio_bit_set(GPIOC,GPIO_PIN_13)
#define LED13_OFF   gpio_bit_reset(GPIOC,GPIO_PIN_13)
#define LED13_TOG   \
do{                 \
if(gpio_output_bit_get(GPIOC,GPIO_PIN_13)) \gpio_bit_reset(GPIOC,GPIO_PIN_13);     \
else                                       \gpio_bit_set(GPIOC,GPIO_PIN_13);       \
}while(0)

例子2:使用PB13的通用数字输入模式来读取按键,PB13启用内部上拉电阻,按键一端接PB13,另一端接GND。按键按下时,PB13输入低电平;按键松开时,PB13输入高电平。

//配置PB13的模式为通用数字输入模式,启用内部上拉电阻
gpio_mode_set(GPIOB, GPIO_MODE_INPUT, GPIO_PUPD_PULLUP, GPIO_PIN_13); //如果读取到PB13为低电平
if(RESET == gpio_input_bit_get(GPIOB,GPIO_PIN_13))
{//...按键处理逻辑
}

例子3:PA9为USART0的TX引脚,配置为备用功能1。PA10为USART0的RX引脚,配置为复用功1。

//PA9-USART0-TX
gpio_af_set(GPIOA, GPIO_AF_1, GPIO_PIN_9);  //选择备用功能1
gpio_mode_set(GPIOA, GPIO_MODE_AF, GPIO_PUPD_PULLUP, GPIO_PIN_9 ); 
gpio_output_options_set(GPIOA,GPIO_OTYPE_PP, GPIO_OSPEED_10MHZ, GPIO_PIN_9);//PA10-USART0-RX
gpio_af_set(GPIOA, GPIO_AF_1, GPIO_PIN_10);  //选择备用功能1
gpio_mode_set(GPIOA, GPIO_MODE_AF, GPIO_PUPD_PULLUP, GPIO_PIN_10 );  

例子4:配置PB0为ADC通道

//模拟模式
gpio_mode_set(GPIOB, GPIO_MODE_ANALOG, GPIO_PUPD_NONE, GPIO_PIN_0);


http://www.ppmy.cn/news/129405.html

相关文章

GPT2Config

作用: 这是用于存储 transformers.GPT2Model 或 transformers.TFGPT2Model 的配置的配置类。它用于根据指定的参数实例化 GPT-2 模型,定义模型架构。使用默认值实例化配置将产生与 GPT-2 small 架构类似的配置。 参数: vocab_size (:obj:i…

gp表压缩

gp数据表分为 堆表 和 apend only表。 默认为堆表。 Apend only表可以进行表压缩。 压缩可以减少磁盘空间,但是数据压缩,解压过程会消耗cpu。 压缩表会增加数据库对象数。 (1)数据表压缩的设计规范 频繁更新的表不可以使用。 表…

28388_USB

1. 如何找到libusb源码 仅供参考 找到该路径:C:\ti\c2000\C2000Ware_3_03_00_00\libraries\communications\usb\f2838x\source 2. C2000_Ware中的usb_ex4_dev_bulk例程 例程中代码开头有介绍一个调试上位机软件,如图所示: 3. 使用LIBUS…

飞腾FT2000-4 GPIO设置方法

/sys/class/gpio/gpiochip488 gpio488-gpio495对应gpio0 A0-A7 /sys/class/gpio/gpiochip496 gpio496-gpio503对应gpio0 B0-B7 /sys/class/gpio/gpiochip504 gpio504-gpio511对应gpio1 A0-A7 /sys/class/gpio/gpiochip512 gpio512-gpio519对应gpio1 B0-B7 GPIO0对应寄存器地址0…

3328固件安装

3328固件分为rk固件和官方固件。 Screenshot from 2023-03-13 22-30-02 这里使用官方固件刷机,Ubuntu18.04下载地址:https://pan.baidu.com/s/1jFe0w7H0f647ZtFocIqnew#list/path%2F 提取码:scvg 有两个子文件夹&#…

F28335 GPIO的配置————DSP TMS320F28335 学习笔记 (三)

1 GPIO工作原理 外界二进制信息(数字量)要被CPU处理,要给存储器存放,就需要外界信息源与两者之间的交换接口,这样的交换接口若用来进行通用目的数字量的输入输出,就被称为通用数字量输入/输出接口&#xff…

GD32系列

GD32407V-START开发板 1. 开发版实物图 图1 开发版实物图 表1 序号对应的名称与功能 序号名称与功能1高速USB2全速USB324MHz晶振供给U8使用是USB3300的专用晶振4BOOT启动模式切换开关5用户按键接PA0脚6复位按键7USB3300芯片8引脚排针9工程师的代价10GD32F407VK主芯片11引脚排针…

TMS320F28335的GPIO

TMS320F28335的GPIO F28335有三种32位的I/O口,依次PORTA(GPIO0-GPIO31), PORTB(GPIO32-GPIO63), PORTC(GPIO64-GPIO87),这些口都可以配置为普通的数字IO口同样也能被配置为外部接口。这样涉及到了IO的寄存器,IO口共有三类寄存器…