1.寄存器介绍
STM32 的每个 IO 端口都有 7 个寄存器来控制。他们分别是:配置模式的 2 个 32 位的端口配置寄存器CRL 和 CRH;2 个 32 位的数据寄存器IDR 和 ODR;1 个 32 位的置位/复位寄存器BSRR;一个 16 位的复位寄存器 BRR;1 个 32 位的锁存寄存器LCKR;这里我们仅介绍常用 的几个寄存器,我们常用的 IO 端口寄存器只有 4 个:CRL、CRH、IDR、ODR,即端口配置寄存器和数据寄存器。
1.1端口配置寄存器(CRL和CRH)
CRL:每个 IO 端口的位占用 CRL 的 4 个位,高两位为 CNF,用来配置端口的模式,低两位为 MODE,用来配置端口的最大输出速度(CRH 的作用和 CRL 完全一样,只是 CRL 控制的是低 8 位输出口,而 CRH 控制的是高 8位输出口)。
比如我们要配置端口n为"推挽输出、最大输出速度为10M",那就是CNFn[1:0]=00,MODEn[1:0]=01。
关于IO模式(转自不文东)
(1) 浮空输入_IN_FLOATING ——浮空输入,可以做KEY识别,RX1
(2)带上拉输入_IPU——IO内部上拉电阻输入
(3)带下拉输入_IPD—— IO内部下拉电阻输入
(4) 模拟输入_AIN ——应用ADC模拟输入,或者低功耗下省电
(5)开漏输出_OUT_OD ——IO输出0接GND,IO输出1,悬空,需要外接上拉电阻,才能实现输出高电平。当输出为1时,IO口的状态由上拉电阻拉高电平,但由于是开漏输出模式,这样IO口也就可以由外部电路改变为低电平或不变。可以读IO输入电平变化,实现C51的IO双向功能
(6)推挽输出_OUT_PP ——IO输出0-接GND, IO输出1 -接VCC,读输入值是未知的
(7)复用功能的推挽输出_AF_PP ——片内外设功能(I2C的SCL,SDA)
(8)复用功能的开漏输出_AF_OD——片内外设功能(TX1,MOSI,MISO.SCK.SS)
关于输出速度(转自wuyuzun)
I/O口输出模式下有三种输出速度可选(2MHz,10MHz,50MHz),这个速度是指I/O口驱动电路的响应速度;I/O管脚内部有多个响应不同的驱动电路,用户可以根据自己的需要选择合适的驱动电路。
高低频比较
高频驱动电路:输出频率高,噪音大,功耗高,电磁干扰强;
低频驱动电路:输出频率低,噪音小,功耗低,电磁干扰弱;提高系统EMI(电磁干扰)性能;总结:通过选择速度来选择不同的输出驱动模块,达到最佳的噪音控制和降低功耗的目的如果需要选择较高频率信号,但是却选择了低频驱动模块,很有可能会失真的输出信号;所以GPIO的引脚速度应与应用匹配。
举几个栗子:
1. 对于串口来说,加入最大波特率为115200,这样只需要用2M的GPIO的引脚速度就可以了,省电噪音又小;
2. 对于I2C接口,假如使用400 000波特率,若想把余量留大一些,2M的GPIO引脚速度或许是不够,这时可以选用10M的GPIO引脚速度;
3. 对于SPI接口,假如使用18M或9M的波特率,用10M的GPIO口也不够用了,需要选择呢50M的GPIO引脚速度
4. GPIO口设置为输入时,输出驱动电路与端口是断开的,所以这时配置输出速度是无意义的;
5. 在复位期间和刚复位后,复位功能未开启,I/O端口被配置成浮空输入模式;
6. 所有端口都有外部中断能力,当使用外部中断功能时,端口必须设置成输入模式;
7. GPIO的配置具有上锁的功能,当配置好GPIO后,可以通过程序锁住配置组合,知道下次芯片复位才能解开;
1.2.数据寄存器(IDR和ODR)
IDR 是一个端口输入数据寄存器,只用了低 16 位。该寄存器为只读寄存器,并且只能以16 位的形式读出. 要想知道某个 IO 口的状态,只要读这个寄存器,再看某个位的状态就可以了。