Micron MT25Q Quad_SPI フラッシュを搭載した STM32F469 チップを使用しています。フラッシュをプログラムするには、開発された外部ローダ プログラムが必要です。問題は、QSPI フラッシュの検証が非常に遅いことです。
ログ ファイルを見ると、フラッシュが 150K バイトのブロックでプログラムされていることがわかります。ただし、検証は 1K バイト ブロックで行われています。さらに、チップは各ブロック チェックの前に再初期化されます。私はこれを STM32cubeIDE と STM32cubeProgrammer の両方で直接試しました。
外部プログラマ プログラムには、正しいチップ構成情報が含まれており、64K ページ サイズが指定されています。プログラマに大きなブロック サイズを使用させる方法がわかりません。SRAM のどの部分が使用されているかを理解しているようで、オンボード SRAM の残りの 256K を QSPI フラッシュのプログラミングに使用しています。データを読み戻すために同じサイズを使用するか、外部ローダーで Verify() 関数を使用することができます。Read() を呼び出してから、データ自体をチェックしています。
何か考えやヒントはありますか?
新しい外部ローダーの作成に関する観察事項をいくつか追加させてください。最初の観察は「しない」ことです。サポートされている外部チップを選択し、ピンアウトして既存のローダーを使用できる場合は、それを実行してください。STM が提供するサンプル プログラムは 4 つだけですが、50 個の外部ローダーが必要です。ハードウェア設計が外部ローダーを備えたデモ ボードの回路図をコピーする場合は、問題なく開発作業を行う必要はありません。
外部ローダーは完全な実行可能ファイルではありません。Init()、Erase()、Read()、Write() などの基本的な操作を行う関数のセットを提供します。秘訣は、main() がなく、プログラムの開始時に起動コードが実行されないことです。
外部ローダーは、「*.stldr」に名前が変更された ELF ファイルです。プログラミング ツールはデバッグ情報を調べて、関数の場所を見つけます。次に、パラメーターを提供するようにレジスターを設定し、関数を実行する PC を設定してから、実行します。これを機能させるために、非常に巧妙な作業が進行中です。プログラマーは、戻り値 (R0) を見て、成功したかどうかを確認します。また、関数がコアをクラッシュさせたか、それともタイムアウトになったかを把握することもできます。
外部の書き込みを非常に楽しいものにしているのは、デバッガーがプログラムを実行しているため、コードが何を行っているかを確認できるデバッガーが存在しないことです。呼び出された関数からの return() でエラーとエンコードされた情報を出力して、何が起こっているかについてのヒントを与えることにしました。
外部ローダーは「完全な」プログラムではありません。スタートアップ コードがないと、多くのオンチップ機能がセットアップされず、機能しないものもあります。少なくとも私はそれを理解できませんでした。正しく構成されていないのか、デバッガーがその使用をブロックしていたのかはわかりません。外部ローダーの例を見ると、非常に単純な方法で記述されており、HAL を呼び出したり、割り込みを使用したりしていません。クロック チェーンを構成するには、コア セットアップ関数を提供する必要があります。タイマーや割り込みが機能していないため、その Hal_Delay() メソッドは決して戻りません。私はそれらを機能させることができず、NVICが何らかの形で無効になっているのではないかと疑っていました. HAL_delay() 関数を、コア クロック レートとループごとの命令サイクルに基づいて回転する for ループに置き換えることになりました。
アプリ ノートでは、基本機能をデバッグするためのスタンドアロン プログラムを開発することを提案しています。それは良い考えですが、挑戦です。外部ローダーを開始する前に、QSPI に必要な操作を実行させましたが、HAL を呼び出す C++ アプリケーションから実行しました。そこから外部ローダーを作成するのは、機能を取り除いて置き換える長い作業でした。ヒントは、例がレジスタ レベルで記述されていることです。私は、QuadSPI ペリフェラルとチップの命令セットを同時に直接処理するのが得意ではありません。
プログラムの通常の起動は排除されます。main() が呼び出される前に行われるすべてのこと (たとえば、startup_stm32f469nihx.s 内) はあなた次第です。これには、クロック チェーンを設定してコア クロックをブーストし、ペリフェラル バスを機能させることが含まれます。プログラムはオンチップ SRAM で実行されるため、初期化された変数はすべて正しくロードされます。データを移動する必要はありませんが、スタックと初期化されていないデータ領域はゼロにすることができます/まだゼロにする必要があります。
これが誰かに役立つことを願っています!