【STM32】GPIO——通用输入输出端口

GPIO是MCU最常用的东西了,掌握了它就掌握了一切。图片来源:正点原子HAL库课程

目录

[1 IO基本知识](#1 IO基本知识)

[1.1 一组GPIO](#1.1 一组GPIO)

[1.2 IO的类型](#1.2 IO的类型)

[1.3 保护二极管](#1.3 保护二极管)

[1.4 弱上下拉电阻(内部)](#1.4 弱上下拉电阻(内部))

[1.5 施密特触发器(肖特基触发器)](#1.5 施密特触发器(肖特基触发器))

[1.6 N-MOS和P-MOS](#1.6 N-MOS和P-MOS)

[2 GPIO的各种模式](#2 GPIO的各种模式)

[3 通用外设的驱动模型【四步法】(不只是GPIO,是所有外设)](#3 通用外设的驱动模型【四步法】(不只是GPIO,是所有外设))

[4 相关的HAL库文件(可以去这里找用到的函数和宏定义)](#4 相关的HAL库文件(可以去这里找用到的函数和宏定义))

[5 GPIO的配置【一个宏,四个函数】](#5 GPIO的配置【一个宏,四个函数】)

[6 注意事项⚠️](#6 注意事项⚠️)

[7 重映射](#7 重映射)

[7.1 本质](#7.1 本质)

[7.2 做法](#7.2 做法)

[7.3 相关的HAL库文件](#7.3 相关的HAL库文件)


1 IO基本知识

1.1 一组GPIO

PA、PB、PC......

一个Px就是一组,一组有16个IO端口

1.2 IO的类型

(1) CMOS端口

VDD为3.3V

(2) TTL端口

VDD_FT为兼容5V,可通过数据手册查看是否为TTL端口,数据手册中会写出"FT"

1.3 保护二极管

通过二极管的钳位作用,防止输入GPIO中的电压过大(STM32工作电压是2-3.6V)。如下图,保护二极管压降为0.3V,5V的输入经过其钳位后变为3.6V,安全。

但需要注意的是,直接接5V的话,保护二极管的电流过大,将会直接烧坏保护二极管,然后让电压直接进入IO,就完了。因此,要其起作用,必须接一个限流电阻。

保护二极管是一个很弱的保护,不要过于依赖。

1.4 弱上下拉电阻(内部)

因为其阻值为30-50kΩ,因此电流很小,所以驱动力较弱。

1.5 施密特触发器(肖特基触发器)

将非标准方波整形为标准方波。

1.6 N-MOS和P-MOS


2 GPIO的各种模式

注意⚠️:

  • 由于输出时施密特触发器是开着的,所以输出时可以通过输入功能获取输出值。
  • F1系列的输入使用上拉还是下拉,通过CRL和CRH是没办法设置的,需要使用ODR寄存器来设置
  • ODR和BSRR控制输出的区别
    • ST官方给的答案:使用ODR,在读和修改访问之间产生中断时,可能会发生风险;BSRR则无风险。

3 通用外设的驱动模型【四步法】(不只是GPIO,是所有外设)

  1. 初始化

(1) 时钟设置

(2) 参数设置

(3) IO设置(可选)

(4) 中断设置(可选)

  1. 定义读函数:从外设读数据(可选)

  2. 定义写函数:往外设写数据(可选)

  3. 编写中断服务函数:根据中断标志,处理外设各种中断事务(可选)


4 相关的HAL库文件(可以去这里找用到的函数和宏定义)

stm32f1xx_hal_rcc.h

stm32f1xx_hal_gpio.h

stm32f1xx_hal_gpio.c


5 GPIO的配置【一个宏,四个函数】


6 注意事项⚠️

  • 由于F103系列内部上下拉电阻不能用于输出,所以输出时设置上下拉没有意义;
  • 输入模式时设置GPIO的速度也没有意义;
  • 若不配置上下拉,那么默认是上拉;
  • GPIO输入和输出的SET和RESET是高低电平的意思,不是对元器件的置位和复位的描述。就像如果输入是上拉输入接按键,按键接地,那么按键不按下的时候IO输入就一直是SET,它的取反才是描述按键状态。下拉输入按键,按键接VCC的情况则刚好相反。

7 重映射

7.1 本质

  • 重映射功能本质是一个选取IO复用映射组别的功能,如下图,其其实只能选择组,部分重映射就是有一部分IO的复用功能还是和原来一样,完全重映射就是有关这个的IO复用完全重映射为另一个组,一个不留地改。
  • 由于其"选择分组"的本质,有时候对某个IO进行重映射时,会使得别的IO也被重映射,导致其原有的复用功能不可用。

7.2 做法

在使用TIMx的PWM功能的时候就有可能用到重映射功能了。

  • 如需要PB5使用输出PWM,首先查表,确认其支持TIMx_Chy功能:

由上图可看出PB5可以支持TIM3_CH2的重映射,可以对其进行重映射以支持PWM输出。

  • 在代码中,一般是在Msp_Init函数中,需要对管理重映射的外设AFIO的时钟进行使能:__HAL_RCC_AFIO_CLK_ENABLE();
  • 并使用__HAL_AFIO_REMAP_TIM3_ENABLE()或__HAL_AFIO_REMAP_TIM3_PARTIAL()进行重映射操作。

7.3 相关的HAL库文件

stm32f1xx_hal_gpio_ex.h

  • 使用的函数格式:

__HAL_AFIO_REMAP_重映射的外设名_ENABLE(); //完全映射

__HAL_AFIO_REMAP_重映射的外设名_PARTIAL(); //部分映射

相关推荐
国科安芯11 小时前
航天器多路并联大功率电源系统设计与ASP4644均流特性分析
单片机·嵌入式硬件·fpga开发·安全性测试
茯苓gao13 小时前
嵌入式开发笔记:CANopen相关移位运算与通信协议术语详解
网络·嵌入式硬件·学习·信息与通信
梁朝辉16 小时前
STM32H750VBT6中ADCINP与INN什么区别
stm32·单片机·嵌入式硬件
省四收割者17 小时前
一文详解信号完整性(1)
python·嵌入式硬件·数学建模·信息与通信·信号处理·智能硬件
崇山峻岭之间17 小时前
单片机无感FOC驱动之ADC
单片机·嵌入式硬件
Ligocious18 小时前
1.点亮一颗小小的LED
单片机·嵌入式硬件
KaifuZeng1 天前
通信与接口协议面试八、CAN通信
单片机·嵌入式硬件·面试·通信与接口协议
智源单片机设计1 天前
基于单片机的直流电机双闭环调速系统设计
单片机·嵌入式硬件
kebidaixu1 天前
两轮车换电 BMS 的模拟前端中颖 SH367306 AFE 芯片详解
stm32
kebidaixu1 天前
两轮车换电 BMS 的模拟前端中颖 SH367306 AFE 芯片调试实录:四个关键问题与解决方案
stm32