14、芯片与寄存器的介绍

14、芯片与寄存器的介绍
14、芯片与寄存器的介绍

理解芯片控制的原理

如果要说做单片机很难吗?其实并不难,用3句话就可以讲明白:

第1句话:芯片管脚不是输入,就是输出。

我们所有的程序,用单片机控制的产品,以及外设,无非就是控制芯片的各个管脚输入或者输出两个状态;例如,芯片发送数据就是输出;芯片驱动一个产品,也是输出;芯片接收数据就是输入;单片机对一个存储芯片写输入,可以理解为单片机与存储芯片连接的管脚输出状态,输出数据到存储芯片的管脚上,而存储芯片此时它的芯片对应管脚被配置成输入,将数据写入到芯片内部。

所以说,芯片管脚不是输入,就是输出,当然,如果你不使用这个管脚,也可以将它配置成某一种中间状态,免得干扰了外界,影响了PCB板上的其他元器件状态。

第2句话:芯片管脚不是高电平,就是低电平。

无论管脚是输入还是输出,它的目的是传输数据,传输信息,所以要么是高电平,要么低电平,通过010101这样的数据来传输它想传输的内容;这个就是所谓的二进制。

第3句话:传输协议。

什么是传输协议,比如与串口芯片通信,那么就要是串口协议的;如果是I2C 协议的EERPOM,那么就是I2C协议;还有其他一些比如485协议,CAN协议,USB协议,SD卡的SDIO协议…….等等数不胜数。

而这些协议,无非就是按照预先规定的表达方式进行通信,比如举个例子,我约定先连续发4个1,,然后再发4个0,就表示芯片A要开始发数据给芯片B 了,即芯片A通过它的芯片管脚发‘11110000’给到芯片B的时候,那么芯片B 就知道芯片A要给它真正的数据,它就要做好准备工作,准备好之后,芯片B 就会给芯片A一个回应,当芯片A收到芯片B的回应,就正式开始发数据。

这样通信双方之间的协商规定,就构成了协议,经过这么多年,就形成了我们所常见到的串口协议,CAN协议,USB协议(像USB协议又分为USB1.0协议,USB2.0协议,USB3.0协议,版本越高,速度就越快,协议进行优化后,通信效率也变高了)。

不知道大家理解了没有呢?所以总结下来,一个芯片最简单的外设莫过于

I/O口的高低电平控制,我们这里将详细讲解一下如何用一个I/O口去控制一个LED灯的亮灭。

芯片管脚控制LED灯原理图解释

芯片管脚如何控制一个LED灯,大家看一下下面的原理图,我们想用STM32的管脚PD2去驱动LED1这个LED灯亮,只要使得PD2输出低电平,LED灯就会变亮;如果PD2输出高电平,LED灯就会熄灭。

为什么这么接呢?我重复上面已经说过的内容,首先我们要知道LED 的发光工作条件,不同的LED 其额定电压和额定电流不同,一般而言,红或绿颜色的LED 的工作电压为1.7V~2.4V,蓝或白颜色的LED 工作电压为2.7~4.2V,直径为3mm LED 的工作电流2mA~10mA。在这里采用绿色的LED。其次,STM32 单片机(如本实验板中所使用的STM32F107VCT芯片)的I/O 口作为输出口时,向外输出电流的能力是25mA左右,勉强是可以点亮一个发光二极管,但是如果我们用STM32去点亮很多个LED灯的时候,就有可能造成芯片本身输出电流不足(因为芯片能输出的总电流大小是恒定的)。

而灌电流(要VCC往内输入电流)的方式确非常轻松,利用灌电流的方式驱动发光二极管是比较常见的一种用法,无论接多少LED,芯片管脚的负荷都非常轻。当然,现今的一些增强型单片机,是采用拉电流输出的,只要单片机的输出电流能力足够强即可。另外,图中的电阻为1K 阻值,是为了限制电流,让发光二极管的工作电流限定在2mA~10mA。

芯片管脚控制原理(如何阅读芯片手册)

实际上,点亮这个LED灯,只需要使得我们的STM32芯片的PD2管脚输出低电平就可以了,那么如何控制一个PD2管脚的状态呢?

我们来举个例子,实际上STM32的PD2管脚的状态是由STM32芯片内部的一些寄存器来控制的,通过这些寄存器,可以控制将管脚配置成输出或者输入,

拉高还是拉低。芯片通过获取寄存器不同的值,对应我们的STM32芯片手册寄存器说明书,就可以知道芯片就相当于获得了不同的命令,获取命令后就开始执行命令,大家可以看下图,打开这个文档RM0008手册

,这是一个754页的翻译成

中文版的PDF手册:

翻到第6页,可以看到,我们的STM32神舟IV号适用该手册

器的章节,具体内容大家自己打开文档阅读一下:

我们进入文档,看其中一个寄存器到底写了些什么:

可以看到,从0~31总共有32个位的寄存器,可以去设置;其中0、1和4、5和8、9和12、13位以此类推到28、29每两个位为一个组,每组有4个状态,每个状态都对应不同的模式,比如这2个位都是1则表示‘输出模式,最大速度50MHz’,2个为都是0则表示‘输入模式(复位后的状态)’;

上面CNFy配置端口8种模式也是同样的道理,至于为什么有这八种模式,大家可以去查阅一下手册。

是不是看得有点头晕了,但是没有办法,我们就是通过改变这些寄存器的值来设置芯片管脚的,使得芯片管脚按寄存器手册里的规定来进行相应的工作,可以是输出或输入,可以是高电平或是低电平(这个是另外一个寄存器来控制,大家可以对应看手册里的寄存器说明),从而达到我们控制一个LED灯亮和灭。

那么我们怎么来改变这些寄存器呢?那寄存器的值保存在什么位置呢?答案就是在SRAM里,在内存映射里。从芯片一上电,正常工作开始,所有寄存器

的值都会在实时保存在内存中的一个固定地址,这个固定地址也是芯片厂商一开始就定好了的,不能改变,大家看下图:

比如我们要访问GPIO管脚PD2,那么首先就要找到端口D的位置,即Port D;我们可以从上图找到,Port D的位置在内存中的0x4001 1400这个地址,那么再看一下手册的寄存器描述

看到一个偏移地址没?对,GPIOD_CRL这个寄存器的地址在哪呢?就在Port B 的位置+偏移地址就可以算出它的地址,即:

GPIOB_CRL寄存器地址:0x4001 1400 + 0x00 = 0x4001 1400

我们再看一个地址:

GPIOB_CRL寄存器地址:0x4001 1400 + 0x04 = 0x4001 1404

也就是说,当我们访问0x4001 1404这个地址所指向的内容时,实际上就是在访问GPIOB_CRH这个寄存器了,就这么简单。

相关主题
相关文档
最新文档