本文是笔者自学STM32F446-Reference的学习笔记,参考手册下载:STM32官方资料库。
实验部分使用Nucleo-144开发板。
一.GPIO结构
GPIO的结构其实并不复杂,这里将其分为四个部分进行分析:输入寄存,输出寄存,输出驱动,上下拉及保护,分别对应下图中“上、左下、中下和右”四块。
1.1输入寄存
输入部分对应的主要是输入数据寄存器,在基本输入状态下该寄存器的值由外部设备改变,所以属于只读寄存器。
除此,该输入部分还有复用功能输入与模拟输入两种输入结构,此时不需读取输入数据寄存器。前一种输入结构的信号与基本输入同属数字信号,所以要经过施密特触发器,后者则不需要。
1.2输出寄存
输出部分主要有输出数据寄存器和置位/复位寄存器,前者可读可写,后者只可以写,读取则得不到正确值。
同样,输出部分也有复用功能输出和模拟输出两种。模拟信号输出不需要经过输出驱动模块,另两种输出模式都需要。
1.3输出驱动
这部分主要有两种控制型寄存器:输出速率寄存器,输出方式寄存器。前者很好理解,即对应I/O支持的高低电平最高切换频率;后者则分为推挽模式和开漏模式两种,是理解I/O口输出结构的关键点。
图中所示的两个场效应管同时工作属于推挽结构。在该结构中输入高电平时,上方的PMOS导通,下方的NMOS关闭,输出高电平;而输入低电平时,NMOS导通,PMOS关闭,输出低电平。当引脚高低电平切换时,两个管子轮流导通,P管负责灌电流,N管负责拉电流,使其负载能力和开关速度都比普通的方式高很多。
上方的PMOS不工作属于开漏结构。仅考虑该结构,则当输入为低电平时,PMOS完全关闭,NMOS导通,输出接地为低电平;而输入为高电平时,PMOS和NMOS都关闭,引脚既不输出高电平也不输出低电平,为高阻态。所以为了正常使用必须外接上拉电阻替代PMOS,以输出高电平。
推挽模式是最常用的结构,因为它可以在高低电平间快速切换;开漏结构则用于一些特定场合,如需要“线与”和“输出指定高电平”的电路,这些功能是推挽结构没有的,而开漏结构之所以有此功能的原理在分析电路后自然可以得到,此处不赘述。开漏结构的缺点在于上升沿有较大延迟,这是因为上升沿是通过外接上拉无源电阻对负载充电的。
1.4上下拉及保护
该部分通过上拉/下拉寄存控制上、下拉电阻的开关,进而控制引脚默认状态的电压。设置上拉时引脚为高电平,设置下拉时引脚为低电平,设置“既不上拉也不下拉”模式时,引脚处于浮空状态,因此也称为浮空模式。
两个保护二极管用于防止引脚外部过高或过低的电压输入芯片导致芯片烧毁。
二.GPIO使用配置
无论管脚作为输入还是输出,需要配置的寄存器无外乎:MODER、OTYPER、OSPEEDR、PUPD、ODR、IDR、BSRR、AFRL等。
请配合“参考手册”或“详细介绍每一个寄存器的博客”食用。
当然,首先应指定管脚,接着才是配置管脚对应的寄存器。
2.1输入配置
MODER配置为00,此外仅将PUPDR按照需求配置即可。
2.2输出配置
MODER配置为01,OTYPER、OSPEEDR、PUPDR、ODR、BS