前面学习了GPIO口的知识后,本体继续GPIO口输入功能的实践。设置GPIO为输入,只需要执行:
GPIOA_ModeCfg(GPIO_Pin_x, GPIO_ModeIN_PU); // x= 1 - 15
GPIOB_ModeCfg(GPIO_Pin_x, GPIO_ModeIN_PU); // x= 1 - 23
第二个参数是设置是否上拉、下拉的。可选的值:
GPIO_ModeIN_Floating, // 0 - 浮空输入
GPIO_ModeIN_PU, // 1 - 上拉输入
GPIO_ModeIN_PD, // 2 - 下拉输入
依旧要注意帮避开开发板上已经被使用的功能GPIO。不过这里需要说明的是,虽然BOOT、RESET已经被连接到指定的GPIO口,但这个设置需要配合GPIO功能复用设置。比如RESET,在没有启用IO口复用的场合,可以作为普通IO口使用的。

本次实践中,我们使用RESET按钮所在PB23作为输入,根据这个输入值改编PB4连接的LED。代码如下:
#include "CH58x_common.h"
#define LED_PIN GPIO_Pin_4
int main(void)
{
// 1. 设置系统时钟为 60MHz(必须)
SetSysClock(CLK_SOURCE_PLL_60MHz);
// 2. 初始化 GPIO
// 先置高电平(LED 灭,假设低电平点亮),再配置为推挽输出
GPIOB_SetBits(LED_PIN);
GPIOB_ModeCfg(LED_PIN, GPIO_ModeOut_PP_5mA);
// 配置PB23为上拉输入,对应RESET按键
GPIOB_SetBits(GPIO_Pin_23);
GPIOB_ModeCfg(GPIO_Pin_23, GPIO_ModeIN_PU);
while(1)
{
if (GPIOB_ReadPortPin(GPIO_Pin_23)) {
GPIOB_ResetBits(LED_PIN);
} else {
GPIOB_SetBits(LED_PIN);
}
DelayMs(50);
}
}编译后下载程序到开发板,运行。
此时按下RESET按钮,蓝色LED应该亮。松开按钮,蓝色LED应该灭。
我要赚赏金
