什么是只读
存储器?(又名代码存储器、又名程序存储器)
微控制器存储器分为与电气特性(例如,易失性与非易失性)和架构因素相对应的类别,例如 8051 内部数据存储器和“外部”数据存储器之间的区别(外部 RAM 可以包含在-芯片)。例如:

MSP430 存储器结构。图表由德州仪器 (TI)提供。
代码存储器,又称程序存储器或
只读存储器 (ROM),是存储程序指令的地方。我们也将其称为“闪存”,因为现在代码存储器是使用称为闪存的非易失性存储技术来实现的。
了解微控制器只读存储器的重要一点是它不是只读存储器。首先,如果它真的是“只读”的,那么它就毫无价值,因为
MCU的
编程器硬件无法向其中写入程序指令。更重要的是,MCU 允许您从固件内写入该存储器。因此,它实际上是可读、可写、非易失性存储器,可用于一般数据存储。
(注意:我相信从固件写入代码存储器的能力现在相当标准,但如果您遇到不支持此功能的现代微控制器,请在下面的评论部分告诉我们。)
在进一步讨论之前,我想澄清这一点:当您处理在程序运行期间必须存储的数据时,代码存储器是 RAM 的替代品。
访问 RAM 速度更快,根据我的经验,在固件执行期间写入代码存储器所需的过程很复杂,并且存在损坏闪存的风险。
不要使用代码内存来存储需要频繁修改的变量和数组——这些应该位于数据内存中。
如果您的 MCU 没有足够的 RAM 来容纳所有经常修改的变量,请使用不同的 MCU 或添加外部存储芯片。
运行前存储
使用代码存储器补充 RAM 的更好方法是存储常量值。这些可能是许多不同的东西:您将发送到 LCD 模块的显示模式、将通过SPI或UART传输的固定字节或字符序列、将用于通过数字到音频生成不同音频的预先计算的正弦波值。 - 模拟转换等。
将常量值存储在闪存而不是 RAM 中很容易,因为您只需将这些值包含在固件中(作为普通变量或数组)并告诉编译器您希望将它们存储在代码存储器中。对于我的编译器,我需要做的就是将关键字“code”放在变量名之前(请参阅下面的示例);您的编译器可能有所不同。
无符号字符代码 UART_Message[4] = {0xAA, 0xAA, 0x1C, 0x2D};
代码存储器有时非常丰富,以至于该技术可用于存储某种基本图像或简短的数字化音频剪辑。
运行时存储
运行时存储是使用代码内存替代 RAM 的更复杂的方法。您必须查阅 MCU 的数据表,甚至可能是相关的应用说明,才能找到所需的过程并了解潜在的问题。例如,下图传达了有关 16 位 PIC 微控制器的闪存写入过程的信息:
图表由Microchip提供。
运行时代码内存存储对于保存设备操作期间生成的校准值非常有用。在这种情况下,主要优点是代码存储器是非易失性的,因为这些类型的数据通常不会消耗太多 RAM。运行时代码内存存储将帮助您应对 RAM 限制的一个例子是,如果您需要记录一长串测量值,这些测量值被收集,然后保留下来,直到操作员将测量值到 PC。
结论
对于那些像我一样在用完闪存之前更有可能用完 RAM 的人来说,程序存储器是一种宝贵的资源,因为它可以让您在使用较小的微控制器并消除复杂性和成本的同时满足系统要求。包含一个外部存储芯片。