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屏的显示。
|