【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(); //部分映射

相关推荐
m0_748254091 小时前
STM32--超声波模块(HC—SR04)(标准库+HAL库)
stm32·单片机·嵌入式硬件
南城花随雪。1 小时前
单片机:实现FFT快速傅里叶变换算法(附带源码)
单片机·嵌入式硬件·算法
逝灮1 小时前
【蓝桥杯——物联网设计与开发】基础模块8 - RTC
stm32·单片机·嵌入式硬件·mcu·物联网·蓝桥杯·rtc
LXL_242 小时前
模拟——郑益慧_笔记1_绪论
嵌入式硬件
weixin_452600698 小时前
串行时钟保持芯片D1380/D1381,低功耗工作方式自带秒、分、时、日、日期、月、年的串行时钟保持芯片,每个月多少天以及闰年能自动调节
科技·单片机·嵌入式硬件·时钟·白色家电电源·微机串行时钟
森旺电子11 小时前
51单片机仿真摇号抽奖机源程序 12864液晶显示
单片机·嵌入式硬件·51单片机
不过四级不改名67713 小时前
蓝桥杯嵌入式备赛教程(1、led,2、lcd,3、key)
stm32·嵌入式硬件·蓝桥杯
小A15913 小时前
STM32完全学习——SPI接口的FLASH(DMA模式)
stm32·嵌入式硬件·学习
Rorsion13 小时前
各种电机原理介绍
单片机·嵌入式硬件
善 .16 小时前
单片机的内存是指RAM还是ROM
单片机·嵌入式硬件