蓝桥杯STM32G431学习之外设GPIO(三)

本文详细介绍了STM32 GPIO的工作模式,包括输入模式(浮空输入、输入上拉、输入下拉、高阻态模拟输入)和输出模式(开漏通用输出、推挽通用输出、开漏复用功能输出、推挽复用功能输出)。并解析了与GPIO模式配置相关的寄存器,如MODER、OTYPER、OSPEEDR和PUPDR等,以及它们在不同模式下的设置。此外,还提及了其他寄存器如GPIOx_IDR、GPIOx_ODR、GPIOx_BSRR和GPIOx_LCKR的功能和使用。最后,提到了GPIO配置锁定以及复用功能寄存器的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

三、GPIO的工作模式以及寄存器配置 

1. GPIO工作模式

1.1 输入模式

(一) 浮空输入模式

(二) 输入上拉模式

(三) 输入下拉模式

(四) 高组态模拟输入模式

1.2 输出模式

(五) 开漏通用输出模式

(六) 推挽通用输出模式 

(七) 开漏复用功能输出模式

(八) 推挽复用功能输出模式

2. 工作模式下的寄存器配置

2.1 输入模式

(一) 浮空输入配置

(二) 输入上拉配置

(三) 输入下拉配置 

(四) 高组态模拟输入配置

2.2 输出模式 

(五) 开漏通用输出配置

(六) 推挽通用输出配置

(七) 开漏复用功能输出配置

(八) 推挽复用功能输出配置

3. 其他寄存器配置


//先了解下各英文缩写的意思:
R:Register 寄存器         
I:Input    输入           
O:Output   输出           
D:Data     数据

P:Pull 拉
U:Up   上
D:Down 下

B:Bit   位             
S:Set   置位           
R:Reset 复位            

C:Configuration 配置
L:Lock          锁

L:Low  低
H:High 高

MODE:模式
TYPE:类型
SPEED:速度

AF:Alternate function 复用功能

三、GPIO的工作模式以及寄存器配置 

每个GPIO都包括了11个寄存器来配置具体功能。每个引脚功能都是完全可以独立配置的,互不影响。

打开《STM32G4系列微控制器参考手册.pdf》,9.4节详细说明了GPIO的11个寄存器。

GPIOx_MODER    端口模式寄存器
GPIOx_OTYPER   端口输出类型寄存器
GPIOx_OSPEEDR  端口输出速度寄存器
GPIOx_PUPDR	   端口上拉/下拉寄存器
GPIOx_IDR	   端口输入数据寄存器
GPIOx_ODR	   端口输出数据寄存器
GPIOx_BSRR	   端口置位/复位寄存器
GPIOx_LCKR	   端口配置锁定寄存器
GPIOx_AFRL	   复用功能低位寄存器
GPIOx_AFRH	   复用功能高位寄存器
GPIOx_BRR	   端口位复位寄存器

GPIO有8种工作模式,如表1所示:

模式配置模式寄存器
MODER位[1:0]
输出类型寄存器
OTYPER位
输出速度寄存器
OSPEEDR位[1:0]
上拉/下拉寄存器
PUPDR位[1:0]

输入浮空(默认)00不使用不使用00
输入上拉0001
输入下拉0010
模拟输入1100

开漏通用输出01100 低速2MHz
01 中速25MHz
10 高速50MHz
11 超高速100MHz
00 无上下拉
01 上拉
10 下拉
11 保留
推挽通用输出010
开漏复用功能输出101
推挽复用功能输出100

表1 GPIO的8种工作模式

1. GPIO工作模式

1.1 输入模式

(一) 浮空输入模式

浮空:既不接电源,也不接地。

浮空输入模式下不使用上拉/下拉电阻。当外接设备有上拉或下拉电阻时,可以配置成浮空输入模式。

(二) 输入上拉模式

 输入上拉模式使用到了上拉电阻。

(三) 输入下拉模式

  输入下拉模式使用到了下拉电阻。

(四) 高组态模拟输入模式

同样不使用上拉/下拉电阻。

1.2 输出模式

在输出模式下TTL施密特触发器为开启状态,所以输出模式下仍存在输入

  • 通用:作普通IO使用,输出0、1。 
  • 复用: 

(五) 开漏通用输出模式

场效应管:

开漏_百度百科开漏电路概念中提到的“漏”就是指MOS FET的漏极。同理,开集电路中的“集”就是指三极管的集电极。开漏电路就是指以MOS FET的漏极为输出的电路。https://baike.baidu.com/item/%E5%BC%80%E6%BC%8F/10679231?fr=aladdin

“漏” 就是指MOS管的漏极Drain。开漏:开启漏极,就是指以MOS管的 漏极 为输出。    

开漏不使用 P-MOS ,故输出不为 “0” 或 “1”,而是 “0” 或 “浮空”。  

  • 写0传输到MOS管处,N-MOS 导通,输出为0;
  • 写1传输到MOS管处,P-MOS 和 N-MOS 都不导通,输出浮空。

