1.什么是GPIO
GPIO(general porpose intput output):通用输入输出端口的简称。可以通过软件控制其输出和输入。stm32芯片的GPIO引脚与外部设备连接起来,从而实现与外部通信,控制以及数据采集的功能。
GPIO管脚:引脚图中的 PA、PB、PC、PD 等均属于 GPIO 引脚。从引脚图可以看出,GPIO 占用了 STM32 芯片大部分的引脚。并且每一个端口都有 16 个引脚,比如 PA 端口,它有 PA0-PA15。其他的 PB、PC 等端口是一样的。
这里主要说一下单片机板载LED和开关的配置及其原理
LED
先看原理图
发光二极管两端存在压降二极管才会导通从而发光,根据原理图,二极管右侧为3.3V,要想默认LED是暗的,则需要左侧也是高电平。于是我们需要通过单片机输出一个高电平,在CUBEMX的配置如下
1.将对应GPIO设置为输出模式(output)
2.设置为高电平
1.设置为高电平
2.设置为推挽输出(个人理解:在推挽输出模式下,你设置高电平他就一定处于高电平。你设置他处于低电平他就处于低电平,在开漏输出模式下,只有全部是高电平才是高电平。详细的介绍看这篇文章整理笔记——推挽输出、开漏输出-CSDN博客
3.设置为浮空输出
关于上下拉电阻
上拉电阻是把一个信号通过一个电阻接到电源(Vcc),下拉电阻是一个信号通过一个电阻接到地(GND)。上拉会得到一个高电平,下拉则会得到一个低电平,至于如果设置低电平,再加一个上拉电阻,学长说是电流会直接流入单片机,过大则会造成损害,具体的请看这一篇文章上、下拉电阻(定义、强弱上拉、常见作用、吸电流、拉电流、灌电流)_弱上拉和强上拉的区别-CSDN博客
4.设置为低频时钟
之后生产的代码如下
void MX_GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
/* GPIO Ports Clock Enable */
__HAL_RCC_GPIOC_CLK_ENABLE();
__HAL_RCC_GPIOF_CLK_ENABLE();
__HAL_RCC_GPIOH_CLK_ENABLE();
/*Configure GPIO pin Output Level */
HAL_GPIO_WritePin(GPIOF, GPIO_PIN_9|GPIO_PIN_10, GPIO_PIN_SET);
/*Configure GPIO pins : PF9 PF10 */
GPIO_InitStruct.Pin = GPIO_PIN_9|GPIO_PIN_10;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOF, &GPIO_InitStruct);
}
1.打开使能时钟
__HAL_RCC_GPIOC_CLK_ENABLE();
__HAL_RCC_GPIOF_CLK_ENABLE();
__HAL_RCC_GPIOH_CLK_ENABLE();
2.给PF9 PF10一个高电平
HAL_GPIO_WritePin(GPIOF, GPIO_PIN_9|GPIO_PIN_10, GPIO_PIN_SET);
3.设置为推挽输出
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
4.设置为浮空输出(既不上拉也不下拉)
GPIO_InitStruct.Pull = GPIO_NOPULL;
5.设置为低速时钟
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
再说一下按键的配置
一样,看原理图
想要检测按键是否按下,也就是判断对应引脚是高电平还是低电平,如果给一个下拉电阻的话给无论是否被按下都是低电平,起不到相应的效果,所以要给一个上拉电阻,按下的时候变为低电平,未按下的时候则是低电平,cubemx配置如下
配置的代码如下
/*Configure GPIO pin : PE3 */
GPIO_InitStruct.Pin = GPIO_PIN_3;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_PULLUP;
HAL_GPIO_Init(GPIOE, &GPIO_InitStruct);
之后想在主函数中实现电平的改变可以使用HAL_GPIO_WritePin()函数,函数参数定义如下
void HAL_GPIO_WritePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState)
HAL_GPIO_WritePin()这个函数,前两个参数,指定IO口,第三个参数指定高低电平GPIO_PIN_RESET低,GPIO_PIN_SET高
注意输入不像输出,你就算输入了电压给他,他的电平也不会变。变成了一个类似于电源的存在。
举例;如果我要让PE3处于高电平
HAL_GPIO_WritePin(GPIOE,GPIO_PIN_3,GPIO_SET);//完成
低电平
HAL_GPIO_WritePin(GPIOF, GPIO_PIN_9, GPIO_PIN_RESET);
翻转电平
HAL_GPIO_TogglePin(GPIOE,GPIO_PIN_3)