上一篇文章我们讲到,软件其实只需要读写寄存器,就可以实现操作硬件。比如我们要点亮一个led灯,只需要对应的GPIO寄存器位写1,对应引脚就会输出高电平,点亮led灯。
于是出现很多问题,为什么写寄存器就能出高电平等之类的问题?下面就本篇我来串一下,一一解答一下。
我先说明几点:
进入正题,因为不同的MCU的内部GPIO电路实现不一样,甚至像51单片机的GPIO 不同的组实现都不一样,比如51单片机的P0和P1 IO口内部电路就不一样。所以我们这里仅仅是以51单片机的P0 GPIO内部电路为例来讲解的,其它芯片的大家自己举一反三。
下图是51单片机的P0口的GPIO内部电路框图:
P0 GPIO部分电路主要有以下构成:
1.P0.x输出锁存器(就是寄存器一个单元,寄存器有多个位,就是D触发器)
2. 2个三态缓冲器,用于控制读引脚还是读锁存器
3.驱动电路,V1,V2两个场效应晶体管
4.输出控制部分,与门、反相器、转换开关MUX各一个
下面我们来走一下流程:
这就是整个过程。
总结一下,上面我们将整个脉络讲了一遍。大家发现,其实控制led灯还是MCU内部电路,没错,确实是这样,但是软件代码被CPU执行之后,CPU会使相关寄存器改变状态为1,连带后面整个电路就会连锁反应,导致最后引脚输出高电平。而寄存器和内存一样,CPU通过地址总线寻址是可以找到它并改写它,所以才有上篇文章我说寄存器是软硬件的接口纽带。你只需要操作寄存器就可以操作硬件。
当然强调一点,不同芯片它的实现电路不一样,这里我们举这个例子主要是让你理解软硬件怎么联系起来的这种模式或者方法,至于具体电路都是芯片设计公司的事情。