判断STM32 GPIO输入口的输入状态(高电平或低电平)

判断STM32 GPIO输入口的输入状态(高电平或低电平)

以PE2和PE4为例:

 

① 判断单个端口是否为高电平:

if(GPIOE->IDR& GPIO_IDR_IDR2)

{

函数体;

}

当PE2端口为高电平时,if条件为真;当PE2口为低电平时,if条件为假;

 

② 判断单个端口是否为低电平:

if((~GPIOE->IDR)& GPIO_IDR_IDR2)

{

函数体;

}

分析:首先通过 &GPIO_IDR_IDR屏蔽掉PE2之外的其他PE口。当PE2为高电平时,GPIO-〉IDR的bit2为‘1’,取反后为‘0’,因此条件为假;当PE2为低电平时,GPIO-〉IDR的bit2为‘0’,取反后为‘1’,因此条件为真;通过此方法可以同时判断PE2PE4(甚至更多PE口)是否为低电平(如按键被按下)

 

③ 判断多个端口中是否有低电平:

if((~GPIOE->IDR)& (GPIO_IDR_IDR2 | GPIO_IDR_IDR4))

{

函数体;

}

分析:首先通过 & (GPIO_IDR_IDR2| GPIO_IDR_IDR4)屏蔽掉PE2和PE4之外的其他PE口。当PE2或(和)PE4中为低电平时,GPIO-〉IDR的bit2或(和)bit4为‘0’,取反后为‘1’,因此条件为真;

 

注:此方法并不是用来判断stm32 IO口状态的最好和最直接的方法,但对于理解位操作会有帮助。
### 使用 STM32 HAL 库读取 GPIO 低电平 通过 STM32 的 HAL (Hardware Abstraction Layer) 库可以方便地操作 GPIO 引脚的状态。以下是基于 HAL 库的示例代码,用于读取指定 GPIO 引脚的高低电平。 #### 初始化 GPIO 引脚 在使用 `HAL_GPIO_ReadPin` 函数之前,需要先初始化目标引脚为输入模式。可以通过定义一个 `GPIO_InitTypeDef` 结构体并调用 `HAL_GPIO_Init` 来完成此过程[^2]。 ```c #include "stm32f4xx_hal.h" // 定义使用的 GPIO 和 Pin #define LED_PIN GPIO_PIN_5 #define LED_PORT GPIOD void GPIO_Init(void) { __HAL_RCC_GPIOD_CLK_ENABLE(); // 启用 GPIOD 时钟 GPIO_InitTypeDef GPIO_InitStruct = {0}; // 配置引脚为输入模式 GPIO_InitStruct.Pin = LED_PIN; GPIO_InitStruct.Mode = GPIO_MODE_INPUT; // 设置为输入模式 GPIO_InitStruct.Pull = GPIO_NOPULL; // 不启用上下拉电阻 HAL_GPIO_Init(LED_PORT, &GPIO_InitStruct); // 初始化 GPIO } ``` #### 读取 GPIO 引脚状态 一旦完成了引脚的初始化工作,就可以利用 `HAL_GPIO_ReadPin` 函数来获取该引脚当前的逻辑电平(高/低)。返回值是一个布尔型数据:如果引脚处于高电平,则返回 `GPIO_PIN_SET`;如果是低电平则返回 `GPIO_PIN_RESET`。 ```c uint8_t Read_GPIO_Pin(void){ uint8_t pinState; // 读取引脚状态 if(HAL_GPIO_ReadPin(LED_PORT, LED_PIN) != GPIO_PIN_RESET){ pinState = 1; // 如果不是低电平,则认为是高电平 }else{ pinState = 0; // 是低电平时 } return pinState; } int main(void){ HAL_Init(); GPIO_Init(); while(1){ uint8_t state = Read_GPIO_Pin(); if(state == 1){ // 当前引脚为高电平 printf("Pin is HIGH\n"); } else{ // 当前引脚为低电平 printf("Pin is LOW\n"); } HAL_Delay(1000); // 延迟一秒再检测 } } ``` 上述程序展示了如何周期性地检查某个特定 IO 引脚上的电压水平,并打印相应的消息至串终端设备上。 ### 注意事项 - 确保所选 MCU 资源已开启相应外设时钟。 - 输入模式下的引脚可以选择是否附加内部上拉下拉电阻以提高抗干扰能力。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值