質問:
STM32F407VGT6組み込みマイクロコントローラーに永続的な値を保存する方法は?
Aman Kejriwal
2020-07-13 14:16:57 UTC
view on stackexchange narkive permalink

マイクロコントローラのフラッシュメモリに3つの整数値を保存して、デバイスの停電時にこれらの値が失われないようにしたい。

この目的で使用するメモリの種類と、このメモリブロックへの書き込みと読み取りの方法を正確に理解しようとしています。

HMIを使用してPLCにデータを入力し、PLCがいくつかのモーターを駆動しておもちゃのクワッドコプターの動きを制御するという趣味のプロジェクトを行っています。

Keil uvisionIDEを使用しています。

いくつかの追加の注意事項:

  • 値は2〜3か月に1回変更されます。
  • 値の更新プロセス中に停電が発生する可能性があります。
  • プロセスが中断され、入力された最新の値が失われた場合でも、重要ではありません。
先に進む前に答える必要があることがいくつかあります。(1)これらの3つの整数値は一定のままですか?(2)変更された場合、どのくらいの頻度で変更されますか?(3)MCUの場合、保存されたデータのストアを更新するのにどのくらい時間がかかりますか?(4)値の保存中に電力が失われる可能性はありますか?(5)最新の値を保存することは重要ですか、それとも電源を入れ直した後、以前に保存した値があれば問題ありませんか?
1&2)値はユーザーによって2〜3か月ごとに変更されます。
4)保管中に電力が失われる可能性があります。5)それほど重要ではありません。システムが起動するたびにユーザーにこれらの初期パラメータを設定させないという考え方です。
OK、あなたの説明に基づいて、ここでの回答で、このようなパラメトリック値のストレージを実装する方法を説明します。ところで、あなたはあなたの説明を質問に編集するべきです。コメントが消えることがあります。
二 答え:
Michael Karas
2020-07-13 14:57:24 UTC
view on stackexchange narkive permalink

あまり頻繁に行われないが信頼性が必要なパラメータの保存には、次のアプローチをお勧めします。

  1. MCUとは別の外部メモリコンポーネントを使用します。将来MCUを変更することにした場合、このスキームはより移植性が高くなります。プロジェクト間でスキームを再利用することもできます。
  2. シンプルな実装インターフェースを使用して外部メモリに接続します。私は通常、I 2 sup> Cを選択します。
  3. F-RAMと呼ばれる外部メモリを使用しています。この強誘電体テクノロジーには、ブロックの消去が発生しない、100兆回の読み取り/書き込みに対する高い耐久性、個々の場所を書き換える機能、最終的には超長期のデータ保持など、多くの利点があります。データの更新は、I 2 sup> Cインターフェースが動作するのと同じくらい高速です。前回のプロジェクトでは、サイプレスFM24W256を使用しました。
  4. 常にパラメータをセットとして保存し、CRC-16またはCRC-32をパラメータセットに添付して記述します。データを読み取るときにチェックして、データの整合性を確認してください。
  5. データセットを書き込むたびに、そのコピーを2つ書き込みます。 2番目のコピーを書き始める前に、必ず1つのコピーを完全に完成させてください。これらの書き込みの1つで電源が失われた場合でも、もう1つのコピーは残っています。
  6. 起動時にパラメータを読み取るときにCRCを確認し、正しいCRC検証が行われたデータセットのコピーを取得します。通常の状況では、両方のコピーは同じであり、CRCは良好です。最後にパラメータを更新したときに電源障害が発生した場合は、どちらかのコピーが不良である可能性があります。
  7. 起動時に、1つのCRCが不良であるかどうかをユーザーに通知するか、単に両方のコピーを同じに復元するかを選択できます。これは実際には必要ではなく、ユーザーが次にパラメーターを更新するまで待つことができます。
  8. パラメータの読み取り時に両方のCRCが起動時に不良である場合は、パラメータ値をデフォルトに設定し、場合によっては、パラメータを初期化するために必要なプロセスをシステムに実行します。正しく行われた場合、これは、生産ラインからのフレッシュビルドなど、ストレージがまだ初期化されていない場合にも適用されます。
  9. ol>

    最後のメモ。上記で説明した信頼性アルゴリズムスキームは、不揮発性メモリテクノロジ、シリアルEEPROM、フラッシュ、EEPROMエミュレーションに適用できます。 F-RAMタイプのメモリデバイスの優れた利点はありません。一部のアプリケーションでは、非常に大きくなる可能性のあるデータセットを保存する必要があります。これは、強誘電体テクノロジーが本当に優れている点です。一部のアプリケーションでは、パラメトリックデータを2つの部分に分割します。この部分は、ユーザーが設定を変更した場合にのみ変更され、他の部分は(通常ははるかに小さい)頻繁に更新されます。多くの場合、データの変更は、累積カウンターまたは製品使用時間メーターである可能性があります。

