GPIO输入
GPIO的特点:
具有内部上拉或下拉的功能
可以使用外部下拉或上拉
在这里我们的按键分别接入PA0和PC13引脚,另一端全都接GND
按 键 控 制 L E D 灯
软 件 设 计 流 程
初 始 化 系 统
初 始 化 GPIO 外 设 时 钟
初 始 化 按 键 和 L E D 的 引 脚
检 测 按 键 输 入 电 平 来 控 制 L E D
编写(配置)按键相关函数,在这里我们可以同时初始化两个时钟GPIOA,GPIOC(都在APB2总线下)。
主函数
实现按下SW2,LED灯亮,按下SW3,LED灯灭
按键检测部分:
使用GPIO_ReadInputDataBit
函数读取GPIOA的第0号引脚(SW2)和GPIOC的第13号引脚(SW3)的状态。如果检测到引脚为低电平(即按键被按下),则执行相应的LED控制操作。这里有一个潜在的问题:如果两个按键同时被按下,由于两个if
语句是独立的,LED的状态可能会变得不确定,因为两个条件都可能为真,并且它们的执行顺序是未定义的。在实际应用中,可能需要使用else if
或switch
语句来确保一次只有一个操作被执行。
下面四个函数都是用于GPIO端口的读写操作
区别:
GPIO_ReadInputDataBit
- 功能:读取指定GPIO端口上指定引脚的输入数据位。
- 返回值:返回一个
uint8_t
类型的值,表示读取到的引脚状态(0或1,分别对应低电平和高电平)。 - 用途:用于检测外部信号的状态,如按键是否被按下、传感器输出等。
GPIO_ReadInputData
- 功能:读取指定GPIO端口的整个输入数据寄存器的内容。
- 返回值:返回一个
uint16_t
类型的值,表示读取到的端口状态(每个位对应一个引脚的状态)。 - 用途:当需要同时读取多个引脚的状态时,这个函数比
GPIO_ReadInputDataBit
更高效。
GPIO_ReadOutputDataBit
- 功能:读取指定GPIO端口上指定引脚的输出数据位。
- 返回值:与
GPIO_ReadInputDataBit
相同,返回一个uint8_t
类型的值,表示读取到的引脚状态(但这次是输出状态)。 - 用途:虽然不常见,但在某些情况下可能需要检查GPIO引脚的输出状态,以确保硬件或软件逻辑按预期工作。
GPIO_ReadOutputData
- 功能:读取指定GPIO端口的整个输出数据寄存器的内容。
- 返回值:与
GPIO_ReadInputData
相同,返回一个uint16_t
类型的值,表示读取到的端口输出状态(每个位对应一个引脚的状态)。 - 用途:与
GPIO_ReadInputData
类似,但用于输出状态。同样,在需要同时检查多个引脚输出状态时很有用。
这四个函数的主要区别在于它们访问的GPIO端口数据的上下文(输入或输出)和粒度(单个位或整个端口)。GPIO_ReadInputDataBit
和GPIO_ReadOutputDataBit
提供了对单个引脚状态的访问,而GPIO_ReadInputData
和GPIO_ReadOutputData
则允许同时读取整个端口的状态。选择哪个函数取决于你的具体需求,比如你是需要检测外部信号还是验证内部输出,以及你是否需要同时处理多个引脚。