[1][STM32G4系列] GPIO笔记 - CubeMX GPIO整理与应用

前言

GPIO为最基础应用也最广泛之功能,本篇主要纪录GPIO中所学习到的知识。
以STM32G431为例,使用CubeMX设定GPIO之条件所带来的相关功能,也将依依解释与纪录。

内容

STM32G431所使用系列,共有45pin,使用STM32cubeIDE建立档案,进入到CubeMX後,可看见完整MCU接脚图,点选任意脚出现各种功能与名称,每个脚位有不同使用功能,也有重复的部分。有时候需要查功能配置脚位图需要查询spec,但後来大部分直接使用MX确认所需的接脚,进行机种配置,方便又快速。

https://ithelp.ithome.com.tw/upload/images/20211026/20143021qy0ibFQLZ9.jpg


_ / 设定GPIO output \

  • 以CubeMX设定GPIO

本文主要说明GPIO,系统与时脉设定就不多加说明

以P2脚位PC13为例,设定为GPIO输出脚位。在MCU接脚图点选GPIO_Output
可在左边System Core选项中开启GPIO视窗,可显现所设定脚位详细资料

https://ithelp.ithome.com.tw/upload/images/20211026/20143021MklJDD4V3u.jpg

可在User Label可自行定义名称。
https://ithelp.ithome.com.tw/upload/images/20211026/20143021AD0c4O1LR2.jpg

若没有特殊要求,甚至User Label亦可选择默认,即完成CubeMX中 GPIO的配置

  • 指令函数使用 - GPIO output相关指令如下:
  1. 使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);//1s
HAL_GPIO_WritePin(GPIOA, DONG_OUT_1_Pin, GPIO_PIN_SET);//单独设定为高电平
HAL_GPIO_WritePin(GPIOA,DONG_OUT_2_Pin, 1);//单独设定为高电平
HAL_Delay(1000);//1s
  1. Toggle指定的GPIO output
void 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);//1s
HAL_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视窗,可显现所设定脚位详细资料

  • 指令函数使用 - GPIO input相关指令如下:

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
    https://ithelp.ithome.com.tw/upload/images/20211109/20143021JOCH2KF0rC.png
    https://ithelp.ithome.com.tw/upload/images/20211109/20143021hKRfaOLyEO.png

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){
//判断进入中断的GPIOs
if(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 */

https://ithelp.ithome.com.tw/upload/images/20211209/20143021EmPCEkaOZL.png

小记

CubeMX中的GPIO设定真的很简易,虽然有其余功能,但几乎点一下即开启使用,但相对在main.c指令与函数中的使用,若不晓得有HAL指令的,还真的不晓得如何应用,我刚初学甚至连HAL指令在哪都不晓得。


若此文章对您有帮助或学习,欢迎加入likecoin赞赏公民,下方连结点击like支持~

https://button.like.co/jm-ysys18


本文参考

https://www.wpgdadatong.com/tw/blog/detail?BID=B0956


<<:  密码是支持单因素身份验证的最佳机制

>>:  学习JavaScript纪录Day1

Component 鬼牌(二): 看网址决定 Component

前端 router 前端 router 是一个很厉害的技术,让 JavaScript 的内容与网址有...

[Day2] CSS + JS Clock

[Day2] CSS + JS Clock 运用 CSS 和 Javascript 做一个虚拟时钟 ...

用arduino传值至php档再使用php档传数据至heidisql时无法传中文或英文

小弟我是用xampp及heidisql建置资料库 再透过arduino传值至php php再传值到h...

Day 9 - Container With Most Water

大家好,我是毛毛。ヾ(´∀ ˋ)ノ 废话不多说开始今天的解题Day~ 11. Container W...

从 IT 技术面细说 Search Console 的 27 组数字 KPI (22) :KPI 总表,项目流程次序

从 IT 技术面细说 Search Console 的 27 组数字 KPI (22) :KPI 总...