STM32 GPIO操作指导

1. 查看手册使用寄存器点亮一个LED

  1. 通过手册查找GPIO端口外设的时钟对应的寄存器,并配置该寄存器打开要使用的外设时钟
  2. 查找外设GPIO的映射地址
  3. 设置GPIO输出低电平

1.1 查找GPIO外设的映射地址

  1. 查看芯片参考手册,从系统架构图中查找要操作的接口挂在在那条总线上。由图可知,我们要操作的GPIO挂载在APB2总线上

    image-20220514132122764

  2. 根据参考手册到 APB2 总线的基地址是 0x40010000,GPIOC的在APB2上基地址是0x40011000

    image-20220514132417213

    image-20220514132558709

1.2 设置GPIO端口输出低电平

  1. 通过手册查看GPIO接口寄存器含义和地址,我们需要将GPIOC_13 设置为输出低电平,查看GPIO使用方法

    image-20220514133124665

    image-20220514133232715

  2. 查看GPIO相关寄存器,GPIO接口配置有如下寄存器,寄存器的详细介绍见GPIO相关寄存器章节,配置GPIOC_13为输出,并输出低电平

    寄存器含义寄存器名
    GPIOx_CRL(x=A…E)配置GPIO0-GPIO7的端口模式端口配置低寄存器
    GPIOx_CRH(x=A…E)配置GPIO8-GPIO15的端口模式端口配置高寄存器
    GPIOx_IDR(x=A…E)端口输入数据寄存器
    GPIOx_ODR(x=A…E)端口输出数据寄存器
    GPIOx_BSRR(x=A…E)端口位设置/清除寄存器
    GPIOx_BRR(x=A…E)端口位清除寄存器
    GPIOx_LCKR(x=A…E)端口配置锁定寄存器

1.3 查手册找GPIO端口对应时钟

  1. 查询手册找到APB2总线上要操作的GPIO对应的时钟,并打开

    RCC_APB2ENR APB2外设时钟使能寄存器

    偏移地址0x18

    复位值 0x0000000000

    寄存器对应位为0表示对应外设时钟关闭,为1表示对应外设时钟开启

    image-20220514135545376

  2. 找到外设RCC在AHB总线上,起始地址为0x40021000

    image-20220514132332756

  3. 打开GPIOC端口外设的时钟,找到对应的寄存器地址为:0x40021018,GPIOC端口时钟对应的是该寄存器的第4位,因此将改为置1即可

2. GPIO简介

2.1 简介

GPIO —— General Purpose Intput Output

是通用输入输出端口的简称,是软件可控制的引脚。STM32芯片的GPIO引脚与外部设备连接起来,从而实现与外部通讯、控制以及数据的采集功能。

GPIO功能查找:

查看STM32官方的数据手册,通过数据手册查看各引脚定义就可以查到每个GPIO的功能。

2.2 GPIO 框图解读

image-20220514144241699

最右边对应我们芯片上的引脚。IO口直接接电机会烧坏芯片。因为直接接电机时电机产生的反向电动势会直接进入芯片内部,IO口的两个保护二极管来不及起作用,于是导致芯片被烧坏。

这边的电路图稍微提一下:

保护二极管:IO引脚上下两边两个二极管用于防止引脚外部过高、过低的电压输入。当引脚电压高于VDD时,上方的二极管导通;当引脚电压低于VSS时,下方的二极管导通,防止不正常电压引入芯片导致芯片烧毁。但是尽管如此,还是不能直接外接大功率器件,须加大功率及隔离电路驱动,防止烧坏芯片或者外接器件无法正常工作。
P-MOS管和N-MOS管:由P-MOS管和N-MOS管组成的单元电路使得GPIO具有“推挽输出”和“开漏输出”的模式。这里的电路会在下面很详细地分析到。
TTL肖特基触发器:信号经过触发器后,模拟信号转化为0和1的数字信号。但是,当GPIO引脚作为ADC采集电压的输入通道时,用其“模拟输入”功能,此时信号不再经过触发器进行TTL电平转换。ADC外设要采集到的原始的模拟信号。
这里需要注意的是,在查看《STM32中文参考手册V10》中的GPIO的表格时,会看到有“FT”一列,这代表着这个GPIO口时兼容3.3V和5V的;如果没有标注“FT”,就代表着不兼容5V