考慮に入れる追加の主題に賛成。
別の提案:不揮発性パラメータセット内にバージョン番号パラメータを含めます。これにより、パラメータセットの内容を更新し、以前のバージョンとの下位互換性を維持できます。ファームウェアはバージョン番号を読み取り、残りのパラメーターの読み取り/解釈方法を知ることができます。
OPは「趣味のプロジェクトをやっている」と書いています
パラメータにバイトカウントを含めると、3つまたは4つの値のセットになります。
@Juraj正しく実行すると、趣味のプロジェクトであっても、デバッグ時間が短縮され、他の作業のために時間が解放されます。F-RAMでさえ、愛好家向けのパッケージやモジュールとして安価に入手できます。趣味のプロジェクトでも、この提案には何の問題もありません。
@Juraj-私は、趣味のプロジェクトとプロの製品開発プロジェクトの両方で、上記のアルゴリズムを何度も実装しました。ほとんどの趣味のプロジェクトは、パラメトリックデータの量が少ないため、最後の段落に従い、ストレージ容量が制限された低コストのシリアルEEPROMを使用する傾向があります。F-RAMを使用すると、説明した理由で必要に応じてパフォーマンス曲線が向上します。ここで共有できる最善の結論は、信頼性と優れた設計手法を実装することが常に最良のアプローチであるということです。初心者のアプローチが(続き)かもしれない迷惑なコーナーのユースケースを防ぎます
(上から続く)失敗し、期待どおりに機能しません。エンジニアリングの一部は、物事をうまく機能させると同時にエレガントにするための芸術です。また、回答に記載されているアプローチは、電気工学業界で30年以上にわたって導き出され、何度も洗練されてきたものであることも共有できます。
2つのコピーのみを使用する場合の問題は、EEPROMまたはフラッシュメモリのチャンクが消去されているときに電力が失われると、読み取りによって有効または一見有効なデータが生成される「不安定な」状態のままになる可能性があることです。とても一貫して。ビットをアトミックにプログラムできる(ただし消去できない)デバイスで3つ以上のブロックを回転シーケンスで使用すると、ぐらつく可能性のあるブロックの内容がプログラム操作と無関係になるようにすることができます。
@supercat-あなたのコメントは、ページまたはブロックレベルの消去を備えたフラッシュタイプのメモリがある場合に当てはまると思います。ワード/バイトレベルの書き込み/消去でシリアルEEPROMを使用する場合、またはF-RAMを使用する場合、データセットの各コピーの更新を常にシリアルに完全に処理する限り、データの3つ以上のコピーをサポートする理由はありません。実際、小さなデータセットの場合、CRC-16またはCRC-32のオーバーヘッドは不要であり、16ビットのチェックサムを実行する非常に単純なXORタイプでエラー検出を十分にカバーできることもわかりました。約17年前に投稿しました(続き)
(上記から続く)www.8052.comでのXORチェックサムの分析は、単純なアルゴリズムが小さなサイズのパラメーターセットのすべてのシングルビットエラーとダブルビットエラーを検出できることを示しました。パラメータセットのサイズを思い出さないでください-おそらく256バイト以下です。
調査する提案として、ここにフレッチャーとアドラーのチェックサムのアルゴリズムを残したかっただけです。中規模のデータセットにFletcher-16を実装するのが好きです。これは、CRCと同様の特性を持ち、計算のオーバーヘッドが少ないように開発されました。また、アルゴリズムは非常に覚えやすく、実装しやすいと思います。
Michel Keijzers
2020-07-13 14:24:48 UTC
view on stackexchange narkive permalink

いわゆる EEPROMエミュレーションを使用できます。これは、フラッシュメモリの一部をEEPROMとして使用します。

STM40x / STM41xのすべてについては、次のドキュメントで読むことができます。

https://www.st.com/resource/en/application_note/dm00036065-eeprom-emulation-in-stm32f40x-stm32f41x-microcontrollers-stmicroelectronics.pdf

もちろん、このEEPROMメモリは通常のフラッシュメモリよりも少なくなります。ページ全体(バイト数は不明)を割り当てる必要がありますが、3バイトには1ページで十分です。

これらの3つの値を頻繁に保存する必要がある場合は、ウェアレベリングについて検討してください(その場合は別のページを使用してください)。

その他の場合:他のSTM32モデルにはさまざまなアプリケーションノートがあります。

このメモリは2〜3か月に1回書き込まれます。
その場合、ウェアレベリングを気にせず、10K回保証されたようなメモリページを書き込むことができます(16ページのパラメーター3.2を参照)。
ドキュメントを共有していただきありがとうございます。私はそれを研究しました、そして今私は私のプロジェクトにeeprom.cを追加しなければなりません。
はい... GitHubの実装を使用したと思いますが、STM32F1用でした。
STM32CUBEIdeを起動しています
どちらを使用したかわからない(自宅のPCの後ろにいない)場合は、https://github.com/nimaltd/eeも確認できます。
かっこいい....それはF4のためにテストされたと言っています。しかし、実際には、ノウハウのためだけにこれらのファイルを生成する方法を考えています。
[チャットでこのディスカッションを続けましょう](https://chat.stackexchange.com/rooms/110554/discussion-between-michel-keijzers-and-aman-kejriwal)。
この解決策をありがとうございました。私はそれを実装し、希望どおりに機能していることを確認します。
聞いてよかった、あなたのプロジェクトで頑張ってください。


このQ&Aは英語から自動的に翻訳されました。オリジナルのコンテンツはstackexchangeで入手できます。これは、配布されているcc by-sa 4.0ライセンスに感謝します。
Loading...