微控制器程序闪存可用于存储用户配置吗?


9

许多微控制器(例如PIC18F)都具有闪存程序存储器:“在正常操作期间,闪存程序存储器是可读写的”。这是否意味着我可以在程序存储器中存储一些用户配置?

Answers:


12

是的你可以。我已经做了很多次了。

但是,相对于使用单独的EEPROM有一些缺点:

  1. 对程序闪存的寿命写操作次数大大少于数据EEPROM。

  2. 在擦除和写入期间,处理器将出去吃午饭。

  3. 程序闪存被逐块擦除。您不能只更新一个字节。我通常使用块缓存方案来处理此问题。


完美,您似乎以某种方式知道我的问题确实是“为什么在同时使用程序存储器存储程序和用户数据的同时需要EEPROM” :)
student1 2014年

Olin,将新版本的固件刻录到PIC中时,是否会擦除所有闪存?有什么好方法可以防止在固件下载过程中擦除Flash中的用户配置(或校准数据)?这是关于固件开发期间的便利。我可以想象用户配置将存储在最后一个块或Flash中。
尼克·阿列克谢耶夫

6
@Nick:这取决于您使用的PIC编程器。许多,包括我所有的,都会进行批量擦除,因此校准数据将被清除掉。我有几次编写了一个特殊的编程应用程序,该程序读取校准数据,进行批量擦除,然后将校准数据写回作为正常编程过程的一部分。一些Microchip编程器可能仅能更新部分程序存储器。请注意,如果您打开了代码保护功能,则程序员必须进行批量擦除。
Olin Lathrop 2014年

在非哈佛处理器(我想到的是MSP430)上,您可以将代码复制到RAM中,然后跳入RAM并在闪存写入/擦除发生时运行。我将其用于引导加载程序,以同时写入和接收来自无线电的新数据。
markrages

@mark:是的,这也适用于PIC32,也可以从RAM执行。实际上,这更快。
Olin Lathrop 2014年

6

许多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系列产品外,其他许多微控制器也具有更新其闪存的能力。大多数使用配置寄存器,地址指针和特殊指令的组合来执行任务。


这种“空中固件”方法看起来非常有趣。是否消除了对系统内编程(ISP)的需要?
学生,2014年

@ student1并不需要通过ISP接口对芯片进行初始编程,因为您必须在芯片上放置一些固件才能稍后处理更新。Arduino板上使用的ATmega微控制器已经装有这种类型的固件,称为Bootloader,这就是为什么您不需要使用ISP接口将草图下载到Arduino的原因。但是,如果要更新Bootloader本身,则确实需要ISP接口。该引导加载程序仅通过USB处理更新,因此它实际上不是“无线固件”。
tcrosley
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.