2-GPIO
1.4.2 GPIO 端口模式寄存器 (GPIOx_MODER) (x = A..I) 5
1.4.3 GPIO 端口输出类型寄存器 (GPIOx_OTYPER) (x = A..I) 5
1.4.4 GPIO 端口输出速度寄存器 (GPIOx_OSPEEDR) (x = A..I/) 6
1.4.5 GPIO 端口上拉/下拉寄存器 (GPIOx_PUPDR) (x = A..I/) 6
1.4.6 GPIO 端口输入数据寄存器 (GPIOx_IDR) (x = A..I) 6
1.4.7 GPIO 端口输出数据寄存器 (GPIOx_ODR) (x = A..I) 7
1.4.8 GPIO 端口置位/复位寄存器 (GPIOx_BSRR) (x = A..I) 7
第1章 GPIO
1.1 课前准备
1.1.1 学习方向
GPIO概述
GPIO框图
GPIO模式
GPIO寄存器的使用
GPIO实验(LED 蜂鸣器 按键 传感器)
什么是GPIO 怎么用GPIO 什么时候用什么模式
1.1.2 参考资料
《STM32中文参考手册》
《芯片数据手册》
《开发板原理图》
1.2 GPIO概述
1.2.1 GPIO介绍
GPIO(英语:General-purpose input/output),通用型输入输出的简称,功能类似8051的P0—P3,其引脚可以供使用者由程控自由使用,IO口根据现实需要配置为对应功能。
作用:芯片去与外界交流的唯一渠道
简称:I/O口(引脚不一定是IO口,IO口一定为引脚)
一句话:GPIO就是单片机的“手脚”,让它能跟外界互动!

引脚数量有100个但能作为IO口使用的只有82个。
1.2.2 GPIO引脚
对于STM32来说,其引脚划分可以以端口号来进行划分,GPIOA、GPIOB、GPIOC、GPIOD、GPIOE、GPIOF、GPIOG....,(A、B、C、等为端口)其中每组端口号下面最多有16个引脚,GPIOA(PA0~PA15),GPIOB(PB0~PB15)(1 2 3 4为引脚号).......
端口号:GPIOA、GPIOB、GPIOC、GPIOD……….
STM32F407VGT6 5组:GPIOA, GPIOB……….GPIOE 每一组有0~15号(16个)//16*5=80 PH0 PH1
GPIOA0 :GPIOA端口的0号引脚
GPIOB4: GPIOB端口的4号引脚
GPIOC15: GPIOC端口的15号引脚
简称:PA0 PB4 PC15
GPIO控制器:每组都有一个GPIO控制器控制16个IO口


1.2.3 GPIO的寄存器数量
每个通用 I/O 端口包括 4 个 32 位配置寄存器( GPIOx_MODER、 GPIOx_OTYPER、GPIOx_OSPEEDR 和 GPIOx_PUPDR)、 2 个 32 位数据寄存器(GPIOx_IDR 和GPIOx_ODR)、 1 个 32 位置位/复位寄存器 (GPIOx_BSRR)、 1 个 32 位锁定寄存器(GPIOx_LCKR) 和 2 个 32 位复用功能选择寄存器( GPIOx_AFRH 和 GPIOx_AFRL)。
1.2.4 功能描述
根据数据手册中列出的每个 I/O 端口的特性,可通过软件将通用 I/O (GPIO) 端口的各个端口位分别配置为多种模式:
- 输入浮空
- 输入上拉
- 输入下拉
- 模拟功能
- 具有上拉或下拉功能的开漏输出
- 具有上拉或下拉功能的推挽输出
- 具有上拉或下拉功能的复用功能推挽
- 具有上拉或下拉功能的复用功能开漏
每个 I/O 端口位均可自由编程,但 I/O 端口寄存器必须按 32 位字、半字或字节进行访问。GPIOx_BSRR 寄存器旨在实现对 GPIO ODR 寄存器进行原子读取/修改访问。这样便可确保在读取和修改访问之间发生中断请求也不会有问题。
1.3 GPIO框图分析
1.3.1 关键名称
寄存器:是一块存储空间,一般都是32位,每一位或者多位可以配置对应控制器的属性
保护二极管: 可以将输入进来的电信号限制到一定范围内,保护内部电路。
上/下拉电阻(弱):在引脚浮空的状态下,可将引脚电平状态拉高或拉低
施密特触发器: 整理波形,将电信号确定为3V3或者0V
1.3.2 输入框图分析
通用输入:直接读(检测)IO口的电平状态(如果需要读取外界给IO口的电平状态,就要用通用输入)
复用输入:从IO进来的数据信号要经过片上外设(串口控制器),再到核心。IO就要用复用输入模式
模拟输入:外界的模拟量(电压)通过IO口进入到ADC控制器,ADC控制器转换成数字量,IO模拟输入复用功能。

