微控制器如何“记住”程序?

电器工程 微控制器 图片
2022-01-28 17:20:20

这是我毕业后真正困扰我的事情。我们在课堂上对 PIC16f877a 微控制器进行了编程,但从未深入了解它的工作原理,只是让它工作。因此,假设我编写了一个程序,使 LEDS 按特定顺序闪烁,并通过这个特殊的适配器将这个程序发送到微控制器到正确的引脚。你知道吗,LED 开始按照指示闪烁。现在,我断开电源并从面包板上取下 PIC。我把 PIC 放回正确的位置,插上电源,LED 仍然按照之前的编程方式闪烁,无需重新编程。这是怎么回事?这个微控制器本质上是如何“记住”我告诉它做什么的?

4个回答

PIC 包括一种称为“ Flash EEPROM ”的非易失性存储器。当您“将程序发送到微控制器”时,特殊适配器实际上是将您的代码编程到此内存中。物理存储器是一种特殊的晶体管,带有一个浮动栅极,即使没有通电,它也可以或多或少地无限期地存储电荷。在大多数设备中,“已充电”= 0,“未充电”= 1。

每当 PIC 复位或上电时,它就会开始执行您的代码,直接从该内存中获取代码。

在 PIC 上,该存储器被集成到容纳 CPU 和其余逻辑(外围设备等)的同一芯片中。相同类型的内存用于保存台式机/笔记本电脑中的 BIOS,但它是独立于 CPU 的芯片。当您打开 PC 时,您看到的前几个屏幕来自 BIOS,然后它会从硬盘驱动器或 SSD 加载您的操作系统并运行它。

有很多部分可以使微控制器编程的魔力发挥作用。

您的开发工具链(编译器、汇编器、链接器等)将您的程序从源代码转换为一系列机器指令,这些指令将存储在微控制器上。

微控制器通常将程序存储在闪存中(UV 可擦除和一次性可编程微控制器也存在)。这是一种特殊类型的存储器,旨在即使在关闭电源时也能保留数据。这些依赖于一种称为“浮栅 MOSFET”的结构。本质上,存储阵列中的每个 MOSFET 都有一个与其栅极串联的微型电容器,该电容器上的电荷会改变晶体管的行为。

浮栅被绝缘材料包围,因此在正常情况下,电荷既不能进入也不能离开浮栅。这使得浮动栅极即使在电路断电时也能保留电荷并因此保留信息。

然而,当施加足够高的电压时,电子可以穿过绝缘层。这允许将电荷添加到浮栅或从浮栅移除。通常,对门充电的机制(称为“编程”)可以在单个位的基础上完成,但去除电荷的方法(称为“擦除”)一次只能针对整个内存块完成。

当您连接编程适配器并告诉软件对微控制器进行编程时,它会将微控制器置于特殊的“编程模式”。不同微控制器之间的细节有所不同,但在您的 PIC16f877a 上,通常通过将 13V 施加到 Vpp/MCLR 线路来完成。在较旧的闪存芯片上,Vpp 实际上会提供编程所需的电源,但在您的 PIC 上,它只是一条信号线,具有对内部生成的闪存阵列进行编程所需的任何电压。一旦进入程序模式,处理器就会停止执行正常指令,而是响应通过编程接口发送的特殊命令。在 PIC 上,这是一个具有单向时钟线 PGC 和双向数据线 PGD 的同步串行接口。

一旦进入编程模式,编程软件将通过编程适配器发送一系列串行命令,将您的程序写入闪存。两种不同的方法是可能的,在一种方法中,“擦除和编程”命令用于一次擦除和重新编程一个块。在另一种方法中,使用“批量擦除”命令擦除整个芯片,然后可以使用“仅编程”命令对新数据进行编程。在这两种情况下,在发出“擦除和编程”或“仅编程”命令之前,必须首先将数据加载到分级寄存器中。您可以在http://ww1.microchip.com/downloads/en/devicedoc/39589b.pdf中找到详细信息

第一件事……您了解一次性可编程易熔存储器的工作原理吗?就像我有十亿条小电线,每一条我选择连接到 +V 用于逻辑 HI (ONE) 和 GND 用于逻辑 LO (ZERO),你了解它如何将程序本身存储为 1 和 0 ? 你可以拿一个电压表,你可以测量每根电线是连接到 +V 还是 GND,以确定该位置的位是 HI 还是 LO。微控制器做同样的事情。

其他一切都是这个概念的一个花哨、更灵活的版本: ROM 是如何工作的?

这往往会导致一个问题:“微控制器如何获取 1 和 0 的程序并使用它来处理 当我们输入代码时在硬件级别会发生什么?

程序代码存储在微控制器的 ROM 存储器中(在这种情况下为闪存)。这种存储器中存储的数据在断电后保留。您的微控制器有 14KB 的闪存,编程后代码驻留。

该存储器基于 MOSFET 结构,可在断电后保留数据。有关闪存如何工作的更多信息,我建议您阅读wiki 文章