对于M0 GPIO的总结

关于GPIO的介绍,我们需要先了解其内部的结构:

对于这张图,一开始我们肯定是看不懂的,但是当我们学习了STM32后,再进行类比,一下子就清楚了很多。下图为STM32的GPIO内部管脚图:

经过对比,我们可以发现M0的GPIO的上下拉电阻是在管脚的外侧来添加的,而STM32的GPIO的上下拉电阻是在内部的,而且是在输入的部分。当然一些高级的STM32芯片也是有外部的上下拉。

我们知道在STM32C8T6中一旦一个管家配置了上拉模式,是不可以再配置为输出的模式的,而M0却可以,这是为什么呢?原因就是在于其内部的结构,所以我们会在一些官方的历程中看到比如说DS18B20历程,就有其情况的出现。

当然除了这些,M0还有一些其他的配置,比如说可以根据实际的运用情况,配置驱动能力。

接下来我们说一下GPIO的寄存器:

对于这个寄存器,我个人认为比较重要,首先PIN寄存器是一个只读寄存器,这就说明我们不能对这个寄存器进行写的操作,就算进行写操作,寄存器也不会响应任何变化。

在我们程序下载自动复位后,其复位值是为0,再根据PIN寄存器的描述,当寄存器的值为0时,数字引脚为低电平。换句话说就是复位后,所有的管脚(PA,PB,PC)都是低电平。

那PIN寄存器可以用来做什么呢?

  1. 可以用来进行读操作,来读取此时管脚的电平状态,用来判断按键是否按下,中断也可。

  1. 用来判断是否按下抬手,其实也类似第一种用途

在矩阵键盘中有这样一行代码,就是当我们把矩阵键盘放在定时器中断不断刷新时,防止按键的重复触发导致的麻烦。我试了一下,如果没有这句话,可以表面上我是按了一下,但是实际在串口打印了好多,也就是按一下会触发很多次。

回到之前说的既然复位后,默认状态下所有的引脚都是低电平,那根据M0的原理图中LED灯共阳接法,为什么GPIO的灯不会亮呢?这就是我们要说到的第二个寄存器:

和STM32类似,我们想要用这个管脚,并不是马上就可以用的,不像51单片机,给1就是高电平,M0要进行输出使能的。OUTEN寄存器就是进行输出使能和失能的作用。可以看寄存器,复位值为0,可读可写,那么默认情况下,所有的管脚都是输入模式的,这就是为什么LED灯在复位状态下不亮的原因,如果我们把PB0-PB7配置成输出模式,LED就可以点亮。

上图的写法是可以实现其功能的,但是在实际的情况下,我们这样子写,是有点太过于繁琐,我们要知道无论什么配置代码,都是根据其单片机的寄存器的特点,进行封装而来的,也就是说,最终调用这条代码只是对其寄存器发生了改变,我们点开PB_OUT_ENABLE这个函数,看看它是怎么封装的:

我们可以看到它是用了一个定义的方法,把PA->OUTEN|=(1<<X)改名叫成PA_OUT_ENALBE(X),其本质含义是一样的,这就好比我本来叫小明,我长大了,觉得这个名字不好听,然后我把它改成了小蓝,但是我还是我,本质是不会变的,我不会因为改名叫小蓝而导致我人也变了。这边就是一样的道理。

我们可以发现其最初的写法就是对其寄存器进行改变,进行一个或操作,把对应的管脚的寄存器的值变为1,对应的管脚也就变为输出模式了。值得指出的是,无论是PA,PB,PC对应的第一管脚是序号0.

当我们想控制主板LED灯的亮灭时,我们需要对其管脚的电平状态进行改变:

这个是关于改变电平状态的寄存器,但是我发现了一个很奇妙的现象:

当我们写下PB_OUT_HIGH(1),则PB1被置为1,然后我们再用PB->OUTCLR|=0X0F00,你以为仅仅是8-11位被置为0,实际上PB1这个脚也会被清零,导致主板上的LED2会亮起。

所以建议使用管脚的时候,能=就不要|=。

对于按键中断相关的寄存器比较多,我这里就说一个很少使用到的寄存器:

很大部分我们看不到这个寄存器,但是这个寄存器上写着的就是中断的标志位置1与置0,既然用到中断按理说应该是要用到这个的,但是现实却不是这样子的,这是因为有了PIN寄存器来代替,效果一样,因为中断按下,为低电平,可以用来判断哪个按键按下,当然规范的情况下,我们是要用这个寄存器的。

GPIO模式的选择:

在GPIO.h中我们可以看到4类模式,最常用的就是第一个和第四个,第二个和第三个很少用到,但是我们要掌握,我强烈建议大家掌握第二个GPIO_OD_SEL,这个配置为开漏配置,我个人认为很好用,但是历程中我们可以看到是错误的,uint8_t OD是错的,我看了一下手册,要控制对开漏的使能是在位13,而uint8_t就只有8位,所以是不可能实现的,所以要想用的话,把这里改为16,然后在GPIO.c中也进行修改。开漏模式对于我们写通信协议来说非常重要,因为开漏输出也可以当作输入来用,因为这种模式下的电平状态完全由外部的电平来决定。

对于初学者来说,我建议一定要学好GPIO,把GPIO的内部图搞懂,GPIO是最基础的但也是最重要的。学好GPIO以后,M0我觉得也就成功了一大半了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值