STM32 之 GPIO

本文详细介绍了STM32 GPIO的基本概念,包括GPIO的定义、STM32 GPIO端口的结构、寄存器控制以及HAL库在GPIO操作中的应用。重点讲解了GPIO输出控制的HAL库函数,并通过实例演示如何配置和使用GPIO进行电平输出和翻转。同时提到了STM32CubeMX在项目生成中的角色。

1. STM32的GPIO端口知识要点

1. GPIO: General Purpose Input & Output (通用输入输出)

2. STM32芯片最多拥有GPIOA,GPIOB…GPIOG等7组端口,每组端口最多拥有Pin0,Pin1…Pin15共16个引脚

3. STM32的每个I/O端口都可以自由编程,但I/O端口寄存器必须按32位字被访问

寄存器是CPU内部用来存放数据的一些小型存储区域,用来暂时存放参与运算的数据和运算结果。其实寄存器就是一种常用的时序逻辑电路,但这种时序逻辑电路只包含存储电路。寄存器的存储电路是由锁存器或触发器构成的,因为一个锁存器或触发器能存储1位二进制数,所以由N个锁存器或触发器可以构成N位寄存器。寄存器是中央处理器内的组成部分。寄存器是有限存储容量的高速存储部件,它们可用来暂存指令、数据和位址。

4. STM32的每个I/O端口都由7个寄存器来控制

5. STM32的I/O端口可以由软件配置成8种模式

1. 推挽输出          5. 模拟输入(AD转换的模拟信号)
2. 开漏输出          6. 浮空输入
3. 推挽式复用功能     7. 下拉输入
4. 开漏式复用功能     8. 上拉输入

2. 掌握两个GPIO输出的HAL库函数(Hardware Abstraction Layer 硬件抽象层)

HAL库是ST公司目前主力推的开发方式,全称就是Hardware Abstraction
Layer(硬件抽象层)。库如其名,很抽象,一眼看上去不太容易知道他的作用是什么。它的出现比标准库要晚,但其实和标准库一样,都是为了节省程序开发的时期,而且HAL库尤其的有效,如果说标准库把实现功能需要配置的寄存器集成了,那么HAL库的一些函数甚至可以做到某些特定功能的集成。也就是说,同样的功能,标准库可能要用几句话,HAL库只需用一句话就够了。并且HAL库也很好的解决了程序移植的问题,不同型号的stm32芯片它的标准库是不一样的,例如在F4上开发的程序移植到F3上是不能通用的,而使用HAL库,只要使用的是相通的外设,程序基本可以完全复制粘贴,注意是相通外设,意思也就是不能无中生有,例如F7比F3要多几个定时器,不能明明没有这个定时器却非要配置,但其实这种情况不多,绝大多数都可以直接复制粘贴。是而且使用ST公司研发的STMcube软件,可以通过图形化的配置功能,直接生成整个使用HAL库的工程文件,可以说是方便至极,但是方便的同时也造成了它执行效率的低下,在各种论坛帖子真的是被吐槽的数不胜数。

1. GPIO电平输出的HAL库函数

void HAL_GPIO_WritePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState);

理解三个参数

  1. GPIOx: 目标引脚的端口号
  2. GPIO_Pin: 目标引脚的引脚号
  3. PinState: 高电平 GPIO_PIN_SET,低电平 GPIO_PIN_RESET

例: 向PB8引脚输出高电平
void HAL_GPIO_WritePin(GPIOB, GPIO_PIN_8, GPIO_PIN_SET);

2. GPIO电平翻转的HAL库函数

void HAL_GPIO_TogglePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);

注: 此函数不需要传入GPIO_PinState(引脚电平状态)参数,因为系统会根据这个引脚的状态自动判断然后将电平翻转过来

例:将PA3引脚输出电平翻转
void HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_3);

3. 用STM32CubeMX生成对应的项目工程代码

打开gpio.c文件

void MX_GPIO_Init(void)
{

  GPIO_InitTypeDef GPIO_InitStruct = {0};

    //时能GPIO外设的时钟
  /* GPIO Ports Clock Enable */
  __HAL_RCC_GPIOB_CLK_ENABLE();
  __HAL_RCC_GPIOG_CLK_ENABLE();

  /*Configure GPIO pin Output Level */
  HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_SET);

    //配置GPIO引脚输出电平
  /*Configure GPIO pin Output Level */
  HAL_GPIO_WritePin(GPIOG, GPIO_PIN_6 | GPIO_PIN_7, GPIO_PIN_SET);

    //配置具体某个引脚的基本属性
  /*Configure GPIO pin : PB0 */
  GPIO_InitStruct.Pin = GPIO_PIN_0;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;

  //把设置好的GP1o引脚参数写入对应端口的寄存器
  HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

    ////配置具体某个引脚的基本属性
  /*Configure GPIO pins : PG6 PG7 */
  GPIO_InitStruct.Pin = GPIO_PIN_6 | GPIO_PIN_7;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;

    //把设置好的GP1o引脚参数写入对应端口的寄存器
  HAL_GPIO_Init(GPIOG, &GPIO_InitStruct);
}

编译成功截图

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值