一、GPIO (General-purpose I/Os--通用输入输出端口)简介:
(一)定义:
GPIO是MCU对外进行数据交互的通用IO接口,在MCU内部其可配置与其它片上外设或MCU内核(CPU)连接完成引脚上电压信号的读写。
- GPIO端口在MCU上分为多个组来共同完成IO引脚读写(如GPIOA...),并且每个GPIO组掌控的IO引脚可以单独配置
(二)框图分析 :
从框图中我们可以得到以下信息:
1.保护二极管:
其用于保护引脚外部有过高或过低的电压输入时稳定输入电压,当引脚输入电压高于
VDD 时,上面的二极管导通,由二极管的正向导通特性可知,真正输入到内部的信号电压不会超过(VDD+Vin) V,下方二极管原理与上类似。
2.上/下拉电阻:
- GPIO用此来决定三种默认引脚状态:上拉(默认高电平)、下拉(默认低电平),浮空(随机电平)
- 强弱上/下拉:指代上下拉电阻的大小,与电阻上电流的大小的关系
- 弱->电阻阻值大,流经电流较小
- 强->电阻阻值小,流经电流较大
3.输入驱动器:
- 施密特触发器:其原理类似于电压比较器,将电压输入根据电路设计时的上下阈值电压进行整形比较输出得到对应的高低电平。如要输入原电压则不需要开启施密特触发器,将电压输入通道配置为模拟输入通道即可。
4.输出驱动器:
- 链路选择器(1):选择数据为CPU直接控制GPIO寄存器式输出还是由其它外设控制的电平输出
- 输出控制单元(2):根据GPIO的输出模式(开漏/推挽)控制与前端输出电平来决定对称MOS管的导通状态,最终来确定最终输出电平为何。(后边解释何为推挽/推挽)
- 对称MOS管(3)
5.[复用]输入输出单元:
- CPU直接接读写GPIO寄存器
- 其它非模拟外设直接读写
6.模拟输入输出单元:
模拟输出通道
模拟输入通道
(三)扩展知识:
- 在复位期间和复位后,默认复用功能失能并且GPIO引脚被配置为输入浮空模式(JTAG引脚除外)。
- 当LSE/HSE振荡器关闭时,LSE振荡器引脚OSC_IN和OSC_OUT可以用作通用IO引脚。
二、主要功能分析:
(一)输入+上拉/下拉/浮空:
1.输入上拉:
此时,配置GPIO模式为输入并且带上拉。开发者可以使用API直接读取引脚电平值,初始电平为高电平。
2.输入下拉:
此时,配置GPIO模式为输入并且带下拉。开发者可以使用API直接读取引脚电平值,初始电平为低电平。
3.输入浮空:
此时,配置GPIO模式为输入并且带浮空。开发者可以使用API直接读取引脚电平值,初始电平为随机浮空电平。
(二)输出+上拉/下拉/浮空:
1.开漏输出:
- 此时,配置GPIO模式为开漏输出模式,注意在此模式下,施密特触发器仍开启,CPU直接读取GPIO输入寄存器的通路仍启用,所以可以认为GPIO的输出模式为准双向IO。
- 此时,对称MOS管只有下方N-MOS管处于激活状态,当前置输出单元输出为‘0’时,N-MOS导通对外输出低电平。而输出为‘1’时,则对外输出高阻态,这里可以使用内/外置上下拉来使高阻态转变为自定义的电平状态,所以开漏输出模式可以兼容/自定义许多不同的通信协议(如IIC通信协议等)。
- 输出模式的上下拉用于置位默认电平
2.推挽输出:
- 此时,配置GPIO模式为推挽输出模式,注意在此模式下,施密特触发器仍开启,CPU直接读取GPIO输入寄存器的通路仍启用,所以可以认为GPIO的输出模式为准双向IO。
- 此时,对称MOS管均处于激活状态,当前置输出单元输出为‘0’时,N-MOS导通对外输出低电平。而输出为‘1’时,,P-MOS导通对外输出高电平。
- 输出模式的上下拉用于置位默认电平
3.复用+开漏输出:
其与开漏输出类似,区别在于前置输出单元为其它外设的IO通路,而非CPU直接访问GPIO寄存器输出通路。
4.复用+推挽输出:
其与推挽输出类似,区别在于前置输出单元为其它外设的IO通路,而非CPU直接访问GPIO寄存器输出通路。
(三)模拟+浮空:
- 此时,配置GPIO模式为模拟模式并且带浮空(一般为浮空),注意在此模式下,施密特触发器仍开启,CPU直接读取GPIO输入寄存器的通路仍启用,所以可以认为GPIO的输出模式为准双向IO。
- 原电压直接输入到模拟外设当中(如ADC中)或者输出到外部引脚上。
(四)复用功能:
- GPIO可以配置每个 I/O 引脚选择可用的复用功能。开发者可根据应用程序的要求将某个复用功能配置于某个引脚。
- 复用即从多个目标中选择使用一个,这里相当于芯片设计人员设计了IO引脚可以连接至不同的目标,使用AF复用器来使引脚连接至不同的通路。
(五)IO配置锁定:
- 通过将特定的写命令将位数据写入到GPIOx_LCKR 寄存器,可以冻结 某GPIO端口的引脚控制寄存器(冻结的寄存器包括 GPIOx_MODER、 GPIOx_OTYPE、GPIOx_PUPDR、GPIOx_AFRL 和 GPIOx_AFR、GPIOx_OSPEEDR)。当锁定功能使能后,在执行下一次 MCU 复位或外设复位之前,都将无法对该端口的引脚配置进行修改。
三、外设配置:
(一)模式:
- 输入上拉:MODE_INPUT| GPIO_PULLUP
- 输入下拉:MODE_INPUT| GPIO_PULLDOWN
- 输入浮空:MODE_INPUT| GPIO_NOPULL
- 开漏输出:MODE_OUTPUT | OUTPUT_OD
- 推挽输出:MODE_OUTPUT | OUTPUT_PP
- 复用开漏输出:MODE_AF | OUTPUT_OD
- 复用推挽输出:MODE_AF | OUTPUT_PP
- 模拟模式:MODE_ANALOG
PS:此处采用的是最终的扩展宏,没有采用顶层宏定义,便于理解。
(二)默认电平值:
在CubeMX配置中有GPIO output level这一配置栏,其实就是在配置输出前,事先调用API完成对输出寄存器的写值来置位准电平,相当于给上下拉的预电平来一层保险吧。
(三)引脚输出速度:
又称输出驱动电路的响应速度:芯片内部在I/O口的输出部分安排了多个响应速度不同的输出驱动电路,用户可以根据自己的需要选择合适的驱动电路,通过选择速度来选择不同的输出驱动模块,达到最佳的噪声控制和降低功耗的目的。
可理解为: 输出驱动电路的带宽:即一个驱动电路可以不失真地通过 信号的最大频率(如果一个信号的频率超过了驱动电路的响应速度,就有可能信号失真。
/** @defgroup GPIO_speed_define GPIO speed define * @brief GPIO Output Maximum frequency * @{ */ #define GPIO_SPEED_FREQ_LOW 0x00000000U /*!< IO works at 2 MHz, please refer to the product datasheet */ #define GPIO_SPEED_FREQ_MEDIUM 0x00000001U /*!< range 12,5 MHz to 50 MHz, please refer to the product datasheet */ #define GPIO_SPEED_FREQ_HIGH 0x00000002U /*!< range 25 MHz to 100 MHz, please refer to the product datasheet */ #define GPIO_SPEED_FREQ_VERY_HIGH 0x00000003U /*!< range 50 MHz to 200 MHz, please refer to the product datasheet */
四、软件驱动:
(一)类/数据类型:
1.GPIO初始化类:
/** * @brief GPIO Init structure definition */ typedef struct { uint32_t Pin; /* 指定要配置的GPIO引脚 -> GPIO_pins_define */ uint32_t Mode; /* 指定选定引脚的操作模式 -> GPIO_mode_define */ uint32_t Pull; /* 指定选定引脚的上/下拉状态 -> GPIO_pull_define */ uint32_t Speed; /* 指定选定引脚的最高带宽 -> GPIO_speed_define */ uint32_t Alternate; /* 要连接到选定引脚的复用外设 -> GPIO_Alternate_function_selection*/ }GPIO_InitTypeDef;
(二)驱动使用流程:
- 使能GPIO的AHB时钟:__HAL_RCC_GPIOx_CLK_Enable()。
- 使用HAL_GPIO_Init()配置GPIO引脚。
- 在选择外部中断/事件模式(EXTI功能)的情况下,使用HAL_NVIC_SetPriority()配置映射到EXTI线的NVIC IRQ优先级,并使用HAL_NVIC_EnableIRQ()使能该中断。
- 获得在输入模式下的引脚电平,使用HAL_GPIO_ReadPin()。
- 设置在输出模式下的引脚的电平,使用HAL_GPIO_WritePin/HAL_GPIO_TogglePin。
- 要锁定引脚配置直到下次复位,使用HAL_GPIO_LockPin()。
(三)常用API:
1.初始化和解初始化函数:文章来源:https://www.toymoban.com/news/detail-828005.html
- void HAL_GPIO_Init (GPIO_TypeDef * GPIOx, GPIO_InitTypeDef * GPIO_Init):
- Brief:根据GPIO_Init中指定的参数初始化GPIOx外设寄存器。
- void HAL_GPIO_DeInit (GPIO_TypeDef * GPIOx, uint32_t GPIO_Pin):
- Brief:将GPIOx外设寄存器初始化为其默认值。
2.IO操作函数:文章来源地址https://www.toymoban.com/news/detail-828005.html
- GPIO_PinState HAL_GPIO_ReadPin (GPIO_TypeDef * GPIOx, uint16_t GPIO_Pin):
- Brief:读取指定的输入端口引脚电平。
- void HAL_GPIO_WritePin (GPIO_TypeDef * GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState):
- Brief:设置选定的端口引脚电平。
- void HAL_GPIO_TogglePin (GPIO_TypeDef * GPIOx, uint16_t GPIO_Pin):
- Brief:切换指定的GPIO引脚的当前电平值。
- HAL_StatusTypeDef HAL_GPIO_LockPin (GPIO_TypeDef * GPIOx, uint16_t GPIO_Pin):
- Brief:锁定指定GPIO引脚的配置寄存器。
- void HAL_GPIO_EXTI_IRQHandler (uint16_t GPIO_Pin):
- Brief:处理EXTI中断请求的HAL库框架中继处理函数。
- void HAL_GPIO_EXTI_Callback (uint16_t GPIO_Pin):
- Brief:EXTI线路触发中断回调函数。
到了这里,关于STM32-GPIO解析的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!