STM32Cube之GPIO能读取设置为输出模式引脚的高低电平

在看HAL库代码的时候,发现如果是HAL_GPIO_ReadPin读取设置为输出模式的引脚高低电平也是能读取成功的。这个现象引起作者的好奇心,进一步看了STM32的参考手册(如下图1、2)与HAL_GPIO_WritePin函数的实现(如下图3)。答案就很显然了。HAL_GPIO_WritePin是通过修改GPIO的BSRR寄存器来达到将具体某个引脚置位或清零的。从参考手册也可以发现,修改BSRR的同时会修改IDR寄存器。巧了HAL_GPIO_ReadPin就是读取IDR寄存器的。所以HAL_GPIO_ReadPin能读取输出模式的引脚,但是要注意,若是你需要和外界交互的比如I2C(模拟I2C,因为要给外部设备控制),SDA引脚就需要设置为输入模式了。好了本文就到这里了,下次见。

 

                                                                 图1       

                                                                图2

                                                                 图3

                                                                 图4

  • 8
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
好的,我可以帮你介绍一下如何在STM32CubeIDE中使用按键输入和输出驱动LED灯的方法,以STM32F103RET6为例。 1. 首先,你需要将按键和LED灯连接到开发板上。假设你将按键连接到了PA0引脚,LED灯连接到了PB12引脚。 2. 在STM32CubeIDE中创建一个新项目,选择对应的MCU型号和工程类型。 3. 在Project Manager中打开Pinout选项卡,将PA0设置GPIO_Input模式,PB12设置GPIO_Output模式。 4. 在Project Manager中打开Clock Configuration选项卡,选择需要的时钟频率,例如使用HSI时钟,设置为8MHz。 5. 在工程中添加一个main.c文件,并添加GPIO库文件的头文件。 ``` #include "stm32f1xx_hal.h" ``` 6. 在main函数中初始化GPIO引脚。 ``` int main(void) { /* 初始化HAL库 */ HAL_Init(); /* 初始化GPIO引脚 */ __HAL_RCC_GPIOA_CLK_ENABLE(); __HAL_RCC_GPIOB_CLK_ENABLE(); GPIO_InitTypeDef GPIO_InitStruct = {0}; /* 配置PA0为输入模式 */ GPIO_InitStruct.Pin = GPIO_PIN_0; GPIO_InitStruct.Mode = GPIO_MODE_INPUT; GPIO_InitStruct.Pull = GPIO_NOPULL; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); /* 配置PB12为输出模式 */ GPIO_InitStruct.Pin = GPIO_PIN_12; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); /* 循环读取按键状态,控制LED灯 */ while (1) { /* 读取PA0引脚状态 */ if (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0) == GPIO_PIN_SET) { /* PA0引脚电平,点亮LED灯 */ HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12, GPIO_PIN_SET); } else { /* PA0引脚低电平,熄灭LED灯 */ HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12, GPIO_PIN_RESET); } } } ``` 7. 编译并下载程序到开发板上。 8. 按下PA0引脚,LED灯会点亮;松开PA0引脚,LED灯会熄灭。 以上就是在STM32CubeIDE中使用按键输入和输出驱动LED灯的方法,以STM32F103RET6为例。你可以根据自己的需求修改代码,例如使用外部中断控制LED灯等等。
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值