打印
[STM32F1]

stm32寄存器配置端口输入输出模式

[复制链接]
272|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
maudlu|  楼主 | 2023-5-29 11:30 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

如果说你的外设需要用到IIC通信,那么配置端口的输入输出那是必然的,寄存器配置IO方向简单,清晰,明了。如下!!!

用寄存器配置IO方向就两个点,第一步配置输入还是输出,第二步,配置对应的输入输出模式,比如推挽啊,上拉下拉呀等等......

那么配置之前首先得了解32的一些基本知识。我们都知道,32有很多GPIO组,每个组呢又有16个IO口(0-15),所以在stm32里把0-15个IO口分成了高和低两部分,用寄存器CRL(low),CRH(high),来配置IO。很明显CRL控制GPIOX_0-GPIOX_7,因为它低嘛,同理,CRH控制GPIOX_8-GPIOX_15,因为它高嘛。

上面我们说了~~~配置IO方向就两个点,第一步配置输入还是输出,第二步,配置对应的输入输出模式.在32里面呢用两位控制输入或者输出,再用两位控制对应的输入输出模式,所以配置一个IO口的模式需要四位,那么算一下,CRL控制0-7也就是8个IO口,说明CRL是4*8=32位的寄存器,同理CRH也是32位的。如果那你想配置一个GPIO口,显然,是不是得先找到这个IO口是属于低寄存器管的,还是属于高寄存器管的。找到之后,再在对应的32位寄存器里找到目标IO对应的四位是哪四位,找到之后就可以配置01的组合,就配置成功啦。那么问题来,怎么找对应的寄存器和对应的IO位呢,往下看!

比如我要配置,GPIOB_Pin_7,将这个引脚配置成上拉输入,那么很明显,首先它是输入,其次它是上拉(PB7是IIC总线,一般来说IIC总线内部自带上拉电阻,所以配置成上拉),那么接下来找到对应的寄存器~~~0-7为低,8-15为高,所以对GPIOB_Pin_7来说,是在CRL低寄存器里配置。该寄存器32位格式为0xFFFFFFFF,从右往左依次为0-7,即0xFFFFFFFF,红色位则是配置7口的对应位。找到对应位之后接下来进行配置,往下看!!

既然要配置,那么就要先清零,所以第一步写入:GPIOB->CRL&=0x0FFFFFFF;清零后怎么配置呢?看下图,32给定了配置模式的01组合:

那么需要配置上拉输入的话,第一步配置输入:图中可得输入格式写入00;第二步配置上拉:图中可得上拉格式写入10(下拉也是10),所以写入的四位就是10和00,对应就是1000,16进制就是8,所以写入GPIOB->CRL|=0x80000000;配置完成。这里说一下,很多地方在这里采用的是移位指令,也就是图中的8<<28,其实是一个意思,只不过我不习惯用移位来表达。

开图下面两条指令也是同理,这里快速说一下。其实可以反推代码作用在那个管脚,配置了哪种模式。第一条GPIOB->CRL&=0X0FFFFFFF;很明显,清零在第七个IO,那么就是GPIOB-Pin-7;第二条GPIOC->CRL|=3<<28,也就是GPIOC->CRL|=0x30000000,3写成16进制就是0011,按图中11是对应的输出模式,且最大速度是50MHz,00则是通用推挽输出模式,所以这两条语句写的是清零之后,把GPIOB-Pin-7配置成推挽输出,翻转速度是50MHz。

再举个例子,往下看~

{GPIOE->CRH&=0XFF0FFFFF;GPIOE->CRH|=0x00400000;}。首先,采用高寄存器CRH,说明配置的是8-15的IO,那么从右往左算,将第13引脚清零,所以作用于PE13;再看第二条,4换成16进制就是0100,00是输入,01是浮空输入,所以这里设置的是将PE13引脚配置为浮空输入模式。


使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

28

主题

1373

帖子

0

粉丝