STM32的GPIO(通用输入输出)有什么用?
STM32的GPIO(通用输入/输出)支持多种工作模式,每种模式都有其特定的应用场景。下面将详细讲解STM32 GPIO的几种主要工作模式及其运行方式:
模拟输入 (GPIO_Mode_AIN): 在此模式下,GPIO引脚关闭了TTL肖特基触发器,不接上、下拉电阻,经由另一线路把电压信号传送到片上外设模块,如传送至ADC模块,由ADC采集电压信号。使用ADC外设时,必须设置为模拟输入模式。浮空输入 (GPIO_Mode_IN_FLOATING): 配置成此模式时,芯片内部既没有接上拉,也没有接下拉电阻,经由TTL肖特基触发器输入。由于其输入阻抗较大,一般把这种模式用于标准的通信协议如I2C、USART的接收端。下拉输入 (GPIO_Mode_IPD): 在此模式下,I/O端口的电平信号通过TTL肖特基触发器后,进入输入数据寄存器。在I/O端口悬空(无信号输入)的情况下,输入端的电平可以保持在低电平;并且在I/O端口输入为高电平时,输入端的电平则为高电平。上拉输入 (GPIO_Mode_IPU): 在此模式下,I/O端口的电平信号通过TTL肖特基触发器后,进入输入数据寄存器。但是在I/O端口悬空(无信号输入)的情况下,输入端的电平可以保持在高电平;并且在I/O端口输入为低电平时,输入端的电平则为低电平。开漏输出 (GPIO_Mode_Out_OD): 在此模式下,上方的P-MOS管完全不工作。控制输出为0(低电平)时,N-MOS管导通,使输出接地。控制输出为1(高电平)时,P-MOS管和N-MOS管都关闭,所以引脚既不输出高电平,也不输出低电平,为高阻态。正常使用时必须外部接上拉电阻。推挽输出 (GPIO_Mode_Out_PP): 在此模式下,输入高电平时,上方的P-MOS导通,下方的N-MOS关闭,对外输出高电平;而输入低电平时,N-MOS管导通,P-MOS关闭,对外输出低电平。推挽输出的低电平为0V,高电平为3.3V。复用开漏输出 (GPIO_Mode_AF_OD): 类似于开漏输出模式,但输出的高低电平的来源不是CPU直接写输出数据寄存器,而是利用片上外设模块的复用功能输出来决定的。复用推挽输出 (GPIO_Mode_AF_PP): 类似于推挽输出模式,但输出的高低电平的来源不是CPU直接写输出数据寄存器,而是利用片上外设模块的复用功能输出来决定的。AT32F403A407407A 通用输入输出GPIO配置介绍
一、简介
二、功能描述
1.GPIO结构
2.GPIO 复位状态
2.通用功能输入配置
3.模拟 输入/ 输出
4.通用功能输出配置
5.I/O 端口 保护
三、GPIO寄存器
1. GPIO 配置 低寄存器 (GPIOx_CFGLR )(x=A..E )
2. GPIO 配置高寄存器 (GPIOx_CFGHR )(A..E )
3. GPIO 输入数据寄存器 (GPIOx_IDT )(x=A..E )
4. GPIO 输出数据寄存器 (GPIOx_ODT )(x=A..E)
5. GPIO 设置/ 清除寄存器 (GPIOx_SCR )(x=A..E )
6. GPIO 清除寄存器 (GPIOx_CLR )(x=A..E )
7. GPIO 写保护 寄存器 (GPIOx_WPR )(x=A..E)
8. GPIO 极大电流推动/ 吸入能力 切换控制寄存器(GPIOx_HDRV )(x=A..E )
四、GPIO编程实例
1. 按键输入GPIO配置
2. LED灯输出配置
3. 模拟量输入配置
一、简介
AT32F403A/407/407A 支持多达 80 个双向 I/O 管脚,这些管脚分为 5 组,分别为 PA、PB、PC、PD 和
PE,每组最多包含 16 个管脚,每个管脚都可以实现与外部的通讯、控制以及数据采集的功能。
每个管脚都支持通用功能输入输出(GPIO)或复用功能输入输出(IOMUX)。本章节详细介绍 GPIO 功
能,IOMUX 功能详见复用功能输入输出章节。
每个管脚都可以软件配置成浮空输入、上拉/下拉输入、模拟输入/输出、通用推挽/开漏输出、复用推挽/开
漏输出。
每个管脚都可以软件配置输出驱动能力以及输出信号斜率。
每个管脚都可以配置为外部中断输入。
每个管脚都支持配置锁定功能。
二、功能描述
1.GPIO结构
``
每个管脚可以由软件配置成四种输入模式(输入浮空、输入上拉、输入下拉、模拟输入)和四种输出模式
(开漏输出、推挽式输出、推挽式复用、开漏复用)。
每个 I/O 端口对应的寄存器不允许半字或字节访问,必须按 32 位字被访问,每个 I/O 端口位可以自由编
程。
下图给出了一个 I/O 端口位的基本结构。
2.GPIO 复位状态
系统上电或复位后,所有管脚除了 JATG 相关管脚以外,都被配置为浮空输入模式,JTAG 相关管脚则配
置为:PA15/JTDI 、PA13/JTMS 和 PB4/JNTRST 为输入上拉模式,PA14/JTCK 为输入下拉模式,
PB3/TDO 为浮空输入模式。
2.通用功能输入配置
当管脚配置为输入时:
管脚状态可通过对输入数据寄存器的读访问得到
可配置管脚为浮空输入、上拉输入或下拉输入
施密特触发器有效
不能对该管脚进行输出。
注意: 如果是浮空输入模式,为避免复杂环境下,没有使用的管脚有干扰,导致漏电,建
议,如管脚不使用,则配置为模拟输入模式。
3.模拟 输入/ 输出
当 GPIO 端口被配置为模拟输入配置时:
施密特触发无效
不能对该管脚进行数字输入输出
对应的管脚,无任何上拉/下拉电阻。
4.通用功能输出配置
当 GPIO 端口被配置为输出时:
施密特触发器有效
可通过输出寄存器让对应管脚输出
上拉和下拉电阻不能被使用
在开漏模式时,可强输出 0,可用上拉电阻输出 1。
在推挽模式时,可通过输出寄存器输出数字 0/1。
CONF = 10 或 11 时,为复用输出,详情请参考 IOMUX 章节
5.I/O 端口 保护
为了防止误操作导致 GPIO 功能混乱,提供每个对应管脚的的锁定机制。一旦锁定,在下次复位或者上电
之前都不能进行对应管脚的 GPIO 配置。
三、GPIO寄存器
下面列出了 GPIO 寄存器映射和复位数值。
必须以字(32 位)的方式操作这些外设寄存器。
表 6-1 GPIO寄存器地址映射和复位值
1. GPIO 配置 低寄存器 (GPIOx_CFGLR )(x=A…E )
注意:有些端口寄存器复位值不同,比如 PA 有些管脚默认是 JTAG/SWD 有上拉输入管脚。
2. GPIO 配置高寄存器 (GPIOx_CFGHR )(A…E )
注意:有些端口寄存器复位值不同,比如 PB 有些管脚默认是 JTAG/SWD 有上拉输入管脚
3. GPIO 输入数据寄存器 (GPIOx_IDT )(x=A…E )
4. GPIO 输出数据寄存器 (GPIOx_ODT )(x=A…E)
5. GPIO 设置/ 清除寄存器 (GPIOx_SCR )(x=A…E )
6. GPIO 清除寄存器 (GPIOx_CLR )(x=A…E )
7. GPIO 写保护 寄存器 (GPIOx_WPR )(x=A…E)
8. GPIO 极大电流推动/ 吸入能力 切换控制寄存器(GPIOx_HDRV )(x=A…E )
四、GPIO编程实例
以最新的AT32F403A_407_Firmware_Library-v2.0.9库为例
1. 按键输入GPIO配置
头文件宏定义
/******************* define button *******************/
typedef enum
{
USER_BUTTON = 0,
NO_BUTTON = 1
} button_type;
#define USER_BUTTON_PIN GPIO_PINS_0
#define USER_BUTTON_PORT GPIOA
#define USER_BUTTON_CRM_CLK CRM_GPIOA_PERIPH_CLOCK
源文件程序按键输入配置
/**
* @brief configure button gpio
* @param button: specifies the button to be configured.
* @retval none
*/
void at32_button_init(void)
{
gpio_init_type gpio_init_struct;
/* enable the button clock */
crm_periph_clock_enable(USER_BUTTON_CRM_CLK, TRUE);
/* set default parameter */
gpio_default_para_init(&gpio_init_struct);
/* configure button pin as input with pull-up/pull-down */
gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
gpio_init_struct.gpio_out_type = GPIO_OUTPUT_PUSH_PULL;
gpio_init_struct.gpio_mode = GPIO_MODE_INPUT;
gpio_init_struct.gpio_pins = USER_BUTTON_PIN;
gpio_init_struct.gpio_pull = GPIO_PULL_DOWN;
gpio_init(USER_BUTTON_PORT, &gpio_init_struct);
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
2. LED灯输出配置
头文件定义:
/******************** define led ********************/
typedef enum
{
LED2 = 0,
LED3 = 1,
LED4 = 2
} led_type;
#define LED_NUM 3
#if defined (AT_START_F403A_V1) || defined (AT_START_F407_V1)
#define LED2_PIN GPIO_PINS_13
#define LED2_GPIO GPIOD
#define LED2_GPIO_CRM_CLK CRM_GPIOD_PERIPH_CLOCK
#define LED3_PIN GPIO_PINS_14
#define LED3_GPIO GPIOD
#define LED3_GPIO_CRM_CLK CRM_GPIOD_PERIPH_CLOCK
#define LED4_PIN GPIO_PINS_15
#define LED4_GPIO GPIOD
#define LED4_GPIO_CRM_CLK CRM_GPIOD_PERIPH_CLOCK
#endif
源文件程序LED初始化配置
/**
* @brief configure led gpio
* @param led: specifies the led to be configured.
* @retval none
*/
void at32_led_init(led_type led)
{
gpio_init_type gpio_init_struct;
/* enable the led clock */
crm_periph_clock_enable(led_gpio_crm_clk[led], TRUE);
/* set default parameter */
gpio_default_para_init(&gpio_init_struct);
/* configure the led gpio */
gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
gpio_init_struct.gpio_out_type = GPIO_OUTPUT_PUSH_PULL;
gpio_init_struct.gpio_mode = GPIO_MODE_OUTPUT;
gpio_init_struct.gpio_pins = led_gpio_pin[led];
gpio_init_struct.gpio_pull = GPIO_PULL_NONE;
gpio_init(led_gpio_port[led], &gpio_init_struct);
}
3. 模拟量输入配置
/**
* @brief gpio configuration.
* @param none
* @retval none
*/
static void adc_gpio_config(void)
{
gpio_init_type gpio_initstructure;
crm_periph_clock_enable(CRM_GPIOA_PERIPH_CLOCK, TRUE);
crm_periph_clock_enable(CRM_GPIOB_PERIPH_CLOCK, TRUE);
gpio_default_para_init(&gpio_initstructure);
gpio_initstructure.gpio_mode = GPIO_MODE_ANALOG;
gpio_initstructure.gpio_pins = GPIO_PINS_4 | GPIO_PINS_5 | GPIO_PINS_6 | GPIO_PINS_7;
gpio_init(GPIOA, &gpio_initstructure);
gpio_initstructure.gpio_mode = GPIO_MODE_ANALOG;
gpio_initstructure.gpio_pins = GPIO_PINS_0 | GPIO_PINS_1;
gpio_init(GPIOB, &gpio_
initstructure);
}
相关问答
用 GPIO模拟 IIC总线?IIC总线只有两条线(SCL和SDA),IIC协议其实就是这两条线上的数据传输的时序规定。主控制芯片通过向IO口(已经与从芯片的IIC端口SCL和SDA连接)按从芯片提供的...
gpio 四种输出模式?STM32的四种输入方式:1、上拉输入(GPIO_Mode_IPU)上拉输入就是信号进入芯片后加了一个上拉电阻,再经过施密特触发器转换成0、1信号,读取此时的引脚电平为...
同一组 GPIO 可以部分设置成开漏输出部分设置成推挽输出吗?单片机的GPIO基本上都可以单独设置输入输出输入输出是单片机GPIO最基本的功能,输出一般可以设置为开漏输出和上拉输出,而输入一般可以设置为上拉输入、下拉输...
gpio 特点?GPIO(GeneralPurposeInput/Output)即通用输入输出端口,以下简称GPIO。GPIO可提供输入、输出或中断三类功能,是嵌入式领域最常见,最基础的输入输出设备。...
gpio 传输方式?GPIO支持4种输入模式(浮空输入、上拉输入、下拉输入、模拟输入)和4种输出模式(开漏输出、开漏复用输出、推挽输出、推挽复用输出)。GPIO支持4种输入模式(浮空...
在嵌入式开发中,怎么开发SPI IIC的驱动程序?IIC可以使用普通GPIO口模...因为每次I2C控制器都会给出一个“标志”,那么就会被“case”……具体如下图所示。看不清可以搜索:http://www.eechina.com/threa...
rtc gpio 是什么?RTCGPIO一共有18个IO口,这些GPIO管脚具有低功耗RTC性能和模拟功能,并且由ESP32的RTC子系统控制。这些功能不使用IO_MUX和GPIO交换矩阵...
两款芯片硬件都支持SPI通信,如何实现两芯片之间的数据通信啊...占用单片机的三个GPIO口。三总线SPI的接口连接方式如下图所示。四总线SPI四总...3)CAN通讯,由UART和42675电平转换芯片实现。另外,该接口也可以和蓝牙模块、W...
esp-12引脚功能?ESP-12是一款基于ESP8266芯片的Wi-Fi模块,其引脚功能如下:1.VCC:电源输入,电压范围为3.3V-3.6V。2.GND:接地。3.RST:复位引脚,用于对模块进行复位。....
gd32 引脚对应功能?GD32微控制器的引脚功能取决于具体的芯片型号。以下是一些GD32芯片常用的引脚功能对应关系:1.GPIO引脚:通用输入输出引脚,可配置为输入或输出。2.USART引脚...