STM32-GPIO理论部分1
***本文章旨在于收集资料(来源官方手册,正点原子,野火等等网络上的各路资源),加上自己的理解,为方便自己的复习而创建,无盈利操作。***
1.功能介绍
GPIO的全称:General Purpose Input Output
- 从名字可以看出,作为通用输入输出端口的,检测引脚电平,输出高低电平。
- STM32一共有7组GPIO端口,GPIOA,B,C,D,E,F,G。
- 每个GPIO端口都有16个I/O引脚,stm公司的不同芯片引脚数目不同,所用到的GPIO端口数码不同。
- 操作每个GPIO端口所对应的操作寄存器(每组7种),可设置GPIO端口的模式(8种),电平状态。
- 除此之外,每个GPIO都有外部中断的功能,还可以复用为外设功能引脚(比如串口)。STM32的大部分脚除了当GPIO使用外,还可以
补充知识:
- 每个I/O端口位可以自由编程,然而必须按照32位字访问I/O端口寄存器(不允许半字或字节访问)。
- GPIOx_BSRR和GPIOx_BRR寄存器允许对任何GPIO寄存器进行读/更改的独立访问;这样,在读和更改访问之间产生IRQ时不会发生危险。
- (8.1.2 单独的位设置或位清除)单独的位设置或位清除当对GPIOx_ODR的个别位编程时,软件不需要禁止中断:在单次APB2写操作里,可以只更改一个或多个位。 这是通过对“置位/复位寄存器”(GPIOx_BSRR,复位是 GPIOx_BRR)中想要更改的位写’1’来实现的。没被选择的位将不被更改。
- (8.1.3 外部中断/唤醒线)所有端口都有外部中断能力。为了使用外部中断线,端口必须配置成输入模式。更多的关于外部中断的信息,参考9.2外部中断/事件控制器(EXTI); 9.2.3第节:唤醒事件管理。
- (8.1.4 复用功能(AF))也可以通过软件来模拟复用功能输入引脚,这种模拟可以通过对GPIO控制器编程来实现。此时,端口应当被设置为复用功能输出模式。显然,这时相应的引脚不再由外部驱动,而是通过GPIO控制器由软件来驱动。如果把端口配置成复用输出功能,则引脚和输出寄存器断开,并和片上外设的输出信号连接。 如果软件把一个GPIO脚配置成复用输出功能,但是外设没有被激活,它的输出将不确定。
- (8.1.5 软件重新映射I/O)复用功能为了使不同器件封装的外设I/O功能的数量达到最优,可以把一些复用功能重新映射到其他一些脚上。这可以通过软件配置相应的寄存器来完成(参考AFIO寄存器描述)。这时,复用功能就不再映射到它们的原始引脚上了。
- (8.1.6 GPIO锁定机制)锁定机制允许冻结IO配置。当在一个端口位上执行了锁定(LOCK)程序,在下一次复位之前,将不能再更改端口位的配置。
2.GPIO的结构与模式分析
以下是GPIO端口一个引脚的结构图:
GPIO有8种工作模式:
- 输入模式:浮空输入,上/下拉输入,模拟输入,复用功能输入
- 输出模式:开漏输出,推挽输出,复用开漏,复用推挽
⚀输入模式
- 输入缓冲器被禁止,输入开启
- 施密特触发输入被激活
- 根据输入配置(上拉,下拉或浮动)的不同,弱上拉和下拉电阻被连接
- 上下拉的配置,取决于ODR寄存器。
- 对输入数据寄存器的读访问可得到I/O状态
- 出现在I/O脚上的数据在每个APB2时钟被采样到输入数据寄存器
- 模拟输入时,禁止施密特触发输入,实现了每个模拟I/O引脚上的零消耗。施密特触发输出值被强置为’0‘, 弱上拉和下拉电阻被禁止,读取输入数据寄存器时数值为’0’。
⚁输出模式
- 输出、入缓冲器均被开启
- 施密特触发输入被激活
- 弱上拉和下拉电阻被禁止
- 控制输出模块相当于是一个反向器
- 开漏模式:输出寄存器上的’0’激活N-MOS,而输出寄存器上的’1’将端口置于高阻状态(P-MOS从不被激活)。
- 推挽模式:输出寄存器上的’0’激活N-MOS,而输出寄存器上的’1’将激活P-MOS。
- 在开漏模式时,对输入数据寄存器的读访问可得到I/O状态
- 在推挽式模式时,对输出数据寄存器的读访问得到最后一次写的值。
- 出现在I/O脚上的数据在每个APB2时钟被采样到输入数据寄存器
- 复用功能输出时,内置外设的信号驱动输出缓冲器
GPIO的模式配置查数据手册的8.1.11外设配置。
3.GPIO寄存器
每组GPIO含有7种寄存器,不同GPIO的寄存器组只是GPIO的标号不同,7种寄存器如下:
寄存器介绍 | 名称 | 功能介绍 | 偏移地址 |
两个32位配置寄存器 | GPIOx_CRL,GPIOx_CRH | 配置GPIO端口的工作模式 | 0x00 0x04 |
两个16位数据寄存器 | GPIOx_IDR,GPIOx_ODR | 输入(读)/输出(写)数据 | 0x08 0x0C |
一个32位置位/复位寄存器 | GPIOx_BSRR | 置1,置0 | 0x10 |
一个16位复位寄存器 | GPIOx_BRR | 置0 | 0x14 |
一个32位锁定寄存器 | GPIOx_LCKR | 锁定GPIO的模式 | 0x18 |
⚀配置寄存器
每组GPIO有两个32位寄存器,GPIO端口每个引脚的配置需要4bit,16*4=64,2个32位。