开漏通用输出为不确定状态,不具有驱动能力。

(六) 推挽通用输出模式 

推挽使用 P-MOS 和 N-MOS ,输出为 “0” 或 “1(系统电压3.3V)”。  

推挽通用输出能够输出高电平(系统电压3.3V),具有一定的驱动能力, 可接简单外设(例如LED)。

(七) 开漏复用功能输出模式

(八) 推挽复用功能输出模式

2. 工作模式下的寄存器配置

2.1 输入模式

(一) 浮空输入配置

模式寄存器MODER位[1:0]=00 //00: Input mode输入模式
输出类型寄存器OTYPER位不使用
输出速度寄存器OSPEEDR位[1:0]不使用
上拉/下拉寄存器PUPDR位[1:0]=00 //00: No pull-up, pull-down无上拉,下拉

(二) 输入上拉配置

模式寄存器MODER位[1:0]=00 //00: Input mode输入模式
输出类型寄存器OTYPER位不使用
输出速度寄存器OSPEEDR位[1:0]不使用
上拉/下拉寄存器PUPDR位[1:0]=01 //01: Pull-up上拉

(三) 输入下拉配置 

模式寄存器MODER位[1:0]=00 //00: Input mode输入模式
输出类型寄存器OTYPER位不使用
输出速度寄存器OSPEEDR位[1:0]不使用
上拉/下拉寄存器PUPDR位[1:0]=10 //10: Pull-down下拉

(四) 高组态模拟输入配置

模式寄存器MODER位[1:0]=11 //11: Analog mode (reset state)模拟模式
输出类型寄存器OTYPER位不使用
输出速度寄存器OSPEEDR位[1:0]不使用
上拉/下拉寄存器PUPDR位[1:0]=00 //00: No pull-up, pull-down无上拉,下拉

2.2 输出模式 

(五) 开漏通用输出配置

模式寄存器MODER位[1:0]=01 //01: General purpose output mode通用输出模式
输出类型寄存器OTYPER位=1 //1: Output open-drain输出开漏
输出速度寄存器OSPEEDR位[1:0]=00~11 //00~11都可,四种速度依实际情况而定
上拉/下拉寄存器PUPDR位[1:0]=00~11 //00~11都可,一般情况下输出不加上/下拉电阻,即为00

(六) 推挽通用输出配置

模式寄存器MODER位[1:0]=01 //01: General purpose output mode通用输出模式
输出类型寄存器OTYPER位=0 //0: Output push-pull (reset state)输出推挽
输出速度寄存器OSPEEDR位[1:0]=00~11 //00~11都可,四种速度依实际情况而定
上拉/下拉寄存器PUPDR位[1:0]=00~11 //00~11都可,一般情况下输出不加上/下拉电阻,即为00

(七) 开漏复用功能输出配置

模式寄存器MODER位[1:0]=10 //10: Alternate function mode复用功能模式
输出类型寄存器OTYPER位=1 //1: Output open-drain输出开漏
输出速度寄存器OSPEEDR位[1:0]=00~11 //00~11都可,四种速度依实际情况而定
上拉/下拉寄存器PUPDR位[1:0]=00~11 //00~11都可,一般情况下输出不加上/下拉电阻,即为00

(八) 推挽复用功能输出配置

模式寄存器MODER位[1:0]=10 //10: Alternate function mode复用功能模式
输出类型寄存器OTYPER位=0 //0: Output push-pull (reset state)输出推挽
输出速度寄存器OSPEEDR位[1:0]=00~11 //00~11都可,四种速度依实际情况而定
上拉/下拉寄存器PUPDR位[1:0]=00~11 //00~11都可,一般情况下输出不加上/下拉电阻,即为00

3. 其他寄存器配置

上面说到了模式寄存器、输出类型寄存器、输出速度寄存器、上拉/下拉寄存器。另外还有7个寄存器,接下来逐个分析。

GPIOx_IDR	   端口输入数据寄存器

输入1则 ID[15:0] 就是1,输入0则 ID[15:0] 就是0。

GPIOx_ODR	   端口输出数据寄存器

GPIOx_ODR 中的内容来自 GPIOx_BSRR 。(映射)

输出1则 OD[15:0] 就是1,输出0则 OD[15:0] 就是0。

GPIOx_BSRR	   端口置位/复位寄存器

Bit 31:16  复位 BR[15:0]

  • 0:对相应的ODx位不执行任何操作
  • 1:复位相应的ODx位(0)

Bit 15: 0   置位 BS[15:0]

  • 0:对相应的ODx位不执行任何操作
  • 1:置位相应的ODx位(1)

注意:如果同时设置了BSx和BRx,则BSx具有优先级。

GPIOx_BSRR将内容映射到GPIOx_ODR中。

GPIOx_LCKR	     端口配置锁定寄存器

