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)

  • 26
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在使用STM32CubeMX进行串控制GPIO配置时,首先需要打开STM32CubeMX并选择对应的芯片型号,比如stm32f103c8t6。然后可以进行时钟配置,根据需求选择配置。接下来,点击引脚标号,进行对应的GPIO配置。具体配置方法可以参考GitHub上的教程。需要注意的是,不同的芯片对引脚的处理可能会有所不同,所以在进行配置时需要注意芯片的特性。在配置完成后,可以生成代码并使用Keil等开发工具进行编程。通过编程,可以实现串控制GPIO的功能,如控制LED灯、数码管等外部硬件设备。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [GPIO工作模式及CUBEMX的配置](https://blog.csdn.net/m0_62916400/article/details/124505157)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *3* [STM32 Cubemx实现串通信、I2C与GPIO的综合应用](https://blog.csdn.net/Nirvana_6174/article/details/104320694)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值