【嵌入式学习笔记】嵌入式入门1——GPIO

1.什么是GPIO

General Purpose Input Output,即通用输入输出端口,简称GPIO,作用是负责采集外部器件的信息或者控制外部器件工作,即输入输出。
【嵌入式学习笔记】嵌入式入门1——GPIO_第1张图片

2.STM32 GPIO简介

2.1.GPIO特点

  • 不同型号,IO口数量可能不一样,可通过选型手册快速查询
  • 快速翻转,每次翻转最快只需要两个时钟周期(F1最高速度可以到50Mhz)
  • 每个IO口都可以做中断
  • 支持8种工作模式

2.2.GPIO电气特性

  • STM32工作电压范围——2 V ≤ VDD ≤ 3.6 V

  • GPIO识别电压范围——COMS端口-0.3V ≤ VIL ≤ 1.164V,1.833V ≤ VIH ≤ 3.6V,部分兼容TTL

  • GPIO输出电流——单个IO,最大25mA

详情参考STM32的数据手册

2.3.GPIO引脚分布

STM32引脚类型:电源引脚、晶振引脚、复位引脚、下载引脚、BOOT引脚、GPIO引脚

【嵌入式学习笔记】嵌入式入门1——GPIO_第2张图片
【嵌入式学习笔记】嵌入式入门1——GPIO_第3张图片
IO引脚分布特点:按组存在、组数视芯片而定、每组最多16个IO引脚

3.IO端口基本结构介绍

  • F1系列IO端口基本结构
    ① 保护二极管
    ② 内部上拉、下拉电阻
    ③ 施密特触发器
    ④ P-MOS & N-MOS管
    【嵌入式学习笔记】嵌入式入门1——GPIO_第4张图片

  • F4/F7/H7系列IO端口基本结构
    【嵌入式学习笔记】嵌入式入门1——GPIO_第5张图片

  • 施密特触发器:施密特触发器就是一种整形电路,可以将非标准方波,整形成方波
    【嵌入式学习笔记】嵌入式入门1——GPIO_第6张图片

  • P-MOS & N-MOS管:MOS管是压控型元件,通过控制栅源电压( Vgs )来实现导通或关闭
    【嵌入式学习笔记】嵌入式入门1——GPIO_第7张图片

4.GPIO的八种模式分析

