STM32单片机GPIO口

 

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)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值