gpio(通用输入输出接口)1 gpio 功能概述gpio 是通用输入/输出(general purpose i/o)的简称,主要用于工业现场需要用到数字量输入/输出的场合,例如:
输出功能 :继电器、 led、蜂鸣器等的控制输入功能 :传感器状态、高低电平等信息的读取复用功能 :片内外设的对外接口时序模拟 :模拟 spi、i2c 和 uart 等常用接口的时序2 stm32 的 gpio 特性多种工作模式:输出/输入/复用/模拟灵活的复用模式5v 电压容限外部中断功能3 端口和引脚端口(port): 独立的外设子模块,包括多个引脚,通过多个硬件寄存器控制引脚。gpio 模块由端口 gpioa、gpiob、gpioc 等多个独立的子模块构成。
例如:端口 gpioa 包括 pa0 ~ pa15 这 16 个引脚,通过 10 个硬件寄存器控制引脚工作。
引脚(pin): 对应微控制器的一个管脚,归属于端口,由端口寄存器的对应位控制。pa0,属于端口 gpioa,输出电平由端口 gpioa 的输出数据寄存器 gpioa_odr 的第 0 位决定。
4 gpio 电路
5 gpio 工作模式输入模式:浮空输入/上拉输入/下拉输入 浮空输入:按键识别上拉输入:io 内部上拉电阻输入下拉输入:io 内部下拉电阻输入输出模式:推挽输出/开漏输出推挽输出时,p-mos 管和 nmos 管轮流工作,可以输出高电平或低电平。主要用于连接数字器件,如指示灯和继电器等模块;开漏输出时,p-mos 管关闭,只有 n-mos 管工作,此时只能输出低电平。要输出高电平必须外加上拉电阻,主要用于 i2c 总线。模拟模式模拟状态:表示引脚功能选择为模拟模式,但不作为任何片内模拟外设的复用脚,只是为了减少系统功耗。模拟外设复用引脚:表示引脚作为片内模拟外设(a/d 转换模块、d/a 转换模块、模拟比较器等)的复用脚,用于完成相应的功能操作。复用模式
在 cubemx 软件的引脚分配图中点击引脚即可弹出引脚的复用功能复用推挽:片内外设功能(urat 的 tx,rx,spi 的 mosi,miso,sck,ss );复用开漏:片内外设功能( i2c 的 scl,sda )。6 基于 hal 库控制 gpio6.1 gpio 外设的数据类型引脚初始化: 采用结构体类型实现,用于定义引脚的序号、工作模式、输出速度等基本特性。引脚电平状态: 采用枚举类型实现,用于定义引脚的电平状态:高电平和低电平。引脚所属端口: 采用结构体指针实现,用于访问该端口所对应的寄存器组。引脚初始化数据类型
成员变量 pin 的取值范围:gpio_pin_0 ~ gpio_pin15
成员变量 pin 的取值范围:
gpio_mode_input浮空输入模式
gpio_mode_output_pp 推挽输出模式
gpio_mode_output_od 开漏输出模式
gpio_mode_af_pp 复用功能下的推挽模式
gpio_mode_af_od 复用功能下的开漏模式
gpio_mode_analog 模拟模式
成员变量 pull 的取值范围:
gpio_nopull没有上拉或下拉电阻激活
gpio_pullup 上拉电阻激活
gpio_pulldown 下拉电阻激活
成员变量 speed 的取值范围:
gpio_speed_freq_low引脚输出速度 2mhz
gpio_speed_freq_medium 引脚输出速度 12.5mhz ~ 50mhz
gpio_speed_freq_high 引脚输出速度 25mhz ~ 100mhz
gpio_speed_freq_very_high 引脚输出速度 50mhz ~ 200mhz
成员变量 alternate 的取值范围
alternate 表示引脚的复用功能;由于不同型号的 stm32 微控制器片内集成的外设不同,因此该成员变量的取值范围由芯片型号决定。以 stm32f1 系列芯片为例,通过查阅stm32f1xx_hal_gpio_ex.h文件可以了解 alternate 的取值范围;该成员变量的取值一般通过 cubemx 软件分配,不需要用户手动设置;引脚电平状态数据类型
端口数据类型:指向端口寄存器组的结构体指针gpioa,gpiob,gpioc…
不同型号的 stm32 微控制器的端口数量各不相同;端口数据类型的定义是在以芯片型号命名的.h 文件中.6.2 使用 hal 库的引脚初始化步骤定义变量: 利用引脚初始化结构体类型gpio_inittypedef 定义一个结构体变量。设置模式: 按照引脚的工作模式,依次对该结构体的成员变量赋值,如 pin、mode、pull 等。调用函数: 调用初始化函数hal_gpio_init将配置参数写入到对应的寄存器,入口参数为端口号和结构体变量。6.3 gpio 外设接口函数的概述引脚初始化函数:hal_gpio_init
函数原型复位引脚到初始状态
功能描述 引脚初始化
入口参数 1 gpiox:引脚端口号,取值范围是 gpioa ~ gpiok
入口参数 2 gpio_init:指向引脚初始化类型 gpio_inittypedef 的结构体指针,该结构体包含指定引脚的配置参数
返回值 无
注意事项 该函数可以由 cubemx 软件自动生成
引脚复位函数:hal_gpio_deinit
函数原型void hal_gpio_deinit (gpio_typedef * gpiox, uint32_t gpio_pin)
功能描述 复位引脚到初始状态
入口参数 1 gpiox:引脚端口号,取值范围是 gpioa ~ gpiok
入口参数 2 gpio_init:指向引脚初始化类型 gpio_inittypedef 的结构体指针,该结构体包含指定引脚的配置参数
返回值 无
注意事项 该函数需要用户调用
读取引脚函数:hal_gpio_readpin
函数原型gpio_pinstate hal_gpio_readpin ( gpio_typedef * gpiox, uint16_t gpio_pin )
功能描述 读取引脚的电平状态
入口参数 1 gpiox:引脚端口号,取值范围是 gpioa ~ gpiok
入口参数 2 gpio_init:指向引脚初始化类型 gpio_inittypedef 的结构体指针,该结构体包含指定引脚的配置参数
返回值 gpio_pinstate:表示引脚电平状态的枚举类型变量,可以是gpio_pin_set 或 gpio_pin_reset
注意事项 该函数需要用户调用
写入引脚函数:hal_gpio_writepin
函数原型void hal_gpio_writepin( gpio_typedef * gpiox, uint16_t gpio_pin, gpio_pinstate pinstate )
功能描述 设置引脚输出高/低电平
入口参数 1 gpiox:引脚端口号,取值范围是 gpioa ~ gpiok
入口参数 2 gpio_init:指向引脚初始化类型 gpio_inittypedef 的结构体指针,该结构体包含指定引脚的配置参数
返回值 gpio_pinstate:表示引脚电平状态的枚举类型变量,可以是 gpio_pin_set 或 gpio_pin_reset
注意事项 该函数需要用户调用
翻转引脚函数:hal_gpio_togglepin
函数原型void hal_gpio_togglepin (gpio_typedef * gpiox, uint16_t gpio_pin)
功能描述 翻转引脚状态
入口参数 1 gpiox:引脚端口号,取值范围是 gpioa ~ gpiok
入口参数 2 gpio_init:指向引脚初始化类型 gpio_inittypedef 的结构体指针,该结构体包含指定引脚的配置参数
返回值 无
注意事项 该函数需要用户调用
任务实践基于stm32f103c8t6,开发板原理图
采用查询方式检测按键key1状态,按键按下后执行操作:翻转指示灯 led1 的状态。
注:本任务例程使用的开发板,led1与stm32的pa1相连接,key1与pa0相连接。key1原理图如下:
使用按键时,需要设置pa0为输入上拉模式,这样在key1没有按下时,pa0可以读取到高电平,key1按下时pa0可以读取到低电平。
按键消抖:
通常的按键所用开关为机械弹性开关,当机械触点断开、闭合时,由于机械触点的弹性作用,一个按键开关在闭合时不会马上稳定地接通,在断开时也不会一下子断开。因而在闭合及断开的瞬间均伴随有一连串的抖动,为了不产生这种现象而作的措施就是按键消抖。
抖动时间的长短由按键的机械特性决定,一般为5ms~10ms。按键稳定闭合时间的长短则是由操作人员的按键动作决定的,一般为零点几秒至数秒。为确保cpu对键的一次闭合仅作一次处理,必须去除键抖动。在键闭合稳定时读取键的状态,并且必须判别到键释放稳定后再作处理。
下图为按键按下时,电压波形的变化。
前沿抖动 5 ~ 10ms,后沿抖动 5 ~ 10ms按键的抖动会导致一次按键动作被当成多次按键,为确保 mcu 对按键的一次闭合仅作一次处理,必须消除按键的抖动,在按键处于稳定状态时读取按键的状态。硬件消抖:利用 rc 低通滤波器滤掉抖动
软件消抖: 检测出按键闭合后执行延时程序,延时时间为 5ms ~ 10ms,用于去掉前沿抖动;再次检测按键状态,如果保持闭合状态,才认为按下,并执行相应的按键任务;按键的释放可以采用延时或者循环检测的方式去掉后沿抖动。配置 pa0 为 gpio_input,pa1 为 gpio_output
pa1 保持默认 gpio 输出模式即可
pa0 配置为输入模式,上拉
以上步骤生成如下代码:
stm32f1xx_hal_gpio.c中生成 gpio 引脚初始化函数mx_gpio_init,并在 main.c 中调用
开启外设时钟 rcc配置 pa0,pa1 两个引脚结构void mx_gpio_init(void){ gpio_inittypedef gpio_initstruct = {0}; /* gpio ports clock enable */ __hal_rcc_gpioa_clk_enable(); __hal_rcc_gpiob_clk_enable(); /*configure gpio pin output level */ hal_gpio_writepin(gpioa, gpio_pin_1, gpio_pin_reset); /*configure gpio pin : pa0 */ gpio_initstruct.pin = gpio_pin_0; gpio_initstruct.mode = gpio_mode_input; gpio_initstruct.pull = gpio_pullup; hal_gpio_init(gpioa, &gpio_initstruct); /*configure gpio pin : pa1 */ gpio_initstruct.pin = gpio_pin_1; gpio_initstruct.mode = gpio_mode_output_pp; gpio_initstruct.pull = gpio_nopull; gpio_initstruct.speed = gpio_speed_freq_low; hal_gpio_init(gpioa, &gpio_initstruct);}编写程序在main.c中编写程序
/* user code begin 3 */ if (hal_gpio_readpin(gpioa, gpio_pin_0) == gpio_pin_reset) { hal_delay(10); if (hal_gpio_readpin(gpioa, gpio_pin_0) == gpio_pin_reset) { hal_gpio_togglepin(gpioa, gpio_pin_1); } while (hal_gpio_readpin(gpioa, gpio_pin_0) == gpio_pin_reset); } } /* user code end 3 */
华为任正非表示不会把知识产权武器化来抑制人类社会的发展
本本电池应用保养指南
多频道无线调制解调发射器/接收器
华硕灵耀U2代轻薄笔记本采用了全面屏窄边框设计机身厚度仅15.9mm
华为mate10什么时候上市?最新消息:华为mate10今秋发布,华为首款全面屏+麒麟970+四摄像头,超强旗舰值得期待!
STM32基础知识:GPIO(通用输入输出接口)
Livox助小鹏汽车搭载智能出行方案 禾赛科技与Lumentum达成战略合作
奥比中光在国内服务机器人3D视觉传感器领域的市占率超过70%
可拆卸电池是如何衰落的?
苹果16年独占市场八成利润 却遭美国中情局黑客攻击
数字货币Basis是如何实现价格稳定的
如何保护LED免受EOS的影响
我国的5G专利数已占到了全球的30.3%
AMD推出基于Zen+架构和12nm工艺的第二代锐龙处理器
华为P10今天开启预订 资料泄露国行价格 老外眼红不已
博泽与Vayyar携手配备自动驾驶汽车门传感器
半桥DC-DC转换器设计方案降低数据中心功耗
谷歌再次发布BERT的多语言模型和中文模型
明年至少有两款新iPhone将配备LTO OLED面板
探索长三角产业数智化发展新出路