GPIO工作原理:寄存器描述和配置方法
笔记基于正点原子官方视频
视频连接https://www.bilibili.com/video/BV1Wx411d7wT?p=71&spm_id_from=333.1007.top_right_bar_window_history.content.click
如有侵权,联系删除
每组GPIO端口的寄存器包括:
- 一个端口模式寄存器(GPIOx_MODER)
- 一个端口输出类型寄存器(GPIOx_OTYPER)
- 一个端口输出速度寄存器(GPIOx_OSPEEDR)
- 一个端口上拉下拉寄存器(GPIOx_PUPDR)
- 一个端口输入数据寄存器(GPIOx_IDR)
- 一个端口输出数据寄存器(GPIOx_ODR)
- 一个端口置位/复位寄存器(GPIOx_BSRR)
- 一个端口配置锁存寄存器(GPIOx_LCKR)
- 两个复用功能寄存器(低位GPIOx_AFRL & GPIOx_AFRH)
**注意:**前四个(GPIOx_MODER)(GPIOx_OTYPER)(GPIOx_OSPEEDR)(GPIOx_PUPDR)为32位配置寄存器,后面两个(GPIOx_IDR)(GPIOx_ODR)为32位数据寄存器,后面依次为(GPIOx_BSRR)32位置位/复位寄存器、(GPIOx_LCKR)32位锁存寄存器、(低位GPIOx_AFRL & GPIOx_AFRH)32位复用功能寄存器
说明:
① 每组IO口由10个寄存器组成,如果芯片有GPIOA~GPIOI 9个组,那么一共有对应9X10=90个寄存器。
② 如果配置一个IO口需要2个位,那么刚好32位寄存器配置一组IO口16个IO口
③ 如果配置一个IO口只需要1个位,一般高16位保留
④ BSRR寄存器32位分为低16位BSRRL和高16位BSRRH,BSRRL配置一组IO口的16个IO口的置位状态(1),BSRRH配置复位状态(0)。
下面对10个寄存器进行介绍:
1.端口模式寄存器(GPIOx_MODER)
- 32位,分成了16组(MODER0-MODER15),每一组两位控制一个IO口
- 其中每一个MODERx中两位填入数据:00表示输入模式(复位状态)、01表示通用输出模式、10表示复用功能模式、11表示模拟模式。
- 其中GPIOx_MOER中“x“表示A~K,即PA口表示为GPIOA_MOER,即PB口表示为GPIOB_MOER,即PI口表示为GPIOI_MOER。
- 如果要配置PA0(即配置GPIOA_MOER中的MODER0)为模拟模式,即GPIOA_MOER中的MODER0填入数据11;配置PA9(即配置GPIOA_MOER中的MODER9)为通用输出模式,即GPIOA_MOER中的MODER9填入数据01.
2.端口输出类型寄存器(GPIOx_OTYPER)
- 只使用前16位寄存器,第16~第31位保留
- 填入0为推挽输出(复位状态);1为开漏输出
- 其编号配置同上一小节类似
3.端口输出速度寄存器(GPIOx_OSPEEDR)
- 2MHZ 低速
- 25MHz 中速
- 50MHz 快速
- 100MHz 高速
4.端口上拉下拉寄存器(GPIOx_PUPDR)
5.端口输入数据寄存器(GPIOx_IDR)
- 做输入使用,比如用PA口(GPIOA_IDR)采得数据第0位(IDR0)为1就表示PA1口输出高电平;PB口(GPIOB_IDR)采得数据第8位(IDR0)为1就表示PB8口输出高电平。
6.端口输出数据寄存器(GPIOx_ODR)
- 做输出使用,比如让PA1口输出高电平就是用PA口(GPIOA_ODR)的第0位(ODR0)为1
;让PB8口输出低电平就是用PB口(GPIOB_ODR)的第8位(ODR8)为0。
7.端口置位/复位寄存器(GPIOx_BSRR)
- 端口低16位(0~15)为置位位,即端口的某一位(例如BS2)写1,则该一小位(BS2)输出高电平;若该一小位(例如BS2)写0,则该一小位(BS2)输出状态仍为原状态(并不是输出低电平)。
- 端口高16位(16~31)为复位位(与低16位置位位状态相反),即端口的某一位(例如BR2)写1,则该一小位(BR2)输出状态仍为原状态(并不是输出高电平);若该一小位(BR2)写0,则该一小位(BS2)输出低电平。
8.端口配置锁存寄存器(GPIOx_LCKR)
- 第16位为激活锁存器位。
- 低16位(0~15)位锁存器,可以锁存数据,锁住以后,便不能对该端口数据进行操作
9.复用功能寄存器(低位GPIOx_AFRL & GPIOx_AFRH)
- 分高位AFRH和低位AFRL,分别控制8个IO口
- 4个位控制一个IO口,其中AFRL控制AF0到AF7,AFRH控制AF8到AF15。
- AF0到AF15分别对应IO口不同的复用功能(前文提到的串口复用)。
- 即某一个IO口填入数据0011(AF3),则该IO口执行AF3对应的功能,进行不同数据(AF0到AF15)的切换则实现了IO口功能的切换。