前言
GPIO为最基础应用也最广泛之功能,本篇主要纪录GPIO中所学习到的知识。
以STM32G431为例,使用CubeMX设定GPIO之条件所带来的相关功能,也将依依解释与纪录。
内容
STM32G431所使用系列,共有45pin,使用STM32cubeIDE建立档案,进入到CubeMX后,可看见完整MCU接脚图,点选任意脚出现各种功能与名称,每个脚位有不同使用功能,也有重複的部分。有时候需要查功能配置脚位图需要查询spec,但后来大部分直接使用MX确认所需的接脚,进行机种配置,方便又快速。
_ / 设定GPIO output \
以CubeMX设定GPIO本文主要说明GPIO,系统与时脉设定就不多加说明
以P2脚位PC13为例,设定为GPIO输出脚位。在MCU接脚图点选GPIO_Output
可在左边System Core选项中开启GPIO视窗,可显现所设定脚位详细资料
可在User Label可自行定义名称。
若没有特殊要求,甚至User Label亦可选择默认,即完成CubeMX中 GPIO的配置
指令函数使用 - GPIO output相关指令如下:使GPIO输出高电平或低电平void HAL_GPIO_WritePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState)
引数:
GPIOx :其中x可以(A..G取决于所使用的装置)来选择GPIO外设
GPIO_Pin :指定要写入的埠位。此引数可以是GPIO_PIN_x之一,其中x可以是( 0..15 )
PinState :指定要写入选定位的值。此引数可以是GPIO_PinState列举值之一:
. GPIO_PIN_RESET:清除埠Pin,低电平
. GPIO_PIN_SET:设定埠Pin,高电平
例子:
HAL_GPIO_WritePin(GPIOA, DONG_OUT_1_Pin|DONG_OUT_2_Pin, GPIO_PIN_RESET);//两个设定为低电平HAL_Delay(1000);//1sHAL_GPIO_WritePin(GPIOA, DONG_OUT_1_Pin, GPIO_PIN_SET);//单独设定为高电平HAL_GPIO_WritePin(GPIOA,DONG_OUT_2_Pin, 1);//单独设定为高电平HAL_Delay(1000);//1s
Toggle指定的GPIO outputvoid HAL_GPIO_TogglePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin)
引数:
GPIOx :其中x可以(A..G取决于所使用的装置)来选择GPIO外设
GPIO_Pin :指定要写入的埠位。此引数可以是GPIO_PIN_x之一,其中x可以是(0..15 )。
例子:
HAL_GPIO_TogglePin(GPIOA, DONG_OUT_1_Pin|DONG_OUT_2_Pin);//两个输出电平取反HAL_Delay(1000);//1sHAL_GPIO_TogglePin(GPIOA, DONG_OUT_1_Pin);//单独输出电平取反HAL_GPIO_TogglePin(GPIOA,DONG_OUT_2_Pin);//单独输出电平取反HAL_Delay(1000);//1s
小记
CubeMX中的GPIO设定真的很简易,虽然有其余功能,但几乎点一下即开启使用,但相对在main.c指令与函数中的使用,若不晓得有HAL指令的,还真的不晓得如何应用,我刚初学甚至连HAL指令在哪都不晓得。
_ / 设定GPIO input \
GPIO intput使用可以分成两种方式达成,分别是轮询与中断方式
首先以轮询方式说明步骤:
以CubeMX设定GPIO设定为GPIO输入脚位。在MCU接脚图点选GPIO_input
可在左边System Core选项中开启GPIO视窗,可显现所设定脚位详细资料
1.使GPIO读取脚位高电平或低电平
GPIO_PinState HAL_GPIO_ReadPin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin)
引数:
GPIOx :其中x可以(A..G取决于所使用的装置)来选择GPIO外设
GPIO_Pin :指定要写入的埠位。此引数可以是GPIO_PIN_x之一,其中x可以是(0..15 )
返回:
typedef enum{ GPIO_PIN_RESET = 0u,//低电平 GPIO_PIN_SET//高电平} GPIO_PinState;
例子:
GPIO_PinState res=HAL_GPIO_ReadPin(DONG_IN_1_GPIO_Port,DONG_IN_1_Pin);//读取电平if(res==GPIO_PIN_RESET){ HAL_GPIO_WritePin(GPIOA, DONG_OUT_1_Pin|DONG_OUT_2_Pin, GPIO_PIN_SET);//两个设定为高电平}else{ HAL_GPIO_WritePin(GPIOA, DONG_OUT_1_Pin|DONG_OUT_2_Pin, GPIO_PIN_RESET);//两个设定为低电平}
以中断方式说明步骤:
以CubeMX设定GPIO

GPIO mode:
l 上升沿触发检测的外部中断模式(External Interrupt Mode with Rising edge trigger detection)
l 下降沿触发检测的外部中断模式(External Interrupt Mode with Falling edge trigger detectiort)
l 上升/下降沿触发检测的外部中断模式(External Interrupt Mode with Risinq/Falling edge trigger detection)
l 上升沿触发检测的外部事件模式(External Event Mode with Rising edge trigger detection)
l 下降沿触发检测的外部事件模式(External Event Mode with Falling edge trigger detection)
l 上升/下降沿触发检测的外部事件模式(External Event Mode with Rising/Falling edge trigger detectiont)
中断和事件的区别:
l 中断是当IO达到中断条件后会向CPU产生中断请求
l 事件是事先设定好的任务,当微控制器达到要求将通过硬体的方式处理事先设定好的任务,而不向CPU请求中断,比如DMA、AD转换等
指令函数使用 - 中断输入相关函式:中断回拨函式
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin);
引数:
GPIO_Pin :指定连线EXTI线的引脚
例子:
//GPIO中断回拨函式void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin){//判断进入中断的GPIOsif(KEY1_Pin==GPIO_Pin){ HAL_GPIO_TogglePin(GPIOA, DONG_OUT_1_Pin);//单独输出电平取反 HAL_GPIO_TogglePin(GPIOA,DONG_OUT_2_Pin);//单独输出电平取反 }}
_ 整理与补充
STM32的HAL库中GPIO有8种工作模式,4种输入状态、4种输出状态(2种复用输出+2种普通输出),分别对应如下:
1、浮空输入模式
当GPIO採用浮空输入模式时,STM32的引脚状态是不确定的,此时STM32得到的电平状态完全取决于GPIO外部的电平状态,所以说在GPIO外部的引脚悬空时,读取该埠的电平状态是个不确定的值。
#define GPIO_MODE_INPUT 0x00000000U /*!< Input Floating Mode */
2、模拟输入模式
这个很好理解,最常用的场合是ADC模拟输入,不像其他输入模式只有0和1,模拟输入模式可以读取到很细微变化的值。
#define GPIO_MODE_ANALOG 0x00000003U /*!<
3、带上拉、下拉输入模式
STM32的数据手册中关于上下拉的电阻的介绍是电阻阻值都在30-50K之间。
为什么要用带上拉或者下拉输入的模式呢?因为浮空模式时,在GPIO外部连接的电路未工作时,STM32读取的GPIO状态是不确定的,所以可以採用带上拉或者下拉输入的模式先给MCU一个确定的状态,当外部电路电平状态发生变化时,易于MCU的判断。这样可以增强MCU的抗干扰能力Analog Mode */
#define GPIO_MODE_IT_RISING 0x10110000U /*!< External Interrupt Mode with Rising edge trigger detection */
#define GPIO_MODE_IT_FALLING 0x10210000U /*!< External Interrupt Mode with Falling edge trigger detection */
#define GPIO_MODE_IT_RISING_FALLING 0x10310000U /*!< External Interrupt Mode with Rising/Falling edge trigger detection */
4、推輓输出模式
推挽结构一般是指两个三极体分别受两个互补信号的控制,总是在一个三极体导通的时候另一个截止。这种结构既可以输出高电平,也可以输出低电平,可以用于连接数字器件。
以推挽方式存在于电路中,各负责正负半周的波形放大任务,电路工作时,两只对称的功率开关管每次只有一个导通,所以导通损耗小、效率高。输出既可以向负载灌电流,也可以从负载抽取电流。推拉式输出级既提高电路的负载能力,又提高开关速度。
#define GPIO_MODE_OUTPUT_PP 0x00000001U /*!< Output Push Pull Mode */
5、开漏输出模式
我们重点讲开漏输出,一般开漏输出模式时,如果外部不接上拉电阻时,只能输出低电平,所以要想输出高电平必须要外接上拉电阻。这样做的有一个好处,可以用来匹配不同的电平信号,也就是用于不同电压的系统之间的通信;另外,因为要输出高电平需要有外部的上拉电阻,所以在进行通信时,通信的速度也受到上拉电阻阻值的影响,阻值小时,通信速度可以很快,阻值大时,通信速度变慢,但也不能为了通信速度把上拉电阻用的很小,也要注意在电阻很小时,功耗会变大,所以要平衡好这个度。
#define GPIO_MODE_OUTPUT_OD 0x00000011U /*!< Output Open Drain Mode */
6、复用推挽、开漏输出模式
这两种模式,可以理解为把GPIO配置为第二功能使用的时候的配置,并非单纯的用作IO输入或输出。
比如使用外设IIC时,我们需要把GPIO配置为复用推輓输出,用于数据通信功能。
再比如串口通信的TX、以及SPI外设的GPIO使用就要把引脚设置为复用开漏输出。
#define GPIO_MODE_AF_PP 0x00000002U /*!< Alternate Function Push Pull Mode /
#define GPIO_MODE_AF_OD 0x00000012U /!< Alternate Function Open Drain Mode */
小记
CubeMX中的GPIO设定真的很简易,虽然有其余功能,但几乎点一下即开启使用,但相对在main.c指令与函数中的使用,若不晓得有HAL指令的,还真的不晓得如何应用,我刚初学甚至连HAL指令在哪都不晓得。
若此文章对您有帮助或学习,欢迎加入likecoin讚赏公民,下方连结点击like支持~
https://button.like.co/jm-ysys18
本文参考
https://www.wpgdadatong.com/tw/blog/detail?BID=B0956