2.2.1 推挽输出 — 2

img

推挽输出模式下,通过设置位设置/清除寄存器或者输出数据寄存器的值,途经P-MOS管和N-MOS管,最终输出到I/O端口。这里要注意P-MOS管和N-MOS管,当设置输出的值为高电平的时候,P-MOS管处于开启状态,N-MOS管处于关闭状态,此时I/O端口的电平就由P-MOS管决定:高电平;当设置输出的值为低电平的时候,P-MOS管处于关闭状态,N-MOS管处于开启状态,此时I/O端口的电平就由N-MOS管决定:低电平。同时,I/O端口的电平也可以通过输入电路进行读取;注意,此时I/O端口的电平一定是输出的电平。

对应配置的寄存器为GPIOx_CRL和GPIOx_CRH。每四位对应一个GPIO。

特性:

  1. 可以输出高低电平,用于连接数字器件,高电平有VDD(3.3V)决定,低电平有VSS决定
  2. 推挽结构指两个三极管受两路互补的信号控制,总是在一个导通的时候另一个截止。优点是开关效率高,电流大,驱动能力强。
  3. 输出高电平时,电流输出到负载,叫灌电流,可以理解为推,输出低电平时,负载电流流向芯片,叫拉电流,即挽

ODR输出1时,具体如下:

image-20220514145333178

ODR输出0时,具体如下:

image-20220514145424535

推挽复用输出

img

推挽复用输出模式,与推挽输出模式很是类似。只是输出的高低电平的来源,不是让CPU直接写输出数据寄存器,取而代之利用片上外设模块的复用功能输出来决定的。

2.2.2 开漏输出 - 与推挽输出相对的 — 2

img

开漏输出模式下,通过设置位设置/清除寄存器或者输出数据寄存器的值,途经N-MOS管,最终输出到I/O端口。这里要注意N-MOS管,当设置输出的值为高电平的时候,N-MOS管处于关闭状态,此时I/O端口的电平就不会由输出的高低电平决定,而是由I/O端口外部的上拉或者下拉决定;当设置输出的值为低电平的时候,N-MOS管处于开启状态,此时I/O端口的电平就是低电平。同时,I/O端口的电平也可以通过输入电路进行读取;注意,I/O端口的电平不一定是输出的电平。

开漏输出只能输出低电平,不能输出高电平。

image-20220514145703058

特性:

  1. 只能输出低电平,不能输出高电平
  2. 如果要输出高电平,则需要外接上拉电阻
  3. 开漏输出具有“线与”功能,一个为低,全部为低,多用于I2C和SMBUS总线。

开漏复用输出

img

开漏复用输出模式,与开漏输出模式很是类似。只是输出的高低电平的来源,不是让CPU直接写输出数据寄存器,取而代之利用片上外设模块的复用功能输出来决定的。

2.2.3 输出数据寄存器 — 3

对应ODR寄存器,每一位代表一个GPIO口。操作ODR寄存器控制GPIO端口输出高电平或低电平,也可以通过控制位设置/清除寄存器间接控制ODR寄存器进行输出。其具体含义参考2.3章节。

2.2.4 复用功能输出 — 4

image-20220514153659284

2.2.5 上拉输入

img

上拉输入模式下,I/O端口的电平信号直接进入输入数据寄存器。但是在I/O端口悬空(在无信号输入)的情况下,输入端的电平可以保持在高电平;并且在I/O端口输入为低电平的时候,输入端的电平也还是低电平。

2.2.6 下拉输入

img

下拉输入模式下,I/O端口的电平信号直接进入输入数据寄存器。但是在I/O端口悬空(在无信号输入)的情况下,输入端的电平可以保持在低电平;并且在I/O端口输入为高电平的时候,输入端的电平也还是高电平。

2.2.7 模拟输入

