Hello,小伙伴们,大家好,这里是左左右。前面视频我们讲过 GPIO相关寄存器ODR和BSRR。今天我们将把剩余的GPIO核心寄存器全部讲完。首先,来看端口配置低寄存器GPIOx_CRL。它是一个32位寄存器,被划分为8组,每组4位。分别对应PIN 0到PIN7,也就是端口的低8位。

这也是它名称中带“低”字的原因。每一组又分为两部分,MODE位和CNF位。各占2比特,它们组合起来。共同决定一个引脚的工作模式与特性。其中MODE位是00时表示的IO端口为输入模式。01表示输出模式,最大速度10兆赫兹。10表示输出模式,最大速度2兆赫兹。11表示输出模式,最大速度50兆赫兹。
CNF位含义取决于MODE位设置。当MODE位设置为输入模式时,00表示模拟输入模式,01表示浮空输入模式。10表示上拉或下拉输入模式。11位为保留位,没有实际作用。当MODE位设置位输出模式时,00表示通用推挽输出模式,01表示通用开漏输出模式。10表示复用推挽输出模式,11表示复用开漏输出模式。
接下来是端口配置高寄存器GPIOx_CRH。位含义和GPIOx_CRL是一模一样的。只不过分别对应PIN8到PIN15高8位引脚。然后,是端口输入数据寄存器GPIOx_IDR。它的低16位分别对应PIN0到PIN15的输入电平状态。高16位为保留位。由于此时的引脚是用来读取stm32芯片外部输入的高低电平信号的,所以,它是只读的,接着,是端口位清除寄存器GPIOx_BRR。

这里的低16位是用来给PIN0到PIN15置零的。它与我们前面讲过的GPIOx_BSRR中的高16位的作用是一样的。这里就不赘述了。最后,是端口配置锁定寄存器GPIOx_LCKR。它的位0到位15 分别对应PIN0到PIN15。将某一位或多位设置为1。即表示选中该引脚,准备对其进行配置锁定。
它的位16,LCKK,是锁定键。当它被成功置1后,之前被选中的引脚。即LCK中为1的位的配置才会被真正锁定,无法再被软件修改,而且位16锁定操作有一个严格的写入序列。需要先写1,再写0,最后再写1,最后一步就是读1,也就是读取位16有没有被置1,如果读取结果为1。就说明位16被成功锁定了。
这个寄存器的作用是防止一些已配置好的关键引脚。如复位引脚、晶振引脚等。在程序后续运行中被意外修改,提高了系统的稳定性和安全性。到这里GPIO相关寄存器就全部讲完了。我在这里总结了一个表格给大家。接着,我来出两道小的题目来考考大家对知识点的掌握情况。第一题,如何通过配置寄存器将PA15引脚配置为上拉输入模式?

首先,定义指针,这里设置为10为上拉或下拉输入模式。他也没说上拉怎么设置?我们打开手册108页可以看到当设置为输入模式时。这里是断开的,此时stm32赋予ODR寄存器另外一个功能。当设置输出数据数据寄存器对应为1,就是上拉输入,反之设置为0为下拉输入。接着,来配置O D R寄存器。

好的,这样就设置完成了。第二题,将P B 3引脚配置为通用推挽输入模式,最大速度50兆赫兹。并锁定该引脚相关配置。我们一起来写一下。其实HAL库已经为我们写好了端口配置的函数了。我们打开stm32cubeIDE读一下它的源码。把找到线索汇总一下,这样看来当我们有了一定的知识储备。

HAL源码读起来也并不是那么困难了,而是变成水到渠成的一件事了,好的,今天的视频就到这里。如果觉得有收获,一定要关注、点赞、收藏,评论。你的支持是我这样的小博主持续更新下去的最大动力。期待下期视频再见!