GPIO是学习硬件的入口,自然对W806-KIT开发板也不例外。 在开发板上有3个LED,分别连接PB0~PB2。此外,还有2个按键,分别是复位键和唤醒键(作芯片升级使能用)。
因此,要实现按键控制LED的功能,必须外挂一个控制按键。
在使用GPIO之前,必须对相应的引脚进行功能配置,以控制3个LED为例,其程序代码为:
GPIO_InitTypeDef GPIO_InitStruct = {0};
__HAL_RCC_GPIO_CLK_ENABLE();
GPIO_InitStruct.Pin = GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2, GPIO_PIN_SET);
其中:
__HAL_RCC_GPIO_CLK_ENABLE()的作用是使能GPIO的系统时钟;
GPIO_InitStruct.Pin = GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2的作用是指定配置的引脚;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT的作用是将指定的引脚配置成输出口;
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2, GPIO_PIN_SET)的作用是将指定的引脚设置成输出高电平。
对于外挂的按键来讲,其配置程序代码为:
GPIO_InitStruct.Pin = GPIO_PIN_5;
GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING;
GPIO_InitStruct.Pull = GPIO_PULLUP;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
相应的语句作用为:
GPIO_InitStruct.Pin = GPIO_PIN_5指定配置的引脚;
GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING将指定的引脚配置成下降沿触发的中断引脚;
GPIO_InitStruct.Pull = GPIO_PULLUP将指定的引脚配置成上拉输入模式。
实现按键同时控制3个LED亮灭的主程序为:
int main(void)
{
SystemClock_Config(CPU_CLK_160M);
printf("enter mainrn");
HAL_Init();
GPIO_Init();
while (1)
{
if (key_flag == 1)
{
HAL_Delay(20);
if (HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_5) == GPIO_PIN_RESET)
{
HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2);
}
key_flag = 0;
}
}
return 0;
}
以中断方式进行按键处理的程序为:
void HAL_GPIO_EXti_Callback(GPIO_TypeDef *GPIOx, uint32_t GPIO_Pin) {
if ((GPIOx == GPIOB) && (GPIO_Pin == GPIO_PIN_5))
{
key_flag = 1;
}
}
这样,没按下一次按键,就切换一次变量key_flag的状态,同时也在语句HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2)的作用下,变换一次LED灯的状态。
经编译,其编译结果如图1所示。
图1完成编译
在完成下载后,其结果如图2所示。
图2完成下载
在按图3所示进行连接的情况下,其运行效果如图4所示,按一次键3个LED全亮,再按一次键3个LED全灭。
图3 连接方式
图4 运行效果
掌握了GPIO口的使用方法后,我们可以通过GPIO口来模拟I2C通讯,进而来驱动OLED屏的显示。