手動でフラッシュAVR



注意イメージ-xkcd



あなたが無人島にいると想像してください。 また、マイクロコントローラーをプログラムすることは非常に重要です。 なぜですか? さて、救助のチャンスが急激に低下する緊急ビーコンを修正するとしましょう。



アセンブラーコースを忘れていないことを喜んで、あなたは何とか砂の中に棒でプログラムを書きました。 いくつかの奇跡によって、生き残ったものの中で、コントローラーのドキュメントの印刷が良いことが判明しました(まだ開始する時間がなかったのは良いことです!)そして、プログラムはなんとかマシンコードに翻訳されました。 最もナンセンスがありました-それをコントローラーにフラッシュすること。 しかし、半径500キロメートル以内には、コンピューターはもちろんのことプログラマーは一人もいません。 電源(ココナッツポテトバッテリー)と数本のワイヤしかありません。



素手でMKをフラッシュする方法は?



Atmelは実験的なMKとして機能します。 説明した手法は、コマンドコードがわずかに異なる場合があることを除いて、AVRファミリのほぼすべてのコントローラーで機能します。



インターフェース

AVRファームウェアの最も一般的で便利なインターフェイスはSPI (シリアルペリフェラルインターフェイス)です。 SPIを介して接続するには、4本のワイヤのみが必要で、グランドはカウントしません。



したがって、3つの信号を生成し、(オプションで)1つを読み取る必要があります。 これは最も簡単な図です:



1. SPIの最も単純な接続スキーム。



便宜上、入力信号の表示を追加できます。 スキームは複雑ですが、過度ではありません。



2.シグナル表示のあるスキーム。



バウンス保護



残念ながら、ボタンを使用してSPI信号を生成するだけでは、良い結果が得られません。 この理由は、 接触バウンスと呼ばれる不快な現象です。 閉じられると、機械的接点が衝突し、互いに跳ね返り、1つのパルスではなく、いくつかのパルスが得られます。 バウンスを抑制するには、一対の論理要素から簡単な回路を組み立てる必要があります。



3.チャタリングを抑制するRSトリガー。



これはRSトリガーであり、スイッチの下側の接点を閉じる瞬間に状態「1」に切り替わり、バウンスの残りのパルスを無視します。 「0」に戻るトリガーリセットは、上部の接点が閉じたとき、つまりボタンが放されたときに発生します。



「ほら、逃げちゃった!」と読者は言います。「私は砂漠の島に座っています。 ここでトリガーはどこで取得できますか?」まあ、電子回路なしでバウンスを取り除くことができます。 「乾いた」接触部を湿った液体で置き換えるだけです。 スイッチは、導電性液体に下げられた2つの電極になります。



MOSIおよびRESET信号は、SCKとは異なり、チャター抑制を必要としません。ここでは、サンプリング時の信号レベルのみが重要であり、エッジは重要ではありません。



SPIはどのように機能しますか?





4. SPIのタイミング図。



SPIは同期インターフェイスです。すべての操作は、マスターによって生成されるクロック信号(SCK)のエッジによって同期されます。 最大転送速度は、コントローラのクロック周波数の1/4に制限されています。 最小速度に制限はありません。クロック信号がなければ、データ交換は「凍結」され、インターフェースは任意の期間静的状態のままになります。



SPI伝送は、全方向モードで、各方向にサイクルごとに1ビット実行されます。 SCK信号の立ち上がりエッジで、スレーブデバイスはMOSIラインから次のビットを読み取り、立ち下がりエッジでMISOラインに次のビットを生成します。 図4。



ファームウェアプロトコル

プログラマとMK間のすべての通信は、32ビットコマンドの送信とコントローラーの応答の受信で構成されます。 コマンドの完全なリストはデータシートにあります。ここで、ファームウェアMKに対して実行する必要がある操作をリストします。

  1. コントローラーをプログラミングモードにする。
  2. (オプション)デバイス識別子を読み取ります。
  3. 消す
  4. フラッシュに記録します。
  5. (オプション)記録の検証。


各ステップを詳細に検討してください。



プログラミングモードを有効にする



プログラミングモードは、RESETフットに「0」を供給することでアクティブになります。 しかし、微妙な点がいくつかあります。 Atmelは、最初にRESETピンとSCKピンを低レベルに設定してから、コントローラーに電源を投入することをお勧めします。 これが不可能な場合は、電源をオンにした後、SCKに「0」を適用し、次にリセットに正パルスを適用します。





5. MKをプログラミングモードに転送します。



しかし、それだけではありません。 次に、実際にプログラミングモードをオンにするコマンドを送信する必要があります: 10101100 01010011 xxxxxxxx xxxxxxxx





6.コマンド「プログラム有効化」。



xで示されるビットは任意です。 3番目のバイトの送信中に、コントローラーは2番目のバイト( 01010011 )を送り返す必要があります。 これが発生した場合、すべてが正常であり、コマンドは受け入れられ、コントローラーはさらなる指示を待っています。 答えが異なる場合は、MKを再起動して再試行する必要があります。



ID検証







7.チーム「読み取り署名バイト」。



MKのメモリに何かを書き込む前に、必要なモデルが正確に揃っていることを確認する必要があります。 各コントローラーモデルには、独自の3バイトの識別子(署名)があります。 次の形式のコマンドで読むことができます

00110000 000xxxxx xxxxxxbb xxxxxxxx

