Arduino寄存器操作

很多人都在向我询问关于如何直接使用Arduino中断的问题。要搞清楚这方面的事情,需要先了解Arduino使用的单片机ATmega328的内部寄存器。

要搞清楚这个问题,我们需要先获得一份ATmega328的Datasheet(数据手册),这是一款采用AVR架构的8位单片机。Datasheet是一份长达400多页的文档,告知了关于如何使用这款单片机的方方面面。

当我们使用PDF阅览器查看左侧的目录索引,我们先找到AVR CPU Core部分,查看概览Overview,我们能找到该款CPU的内部模块结构示意图。其中的ALU(算术和逻辑运算单元)部分,是用于算术和逻辑运算的核心部分,如加减乘除、位与或非运算等等。运算的数值来自23个8位的通用功能寄存器,也可将结果存放于这些寄存器中。8bit(8位)也就是1byte(一字节),还有其它的一些寄存器如Instruction Register指令寄存器等等。此外与8位Data Bus数据总线相连的还有I/O Module(输入/输出端口模块)。

你可以将Processer(处理器)想像成厨房,ALU(算术和逻辑运算单元)就像是大厨,根据instruction指令来准备晚餐。他是执行指令并采取响应的责任主体,大厨根据菜谱的步骤来开展工作,就像是编程过程中的程序代码。而厨房中的锅碗瓢盆等容器就是Register(寄存器),用于存放等等烹饪的食物,在处理器中也就是数据。

然而,当我将这些输入写入特殊功能寄存器SFR(sprcial function register)之中,它就可能直接导致控制器的某些引脚的电压从0V上升到5V。好,让我们待会就来试试。特殊功能寄存器SFR用来控制引脚的功能和输入输出,设置中断,发送或者接收串行信号等等。你需要知道的是,寄存器的种类数量以及名称是与处理器架构密切相关的,譬如你在ATMega328P控制器上做开发,当你迁移到ESP32控制器上时,你需要重新记忆一系列新的寄存器。

ATMega328P有三各分别编址的存储器,第一个是程序存储器(Program Memory),这里存储着你所编写的代码,当你编写代码,被编译后成为机器代码,就被存储在这里。这是一系列的操作指令,就像是菜谱一样,大厨操作时必须遵循的。第二个是SRAM(static random-access memory)静态随机存储器,有趣的是,我们上面所提及的通用寄存器和特殊功能寄存器都在这里的前256个存储单元中。所以,当我需要写入特殊功能寄存器数据时,我们需要先找到其在SRAM中的相应地址,然后配置好我们需要写入的数值。SRAM剩余的部分用于存储数值,如你在程序中所命名的变量等。请注意,当你的处理器重启或者断电后,SRAM中的所有数据将被清除,你将丢失所有存储于此的数据。最后第三个,就是EEPROM(elecrtically erasable programmable read-only memory)电可擦除只读存储器,它通常不被认为是处理器中的部分,由于其往往在另外的总线上与处理器进行通信,它的读取和写入速度也远较其它存储器慢。但它对于需要在断电后启动仍需保存使用的数据非常有用。

如果我们看一下I/O port章节部分,我们就可以知道一般数字输入输出端口的内部电气结构。在ATMega328P处理器中,所有I/O端口均可被配置为数字输入或输出端口,但是有些端口同时还可以被配置为通用串行收发端口、外部中断端口、模拟数字转换端口。

查看一下Pin Configurations章节,可以看一下DIP封装芯片的引脚分布,这就是Arduino UNO上所使用的处理器。你可以看到I/O端口命名以字母P开头,名字为B、C、D再加上一个端口数字。举例来说,我们可以向触发一个端口控制LED亮灭,该端口为PD5。需要使用一个引脚作为数字输入输出,我们需要配置3个寄存器PORT、DDR、PIN。让我们再导览到I/O Ports Register Description小节,了解更深入的信息。首先,我们需要配饰DDR(Data Direction Register)寄存器用于定义该端口的功能是输入R还是输出W。把DDRD中相应的端口位的值置位为1,意味着告诉处理器该位对应端口我们将用作输出功能,反正重置该位为0则告知处理器该对应端口将用作输入功能。接下来就是PORT寄存器,不要困惑,我们现在要操作的是D端口,那么对应的寄存器当然是PORTD,在前面配置了端口为输出功能后,将该寄存器对应位设置为0则该引脚输出0V电压,设置为1则该引脚输出5V电压。如果之前的DDR寄存器将该位对应端口设置为输入,则PORT寄存器对应位设置为1表示内部上拉电阻有效,设置为0表示内部上拉电阻无效。最后PIND寄存器相应位只能读取不能写入,它表示对应端口配置为输入时盖输入位引脚电平的高低。

我们待会就要实际演示 一下具体如何操作,不过,让我们先看看这些相关寄存器在SRAM中的分布位置和对应地址。导览到register summary一节,在表头我们可以看到每个寄存器的相应地址。

 

打赏

发表评论