通用输入说明:
①如何读取电平状态,通过读输入数据寄存器的对应位是0还是1,来确定IO高低电平
②上下拉电阻作用
在通用输入的时候,也就是在读某个IO的电平的时候
一定要让此IO口先保持一个电平状态,这样才能检测到不同电平状态。
如何保持电平状态?
1、可以通过芯片内部的上下拉电阻,由于是弱上下拉一般不用
2、硬件外界一个上拉电阻或者下拉电阻
1.3.3 输出框图分析
通用输出:核心直接控制IO输出高低电平,就用通用输出模式
复用输出:核心将数据信号发送到片上外设,片上外设再通过IO口传送出去.IO口复用输出模式
模拟输出: 核心将数字信号发送到DAC上,DAC将数字信号转换成电压值,通过IO出去(模拟输出)
通用输出说明:
①输出原则:对输出数据寄存器的对应位写0 或 1,就可以控制对应编号的IO口输出低/高电平
②输出类型
推挽输出:IO口可以输出高电平,也可以输出低电平
开漏输出:IO口只能输出低电平
所以:在输出的时候,要选择推挽或者开漏
③对于输出上下拉起到什么作用
1、放大电信号
2、降低功耗,但是电阻太大,电信号太弱,不用
输入和输出部分框图总结:
- 一个IO可以有几种模式选择以及使用场景
输入:通用输入 复用输入 模拟输入
输出:通用输出 复用输出 模拟输出
所以如果需要使用一个IO口,首先要确定模式
- 通用输入和通用输出的详细说明
- 根据框图中GPIO的工作过程,知道大致需要配置的属性
通用输入
配置为通用输入模式
上下拉电阻
输入数据寄存器
复用输入
配置为复用输入模式
上下拉电阻
模拟输入
配置为模拟输入模式
通用输出
配置为通用输出模式
置位/复位或者输出数据寄存器
输出类型
上下拉
复用输出
配置为复用输出模式
输出类型
上下拉
模拟输出
配置为模拟输出模式
1.4 GPIO寄存器
看寄存器的名字
看寄存器有什么功能
看寄存器是几个位控制一个引脚或者一个功能
1.4.1 寄存器介绍
1.4.2 GPIO 端口模式寄存器 (GPIOx_MODER) (x = A..I)

1.4.3 GPIO 端口输出类型寄存器 (GPIOx_OTYPER) (x = A..I)

1.4.4 GPIO 端口输出速度寄存器 (GPIOx_OSPEEDR) (x = A..I/)

1.4.5 GPIO 端口上拉/下拉寄存器 (GPIOx_PUPDR) (x = A..I/)

1.4.6 GPIO 端口输入数据寄存器 (GPIOx_IDR) (x = A..I)

1.4.7 GPIO 端口输出数据寄存器 (GPIOx_ODR) (x = A..I)

1.4.8 GPIO 端口置位/复位寄存器 (GPIOx_BSRR) (x = A..I)

1.4.9 GPIO时钟控制

1.5 程序配置步骤
先去看模块的引脚资源,看引脚名大概猜测其引脚有什么作用。
去看模块的手册,熟悉模块的工作原理
根据工作原理设计程序
1.6 GPIO实战
1.6.1 点亮LED灯

硬件分析:LED1连接的IO口给高电平熄灭,给低电平亮。通用输出模式,推挽输出。
编程思路:
时钟使能(GPIOC)
配置为通用输出模式
配置输出类型为推挽
不开启上拉和下拉电阻
配置IO口输出速度(低速就行)
控制输出数据寄存器对应位
作业:把其他的灯全部点亮
进阶:把按键的驱动代码写了
所有灯开的函数
所有灯关的函数
某个灯开的函数
某个灯关的函数
粗略延时
__NOP();
1.6.2 驱动蜂鸣器
无源蜂鸣器是没有正负之分的,类似于喇叭,只要在两个腿上加载不同的频率的电信号就可以实现发声,根据不同的频率所发出的声音也是不一样的。
有源蜂鸣器是有正负之分的,只需要在两个腿上加上电压信号就会发声,发出的声音音调单一、频率固定。
有源蜂鸣器比无源蜂鸣器内部多了振荡结构,所以有源蜂鸣器在价格上稍微贵一点。

硬件分析:IO口给高电平三极管导通,要控制蜂鸣器响,要配置为输出,为推挽输出。
编程思路:
初始化
时钟使能
配置为输出模式
输出类型为推挽
输出速度(低速)
无上下拉
控制
改变输出数据寄存器对应位
1.6.3 按键

按键1未按下时外界给MCU一个低电平 按下时给高电平
按键2未按下时外界给MCU一个高电平 按下时给低电平
按键3未按下时外界给MCU一个高电平 按下时给低电平
按键4未按下时外界给MCU一个高电平 按下时给低电平
找到按键连接的IO口
配置按键
初始化
时钟使能
配置为通用输入模式
浮空(上拉)
检测 端口的输入数据寄存器
作业:
按键1按下时,LED1亮 未按下时灭
按键2按下时,LED2亮 未按下时灭
按键3按下时,LED3亮 未按下时灭
按键4按下时,LED4亮 未按下时灭
1.6.4 火焰传感器
硬件分析:


目前,我们只使用DO口,数字输出口
传感器 开发板
VCC 3V3
GND GND
DO PA4
模块的DO为输出(固定),那么开发板想要接受DO口的数据,应该配置为通用输入模式,通过模块原理图可知,外界了上拉电阻,PA4可配置为浮空输入,若找不到模块原理图,也可开启上拉输入。
练习:去模拟一个场景,当有火焰时,蜂鸣器报警,无火焰时,蜂鸣器不报警。
火焰配置:
初始化
时钟使能
PA4配置为通用输入模式
浮空(上拉)
检测 GPIOA端口的输入数据寄存器的位4(获取某一位的状态)
If(这一位的状态为1)
{
蜂鸣器不响;
}Else
{
蜂鸣器报警;
}
1.7 位带操作

浙公网安备 33010602011771号