模式 特点及应用
浮空输入 输入用,完全浮空,状态不定
上拉输入 输入用,用内部上拉,默认是高电平
下拉输入 输入用,用内部下拉,默认是低电平
模拟功能 ADC、DAC
开漏输出 软件IIC的SDA、SCL等
推挽输出 驱动能力强,25mA(max),通用输出
开漏复用 片上外设功能(硬件IIC 的SDA、SCL引脚等)
推挽复用 片上外设功能(SPI 的SCK、MISO、MOSI引脚等

4.1.浮空输入

【嵌入式学习笔记】嵌入式入门1——GPIO_第8张图片

4.2.上拉输入

【嵌入式学习笔记】嵌入式入门1——GPIO_第9张图片

4.3.下拉输入

【嵌入式学习笔记】嵌入式入门1——GPIO_第10张图片

4.4.模拟功能

【嵌入式学习笔记】嵌入式入门1——GPIO_第11张图片

4.5.开漏输出

【嵌入式学习笔记】嵌入式入门1——GPIO_第12张图片

4.6.推挽输出

【嵌入式学习笔记】嵌入式入门1——GPIO_第13张图片

4.7.开漏复用

【嵌入式学习笔记】嵌入式入门1——GPIO_第14张图片

4.8.推挽复用

【嵌入式学习笔记】嵌入式入门1——GPIO_第15张图片

4.9.F4/F7/H7系列和F1系列的GPIO差异点

  • F1在输出模式,禁止使用内部上下拉,F4/F7/H7在输出模式,可以使用内部上下拉
  • 不同系列IO翻转速度可能不同

【STM32能输出5V的电平吗?——可以,兼容5V的引脚可以】

5.GPIO寄存器介绍

在F1系列和F4/F7/F7系列的GPIO中,选择GPIO模式的寄存器不同,控制输入输出的寄存器相同
【嵌入式学习笔记】嵌入式入门1——GPIO_第16张图片

5.1.F1/F4/F7/H7相同GPIO寄存器

  • 端口输入数据寄存器IDR——用于判断IO引脚的电平
    【嵌入式学习笔记】嵌入式入门1——GPIO_第17张图片
  • 端口输出数据寄存器ODR——用于设置IO引脚输出的电平
    【嵌入式学习笔记】嵌入式入门1——GPIO_第18张图片
  • 端口位设置/清除寄存器BSRR——用于设置ODR寄存器
    【嵌入式学习笔记】嵌入式入门1——GPIO_第19张图片

5.2.F1系列特有GPIO寄存器

  • 端口配置低/高寄存器CRL/CRH——设置工作模式、输出速度
    【嵌入式学习笔记】嵌入式入门1——GPIO_第20张图片

5.3.F4/F7/H7系列特有GPIO寄存器

  • GPIO 端口模式寄存器MODER——用于设置模式
    【嵌入式学习笔记】嵌入式入门1——GPIO_第21张图片
  • GPIO 端口输出类型寄存器OTYPER——用于设置输出类型
    【嵌入式学习笔记】嵌入式入门1——GPIO_第22张图片
  • GPIO 端口输出速度寄存器OSPEEDR——用于设置IO的输出速度
    【嵌入式学习笔记】嵌入式入门1——GPIO_第23张图片
  • GPIO 端口上拉/下拉寄存器(PUPDR)用于设置上拉/下拉电阻
    【嵌入式学习笔记】嵌入式入门1——GPIO_第24张图片

5.4.F1系列与F4/F7/H7系列工作模式配置

  • F1系列
    输入上拉/下拉电阻通过ODR寄存器来设置
    【嵌入式学习笔记】嵌入式入门1——GPIO_第25张图片
  • F4/F7/H7系列
    【嵌入式学习笔记】嵌入式入门1——GPIO_第26张图片

5.5.ODR和BSRR寄存器控制输出的区别

ST官方给的答案:使用ODR,在读和修改访问之间产生中断时,可能会发生风险;BSRR无风险。建议使用BSRR控制输出

ODR修改:读->->写
GPIOB->ODR |= 1 << 3;         	/* PB3 = 1 */
BSRR修改:写 
GPIOB->BSRR = 0x00000008;      	/* PB3 = 1 */

6.通用外设驱动模型(四步法)

【嵌入式学习笔记】嵌入式入门1——GPIO_第27张图片

7.GPIO配置步骤

  • 使能时钟 __HAL_RCC_GPIOx_CLK_ENABLE()

  • 设置工作模式 HAL_GPIO_Init()

  • 设置输出状态(可选) HAL_GPIO_WritePin() 、HAL_GPIO_TogglePin()

  • 读取输入状态(可选) HAL_GPIO_ReadPin()
    【嵌入式学习笔记】嵌入式入门1——GPIO_第28张图片

  • 关键结构体

// F1
typedef struct 
{ 
  uint32_t Pin;        	/* 引脚号 */ 
  uint32_t Mode;   		/* 模式设置 */ 
  uint32_t Pull;       	/* 上拉下拉设置 */ 
  uint32_t Speed;  		/* 速度设置 */ 
} GPIO_InitTypeDef;
// F4/F7/H7
typedef struct 
{ 
  uint32_t Pin;    		/* 引脚号 */ 
  uint32_t Mode;        /* 模式设置 */ 
  uint32_t Pull;        /* 上拉下拉设置 */ 
  uint32_t Speed;       /* 速度设置 */
  uint32_t Alternate; 	/* 复用功能 */
} GPIO_InitTypeDef;

8.编程实战:点亮一个LED灯/跑马灯

分析IO输出模式——推挽输出
【嵌入式学习笔记】嵌入式入门1——GPIO_第29张图片

9.编程实战:通过一个按键控制一个LED灯亮灭

【嵌入式学习笔记】嵌入式入门1——GPIO_第30张图片
【嵌入式学习笔记】嵌入式入门1——GPIO_第31张图片
【编程实战代码暂不贴出】

你可能感兴趣的:(嵌入式学习专栏(STM32),学习,笔记,单片机,stm32,嵌入式硬件)