{{category 電子工作}} !!!LF4F120 : Stellaris の DFU を使用する (2013/1) ICDI デバッガがついている Stellaris LaunchPad で使う場合には、特に DFU を使わなくともいいのですが、単品で使う場合に備えてのメモ。 他のシリーズでも同様と思われます。 !!!一番シンプルな方法 フラッシュメモリをクリアする。 フラッシュメモリが空(*(unsigned int *)0x0000.0004 == 0xFFFFFFFF)の場合、自動的に USB DFU(ブートローダ)が起動します。 Stellaris LaunchPad の場合、ICDI 側からフラッシュを消去したのちに、SW を DEVICE にし、USB をデバイス側に接続し、LM Flash Programmer の Configuration タブで USB DFU を選択するだけです。 DFU 用ドライバは [StellarisWare のインストールフォルダ]\windows_drivers にあります。 !!!ブートピンを指定する方法 不揮発の BOOTCFG レジスタにポート、ピン番、論理を指定することで、リセット時に指定した条件がそろうと DFU が起動するようにできます。 ポートの設定等の情報はデータシートの '''Register 38: Boot Configuration (BOOTCFG), offset 0x1D0''' 不揮発レジスタの操作については '''8.2.3.6 Non-Volatile Register Programming''' にあります。 不揮発レジスタの一部は LM Flash Programmer でも操作できるのですが、BOOTCFG はいじれないようです。 仕様がないので下記のコードで試したところ、書き換わって PortB5=H (Stellaris LaunchPad の場合、3.3V と PB5 と書いてある隣り合うピンをショート)にすることで DFU が起動するようになりました。PortB5 以外を使用する場合には下記コード中の該当箇所を書き換えれば動作します。多分。 #include "inc/hw_flash.h" #include "inc/hw_ints.h" #include "inc/hw_sysctl.h" #include "inc/hw_types.h" #include "driverlib/debug.h" #include "driverlib/flash.h" #include "driverlib/interrupt.h" // ブートピンの設定。 // 一度実行してしまうと CPU Unlock するまで変更できないので注意すること。 void setbootcfg(void) { int BOOTCFGV ; // 出荷時値 BOOTCFGV = 0xFFFFFFFE ; // ここでポート、信号番号、論理のビットをクリア BOOTCFGV &= (~(FLASH_BOOTCFG_PORT_M + FLASH_BOOTCFG_PIN_M + FLASH_BOOTCFG_EN + FLASH_BOOTCFG_POL)) ; // ここでポート、信号番号、論理を指定 BOOTCFGV |= (FLASH_BOOTCFG_PORT_B + FLASH_BOOTCFG_PIN_5 + FLASH_BOOTCFG_POL) ; // BOOTCFG に書き込み HWREG(FLASH_FMD) = BOOTCFGV; HWREG(FLASH_FMA) = 0x75100000; HWREG(FLASH_FMC) = FLASH_FMC_WRKEY | FLASH_FMC_COMT; // 書き込み完了待ち while(HWREG(FLASH_FMC) & FLASH_FMC_COMT) ; } !!!ブートピンの指定を変更、クリアするには 不揮発レジスタ BOOTCFG のビットは 1->0 にしか変えられないため、ピンの指定をプログラムから変更、クリアする方法はありませんが、データシートの '''4.3.4.3 Recovering a "Locked" Microcontroller''' の操作によって、LSI 全体を初期化することで BOOTCFG を出荷時値に戻せます。 ここに書いてある操作は面倒なのですが、LM Flash Programmer の Other Utilities タブにある、Debug Port Unlock を行うことで、同じ効果があるようです。 CPU 種別の選択がありますが、Stellaris® Blizzard-class との記述が DATA SHEET にあるので、1番目が正解、ですね。多分... (2013/1/31 訂正) ただし、DFU からこの操作は行えないので、ICDI ないしは JTAG プログラマ経由での接続が必要になります。 ---- 類似の記事: [[LM4F120 Stellaris LaunchPad の UART5 が動かない]]