Bit 31:17,必须保持在重置值。
第16位LCKK:锁定钥匙。此位可随时读取。只能使用锁止键写入顺序对其进行修改。

  • 0:端口配置锁定密钥未激活
  • 1:端口配置锁定键激活。GPIOx_LCKR寄存器被锁定,直到下一个MCU复位或外围设备复位。

锁定键写入顺序:

  • WR LCKR[16]=“1”+LCKR[15:0]
  • WR LCKR[16]=“0”+LCKR[15:0]
  • WR LCKR[16]=“1”+LCKR[15:0]
  • RD LCKR
  • RD LCKR[16]=“1”(此读取操作是可选的,但它确认锁处于活动状态)

注意:

  • 在锁定键写入序列期间,LCK[15:0] 的值不得改变。
  • 锁定序列中的任何错误都会中止锁定。
  • 在端口任何位上的第一个锁序列之后,LCKK位上的任何读取访问返回 “1” ,直到下一次MCU重置或外围设备重置。

Bit 15:0 LCK[15:0]:端口x锁I/O引脚y(y=15到0)这些位是读/写的,但仅当LCKK位为 “0” 时才能写入。

  • 0:端口配置未锁定
  • 1:端口配置已锁定
GPIOx_AFRL	   复用功能低位寄存器
GPIOx_AFRH	   复用功能高位寄存器

以上两个寄存器可以回看关于GPIO知识的第一篇。 

蓝桥杯STM32G431学习之外设GPIO(一)_波桑~的博客-优快云博客一、STM32外设GPIOGPIO:General Purpose Input Output 通用用途输入输出核心功能:输入、输出和高级外设的复用功能。https://blog.youkuaiyun.com/weixin_46409367/article/details/120591759

GPIOx_BRR	   端口位复位寄存器

  • 0:对相应的ODx位不执行任何操作
  • 1:重置相应的ODx位

以上就是对GPIO工作模式的介绍以及相应工作模式下各个寄存器的配置。

STM32F103的GPIO也可通过查看参考手册来了解,学习方法都是相同的。

GPIO介绍完了,下一章就要开始用GPIO来操作外设了,比如控制LED。

### 蓝桥杯 STM32G431 PWM 配置与使用 在蓝桥杯竞赛中,STM32系列单片机的应用非常广泛。对于STM32G431芯片而言,其内置的定时器模块可以用于生成PWM信号。以下是关于如何配置和使用STM32G431中的PWM功能的相关说明。 #### 定时器的选择 STM32G431支持多个高级控制定时器(TIM),这些定时器可用于生成PWM波形。常见的选择包括TIM1、TIM2、TIM3等[^1]。具体使用的定时器取决于项目需求以及硬件计。 #### GPIO初始化 为了使能PWM输出,首先需要置相应的GPIO引脚模式为复用推挽输出。这可以通过HAL库函数`__HAL_RCC_GPIOA_CLK_ENABLE()`启用对应端口时钟,并调用`HAL_GPIO_Init()`完成引脚配置[^2]。 #### 定时器参数定 通过以下步骤来调整定时器的工作方式: 1. **预分频系数(PSC)** 和自动重装载值(ARR): 这两个寄存器决定了计数频率及时基周期长度。 ```c TIM->PSC =psc_value; // 置预分频值 TIM->ARR=arr_value ;// 定最大计数值 ``` 2. **捕获/比较寄存器(CCRx)**: 控制占空比大小, CCRx 的取值范围应小于等于 ARR 值. ```c TIM->CCR1=duty_cycle;//定义具体的占空比例 ``` 3. **模式选择**: 确保选择了向上计数模式并启用了相应通道上的PWM输出功能. #### 启动PWM 输出 最后一步就是启动定时器及其对应的中断服务程序或者DMA传输机制以维持持续性的脉宽调节操作: ```c HAL_TIM_PWM_Start(&htimX,TIM_CHANNEL_Y); ``` 以上即为基于STM32CubeMX工具链下利用标准外驱动实现基本PWM输出的主要流程概述[^3]. ```c #include "stm32g4xx_hal.h" void MX_TIM2_Init(void){ __HAL_RCC_TIM2_CLK_ENABLE(); htim2.Instance = TIM2; htim2.Init.Prescaler =99 ; htim2.Init.CounterMode = TIM_COUNTERMODE_UP; htim2.Init.Period =999 ; htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; if (HAL_TIM_PWM_Init(&htim2) != HAL_OK) { Error_Handler(); } } static void MX_GPIO_Init(void){ __HAL_RCC_GPIOA_CLK_ENABLE(); GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; GPIO_InitStruct.Alternate = GPIO_AF1_TIM2; HAL_GPIO_Init(GPIOA,&GPIO_InitStruct); } int main(){ MX_GPIO_Init(); MX_TIM2_Init(); HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_1); while (1){} } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不爱学习的刘.Sir

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值