マイクロコントローラのプログラムフラッシュメモリをユーザー設定の保存に使用できますか?


9

PIC18Fなどの多くのマイクロコントローラには、フラッシュプログラムメモリがあります。これは、一部のユーザー構成をプログラムメモリに保存できることを意味しますか?

回答:


12

はい、できます。私はこれを何度もやってきました。

ただし、個別のEEPROMの使用に関連するいくつかの欠点があります。

  1. プログラムフラッシュメモリへの無期限の書き込み回数は、データEEPROMよりも大幅に少なくなります。

  2. プロセッサは、消去および書き込み時間中に昼食に出かけます。

  3. プログラムフラッシュはブロック単位で消去されます。1バイトだけを更新することはできません。私は通常、これに対処するためにブロックキャッシュスキームを使用します。


パーフェクトは、あなたは:)「EEPROMの必要性あなたは両方のプログラムとユーザーデータのためのプログラムメモリを使用することができますが、なぜ」何とか私の質問は実際にあることを知っているように見える
STUDENT1

Olin、新しいバージョンのファームウェアがPICに書き込まれると、フラッシュはすべて消去されますか?ファームウェアのダウンロード中にフラッシュのユーザー設定(またはキャリブレーションデータ)が消去されないようにする良い方法はありますか?これは、ファームウェア開発時の利便性についてです。ユーザー構成は最後のブロックまたはフラッシュに保存されると思います。
Nick Alexeev

6
@ニック:それはあなたが使っているPICプログラマ次第です。私を含めた多くの人が一括消去を行うので、キャリブレーションデータは消去されてしまいます。キャリブレーションデータを読み取り、一括消去を実行してから、通常のプログラミングプロセスの一部としてキャリブレーションデータを書き戻す特別なプログラミングアプリを数回書きました。一部のマイクロチッププログラマは、プログラムメモリの一部のみを更新できる場合があります。コード保護をオンにした場合、プログラマは一括消去を行う必要があることに注意してください。
Olin Lathrop、2014

Harvard以外のプロセッサ(MSP430について考えています)では、コードをRAMにコピーし、RAMにジャンプして、フラッシュの書き込み/消去が実行されている間に実行できます。これをブートローダーに使用して、ラジオから新しいデータの書き込みと受信を同時に行いました。
2014

@マーク:はい、これはPIC32でも機能し、RAMから実行することもできます。実際、それはより高速です。
Olin Lathrop、2014

6

多くのPIC18には、最大1KのサイズのEEPROMメモリがあります。残念ながら、あなたが参照するPIC18F46J50はそうではありません。EEPROMが利用可能な場合、EEPROMの消去/書き込みサイクルは最低1,000,000で、フラッシュはわずか10,000であるため、データに十分な大きさの場合は、はるかに優れた選択肢です。

PIC18は、他のほとんどのマイクロコントローラーと同様に、ハーバードアーキテクチャと呼ばれるアーキテクチャを使用します。つまり、プログラムとデータ用に物理的に別々のアドレス可能な領域があります(つまり、プログラムアドレス4とデータアドレス4はあり得、それらは同じではありません)。したがって、Cまたはアセンブリ言語の通常の方法を使用してフラッシュメモリを読み書きすることはできません。

代わりに、PIC18ファミリでは、TBLPTRと呼ばれる22ビットレジスタに開始アドレスを設定します。フラッシュからバイトを読み取るには、TBLRD命令を使用します。読み取り後にアドレスを自動的にインクリメントまたはデクリメントするオプションがあり、手動で行う必要はありません。

フラッシュメモリに書き込むには、上書きするフラッシュメモリの1つ以上の64バイトブロックを最初に消去する必要があります。TBLPTRに開始アドレスを再度設定し、他のいくつかのレジスタに値を設定して消去操作を初期化した後、割り込みが無効になり、0x55の直後に0xAAをレジスタに書き込む必要があります。これは消去コマンドのロックを解除し、誤ったコードが誤ってメモリを消去するのを防ぐために必要です。最後に、実際に消去を行うコマンドが実行され、続いて割り込みが再度有効になります。

フラッシュメモリへの書き込みは、ブロックサイズが小さいことを除いて、消去と同様です。書き込みは実際にはTBLWT命令を使用して実行されます。これにより、TBLRD命令と同様に自動インクリメント/デクリメントも可能になります。

構成データを保存することに加えて、フラッシュメモリへの書き込みにより、いわゆる「無線によるファームウェア」を使用して現場でファームウェアを更新することができます。Bluetoothモジュール、Wi-Fi、セルラーモジュール、または有線接続からアップデートを受信し、フラッシュを特定のポイントより上にアップデートできる、通常はプログラムメモリの最初にあるファームウェアの固定ブロックが必要です。新しいコードを含むプログラム(「フェンス」など)。更新が完了すると、リセットが開始され、新しいコードが使用されます。

PICファミリ以外の多くのマイクロコントローラには、フラッシュメモリを更新する機能があります。ほとんどの場合、構成レジスタ、アドレスポインタ、および特別な命令を組み合わせて使用​​して、タスクを実行します。


その「無線によるファームウェア」の方法は非常に興味深いようです。システム内プログラミング(ISP)の必要性はなくなりますか?
Student1 2014

@ student1後で更新を処理できるようにチップにファームウェアを配置する必要があるため、ISPインターフェイスを介したチップの初期プログラミングの必要性がなくなるわけではありません。Arduinoボードで使用されるATmegaマイクロコントローラーには、ブートローダーと呼ばれるこのタイプのファームウェアがすでに搭載されています。そのため、スケッチをArduinoにダウンロードするためにISPインターフェイスを使用する必要はありません。ただし、ブートローダー自体を更新する場合は、ISPインターフェイスが必要です。このブートローダーはUSB経由のアップデートのみを処理するため、実際には「無線によるファームウェア」ではありません。
tcrosley 2014
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.