许多微控制器,例如PIC18F,都有闪存程序存储器:“闪存程序存储器在正常操作期间是可读写的”。这是否意味着我可以在程序存储器中存储一些用户配置?
单片机程序闪存可以用来存储用户配置吗?
是的你可以。我已经做过很多次了。
但是,相对于使用单独的 EEPROM,有一些缺点:
- 程序闪存的终身写入次数明显少于数据 EEPROM。
- 处理器将在擦除和写入期间外出吃午饭。
- 程序闪存按块擦除。你不能只更新一个字节。我通常使用块缓存方案来处理这个问题。
许多 PIC18 都有 EEPROM 存储器,最大容量为 1K。不幸的是,您引用的 PIC18F46J50 没有。如果 EEPROM 可用,如果它足够大以容纳您的数据,这是一个更好的选择,因为 EEPROM 至少有 1,000,000 次擦除/写入周期,而闪存只有 10,000 次。
PIC18 与大多数其他微控制器一样,使用所谓的哈佛架构,这意味着程序和数据在物理上存在独立的可寻址区域(即,您可以有一个程序地址 4 和一个数据地址 4,它们并不相同)。因此,您无法使用 C 或汇编语言中的常规方法读取或写入闪存。
相反,在 PIC18 系列中,您在称为 TBLPTR 的 22 位寄存器中设置起始地址。要从闪存读取字节,请使用 TBLRD 指令。有一个选项可以在读取后自动增加或减少地址,您不必手动执行此操作。
要写入闪存,您必须首先擦除一个或多个 64 字节的闪存块,这些块将被覆盖。在 TBLPTR 中再次设置起始地址和其他一些寄存器中的值以初始化擦除操作后,中断被禁用,然后您必须立即将 0x55 和 0xAA 写入寄存器;这可以解锁擦除命令,并且是防止错误代码意外擦除内存所必需的。最后执行实际执行擦除的命令,然后重新启用中断。
写入闪存类似于擦除,只是块大小更小。写入实际上是使用 TBLWT 指令执行的,它也允许像 TBLRD 指令一样自动递增/递减。
除了保存配置数据之外,写入闪存还允许人们使用所谓的“空中固件”在现场更新他们的固件。您需要有一个固定的固件块,通常在程序存储器的开头,它可以接收来自蓝牙模块、Wi-Fi、蜂窝模块甚至有线连接的更新,并在某个点以上更新闪存带有新代码的程序(例如“栅栏”)。更新完成后,启动复位,新代码投入使用。
除了 PIC 系列之外,许多其他微控制器都具有更新其闪存的能力;大多数使用配置寄存器、地址指针和特殊指令的某种组合来执行任务。