トップ 差分 一覧 ソース 検索 ヘルプ PDF RSS ログイン

LM4F120 の DFU を使う

[電子工作]

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 が動かない

 カテゴリ : もくしいゲームレシピコンピュータ雑文生活電子工作おいしい店マップ

                  Topページへ | もてないSNS「もくしい」