2-GPIO

目录

第1章 GPIO.. 2

1.1 课前准备... 2

1.1.1 学习方向... 2

1.1.2 参考资料... 2

1.2 GPIO概述... 2

1.2.1 GPIO介绍... 2

1.2.2 GPIO引脚... 2

1.2.3 GPIO的寄存器数量... 3

1.2.4 功能描述... 3

1.3 GPIO框图分析... 4

1.3.1 关键名称... 4

1.3.2 输入框图分析... 4

1.3.3 输出框图分析... 4

1.4 GPIO寄存器... 5

1.4.1 寄存器介绍... 5

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.4.9 GPIO时钟控制... 7

1.5 程序配置步骤... 7

1.6 GPIO实战... 7

1.6.1 点亮LED灯... 7

1.6.2 驱动蜂鸣器... 7

1.6.3 按键... 8

1.6.4 火焰传感器... 8

1.7 位带操作... 8

第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 驱动蜂鸣器

无源蜂鸣器是没有正负之分的,类似于喇叭,只要在两个腿上加载不同的频率的电信号就可以实现发声,根据不同的频率所发出的声音也是不一样的。
有源蜂鸣器是有正负之分的,只需要在两个腿上加上电压信号就会发声,发出的声音音调单一、频率固定。
有源蜂鸣器比无源蜂鸣器内部多了振荡结构,所以有源蜂鸣器在价格上稍微贵一点。

image

硬件分析:IO口给高电平三极管导通,要控制蜂鸣器响,要配置为输出,为推挽输出。

编程思路:

      初始化

         时钟使能

         配置为输出模式

         输出类型为推挽

         输出速度(低速)

         无上下拉

      控制

         改变输出数据寄存器对应位

1.6.3 按键

image

 

按键1未按下时外界给MCU一个低电平    按下时给高电平

按键2未按下时外界给MCU一个高电平    按下时给低电平

按键3未按下时外界给MCU一个高电平    按下时给低电平

按键4未按下时外界给MCU一个高电平    按下时给低电平

找到按键连接的IO口

配置按键

   初始化

          时钟使能
   配置为通用输入模式
     浮空(上拉)

    检测  端口的输入数据寄存器

作业:
按键1按下时,LED1亮  未按下时灭
按键2按下时,LED2亮  未按下时灭
按键3按下时,LED3亮  未按下时灭
按键4按下时,LED4亮  未按下时灭

1.6.4 火焰传感器

硬件分析:

image

image

目前,我们只使用DO口,数字输出口

传感器                      开发板

VCC                         3V3

GND                        GND

DO                          PA4

模块的DO为输出(固定),那么开发板想要接受DO口的数据,应该配置为通用输入模式,通过模块原理图可知,外界了上拉电阻,PA4可配置为浮空输入,若找不到模块原理图,也可开启上拉输入。

 

练习:去模拟一个场景,当有火焰时,蜂鸣器报警,无火焰时,蜂鸣器不报警。

火焰配置:

初始化

  时钟使能

  PA4配置为通用输入模式

   浮空(上拉)

  检测  GPIOA端口的输入数据寄存器的位4(获取某一位的状态)

If(这一位的状态为1)
{
蜂鸣器不响;
}Else
{
蜂鸣器报警;
}

1.7 位带操作

 

posted @ 2025-07-28 19:57  微笑的''80  阅读(20)  评论(0)    收藏  举报