bb (コマンドの3番目のバイト)の代わりに、識別子の最初のバイトを00、2番目を01、3番目を10に置き換えます。 識別子の対応するバイトは、コマンドの4番目のバイトを送信するときにコントローラーによって送信されます。



ATtiny13の場合、識別子の値は00011110 10010000 000001110x1E 90 07 )です。



コントローラーのクリーニング







8.チーム「チップ消去」。



次のステップは、MKのメモリをクリアすることです。これは、コマンド「Chip Erase」を送信することにより実行されます

10101100 100xxxxx xxxxxxxx xxxxxxxx

このコマンドは、フラッシュとEEPROMの内容を消去し(すべてのセルにFFが含まれます)、ロックビットが設定されている場合は削除します。



フラッシュメモリへの書き込み



ATtiny13のプログラムメモリ(フラッシュ)は、512個の2バイトワード(1Kバイト)で構成されています。 ワードアドレスの解像度は9ビットです。 フラッシュメモリはページに分割され、各ページのサイズは16ワード(合計32ページ)です。 フラッシュ記録は2段階で実行されます。



まず、ページバッファにデータをロードする必要があります。そのためには、「プログラムメモリページのロード」コマンドを使用します

01000000 000xxxxx xxxxbbbb iiiiiiii-ワードの下位バイトをロードする場合、および01001000 000xxxxx xxxxbbb iiiiiiii-高ワードをロードする場合。

bbbbコマンドの 3番目のバイトの最下位 4ビットはページ上のワードのアドレス、 iiiiiiiiはロードバイトです。 まず、ワードの下位バイトを常にロードし、次に同じワードの上位バイトをロードする必要があります。





9.コマンド「Load Program Memory Page」。



ページバッファがロードされたら、「Write Program Memory Page」 01001100 0000000a bbbbxxxx xxxxxxxxコマンドを実行して、ページを直接コントローラメモリに書き込む必要があります。

2番目のバイトの最下位ビットと3番目のバイトの最上位4ビット:bbbb-書き込み用の5ビットのページ番号。





10.コマンド「Write Program Memory Page」。



これはすべてややこしく見えますが、複雑なことは何もありません。 プログラムメモリの任意のバイトのアドレスは、10ビットで構成されます: ppppp:bbbb:w 、ここで

ppppp-ページ番号(「プログラムメモリページの書き込み」コマンドで使用);

bbbb-ページ上のワードのアドレス(「プログラムメモリページのロード」コマンド内)。

wは、ワードの上位バイトまたは下位バイトを識別するビットです(「プログラムメモリページの読み込み」コマンドの最初のバイトで暗号化されます)。



読書フラッシュ







11.「Read Program Memory」コマンド。



ファームウェアをMKに書き込んだ後、データの整合性チェックが実行されなかったため、記録されたデータをチェックするとよいでしょう。 確認する唯一の方法は、フラッシュメモリの全量を読み取り、オリジナルと比較することです。



プログラムメモリの読み取りは、書き込むよりも簡単です。 ページングを忘れて、読み取りはバイト単位です。 Read Program Memoryコマンドは次のようになります。

00100000 0000000a bbbbbbbbb xxxxxxxx-ワードの下位バイトの読み取り用、 00101000 0000000a bbbbbbbb xxxxxxxx-上位の場合

2番目のバイトと3番目のバイト全体の最下位ビットa:bbbbbbbbbは、メモリ内のワードのアドレスです。 読み取りバイトは、コマンドの4番目のバイトの送信中に返されます。



プログラミング完了



おそらく最も簡単な操作。 プログラミングを完了してMKを動作モードにするには、RESETに論理レベル「1」を適用するだけで十分です。 コントローラが起動し、新しいプログラムに従って動作します。



練習する

この知識を実践する時が来ました。 実験の犠牲者-ATtiny13-はブレッドボードに閉じ込められ、信号ドライバーが近くに組み立てられ、すべての準備が整いました:



12.実験スキーム。



「どこにも簡単なものはない」という形式のプログラムを縫います。

ldi R24, 0x02 out DDRB, R24 out PORTB,R24 L1: rjmp L1
      
      





彼女がすることは、PB1を足に与えて無限ループに入ることです。 マシンコードでは、たった4語しかかかりません。

 E082 BB87 BB88 CFFF
      
      





コントローラにフラッシュするには、次のコマンドを入力する必要があります。

 1010 1100 0101 0011 0000 0000 0000 0000 // program enable 1010 1100 1000 0000 0000 0000 0000 0000 // chip erase 0100 0000 0000 0000 0000 0000 1000 0010 // load addr.0000 low byte 82 0100 1000 0000 0000 0000 0000 1110 0000 // load addr.0000 high byte E0 0100 0000 0000 0000 0000 0001 1000 0111 // load addr.0001 low byte 87 0100 1000 0000 0000 0000 0001 1011 1011 // load addr.0001 high byte BB 0100 0000 0000 0000 0000 0010 1000 1000 // load addr.0010 low byte 88 0100 1000 0000 0000 0000 0010 1011 1011 // load addr.0010 high byte BB 0100 0000 0000 0000 0000 0011 1111 1111 // load addr.0011 low byte FF 0100 1000 0000 0000 0000 0011 1100 1111 // load addr.0011 high byte CF 0100 1100 0000 0000 0000 0000 0000 0000 // write page
      
      





スタートキー、行こう!





わずか425回のクリックで、MKが蘇ります。 今、あなたは間違いなく、こののろわれた島から見つけられ、救われるでしょう。



All Articles