img

模拟输入模式下,I/O端口的模拟信号(电压信号,而非电平信号)直接模拟输入到片上外设模块,比如ADC模块等等。

2.2.8 浮空输入模式

img

浮空输入模式下,I/O端口的电平信号直接进入输入数据寄存器。也就是说,I/O的电平状态是不确定的,完全由外部输入决定;如果在该引脚悬空(在无信号输入)的情况下,读取该端口的电平是不确定的。

2.3 GPIO 相关寄存器

2.3.1 端口配置低寄存器 (GPIOx_CRL)

偏移地址:0x00

复位值:0x4444 4444

image-20220514151841011

2.3.2 端口配置高寄存器 (GPIOx_CRH)

偏移地址:0x04

复位值:0x4444 4444

image-20220514151928763

2.3.3 端口输入数据寄存器 (GPIOx_IDR)

偏移地址:0x08

复位值:0x0000 XXXX

image-20220514152055319

2.3.4 端口输出数据寄存器 (GPIOx_ODR)

偏移地址:0x0C

复位值:0x0000 0000

image-20220514152243275

将ODR寄存器的位置1输出高电平,写0输出低电平。

2.3.5 端口位设置/清除寄存器 (GPIOx_BSRR)

偏移地址:0x10

复位值:0x0000 0000

该寄存器写1置位,写0无效,低16位写1将对应的GPIO位置1,高16位写1将对应的GPIO为清0。当设置为输入是,上拉输入往低16位写1,下拉往高16位写1

2.3.6 端口位清除寄存器 (GPIOx_BRR)

偏移地址:0x14

复位值:0x0000 0000

image-20220514152453778

image-20220514152511426

该寄存器写1置位,写0无效,低16位写1将对应的GPIO为清0,高16位保留。

2.3.7 端口配置锁定寄存器 (GPIOx_LCKR)

偏移地址:0x18

复位值:0x0000 0000

image-20220514152545287

2.4 总结

  1. GPIO使用

    • 选定具体的GPIO
    • 打开对应GPIO端口时钟(RCC_APB2ENR )
    • 配置GPIO工作模式 (CRL和CRH寄存器)
    • 控制GPIO输出高低电平(ODR、BRR和BSRR)
  2. 开漏输出和推挽输出的区别?

​ 开漏输出:只可以输出强低电平,高电平得靠外部电阻拉高。输出端相当于三极管的集电极。适合于做电流型的驱动,其吸收电流的能力相对强(一般20ma以内);
推挽输出:可以输出强高、低电平,连接数字器件。
关于推挽输出和开漏输出,最后用一幅最简单的图形来概括:

img

该图中左边的便是推挽输出模式,其中比较器输出高电平时下面的PNP三极管截止,而上面NPN三极管导通,输出电平VS+;当比较器输出低电平时则恰恰相反,PNP三极管导通,输出和地相连,为低电平。右边的则可以理解为开漏输出形式,需要接上拉。

  1. 在STM32中选用怎样选择I/O模式?

浮空输入_IN_FLOATING ——浮空输入,可以做KEY识别,RX1
带上拉输入_IPU——IO内部上拉电阻输入
带下拉输入_IPD—— IO内部下拉电阻输入
模拟输入_AIN ——应用ADC模拟输入,或者低功耗下省电
开漏输出_OUT_OD ——IO输出0接GND,IO输出1,悬空,需要外接上拉电阻,才能实现输出高电平。当输出为1时,IO口的状态由上拉电阻拉高电平,但由于是开漏输出模式,这样IO口也就可以由外部电路改变为低电平或不变。可以读IO输入电平变化,实现C51的IO双向功能
推挽输出_OUT_PP ——IO输出0-接GND, IO输出1 -接VCC,读输入值是未知的
复用功能的推挽输出_AF_PP ——片内外设功能(I2C的SCL、SDA)
复用功能的开漏输出_AF_OD——片内外设功能(TX1、MOSI、MISO.SCK.SS)

输入电平控制高低:

image-20220514161609524

  • 4
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

XYJ_Tiger

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值