create every day - 福野泰介の一日一創

マイコンLPC1114の外部クリスタルの自動判別方法

2015/07/26 23:55:00
#lpc1114 #IchigoJam #maker 

外部クリスタルが標準搭載となったIchigoJam UIchigoJamは、I2Cサーボにも対応し、日常をオートメーション化する組み込みガジェット開発用にも便利に使いやすくなるようバージョンアップ中です。

CPU(NXP社LPC1114FN28)がICソケットで抜き差し可能になりました。 大きめのマイナスドライバーを隙間に差し込むと比較的簡単に取り外すことができます。 ファイル番号0に、プログラムを保存しておくと、BTNピンをGND接続で起動時に自動的に読み込まれ実行します。

その際、IchigoJam U用に書き込まれた外部クリスタル12MHz対応版の場合、クリスタルも別途付けておく必要がありましたが、 現在開発中の1.0.2β8では、外部クリスタルが付いてない時に、自動的に内蔵発振器を使って動作するように改良しました。 (開発中のファームウェアは、IchigoJam-FANのファイルからダウンロードできます)

IchigoJam-FANへ投稿いただいたWDT(ウォッチドッグタイマー)を使った方法を実装しました。
WDTとは、マイコンが自分自身がちゃんと動いていることを定期的に確認したり、自動的に再起動したりしてくれる便利な機能です。怪しいことが起きたら吠えて知らせてくれる、まさに番犬(=ウォッチドッグ)!

1. WDTによって再起動されたのであれば内蔵発振器で動かす

if (LPC_SYSCON->SYSRSTSTAT & (1 << 2)) {
	// IRC
} else {
	// try XTAL
}

2. 通常起動なら、WDTをまず動かす
int freqsel = 1 // 1:0.6MHz - 15:4.6Mhz
int divsel = 64; // 2(fast) - 64(slow)
LPC_SYSCON->SYSAHBCLKCTRL |= (1 << 15); // WDT on
LPC_SYSCON->PDRUNCFG &= ~(1 << 6) // WDT on
LPC_SYSCON->WDTOSCCTRL = (divsel / 2 - 1) | (freqsel << 5); // 1, 64 = 9.3kHz
LPC_SYSCON->WDTCLKDIV = 1;
LPC_SYSCON->WDTCLKSEL = 2; // WDT
LPC_SYSCON->WDTCLKUEN = 0;
LPC_SYSCON->WDTCLKUEN = 1;
LPC_WDT->MOD |= (1 << 0) | (1 << 1); // enable、auto reset
LPC_WDT->MOD &= ~(1 << 2) // clear timeout flg
LPC_WDT->TC = 0xff; // min 0xff
LPC_WDT->FEED = 0xaa;
LPC_WDT->FEED = 0x55;

3. 外部クリスタルに切り替える(外部クリスタルがついてないとWDTが自動的に再起動して1へ)
LPC_SYSCON->SYSPLLCLKSEL = 1; // use XTAL
LPC_SYSCON->SYSPLLCLKUEN = 0;
LPC_SYSCON->SYSPLLCLKUEN = 1;

4. 外部クリスタルでちゃんと動いたら、WDTを止める
LPC_SYSCON->PDRUNCFG |= 1 << 6; // WDT off
LPC_SYSCON->SYSAHBCLKCTRL &= ~(1 << 15) // WDT off

日常とコンピューターがどんどん近づけていきましょう!


(こちら、IchigoJam Uより小型なIchigoJam、クリスタルを挿しても挿さなくても動いて便利!)

Tweet
クリエイティブ・コモンズ・ライセンス
この作品は「Creative Commons — CC BY 4.0」の下に提供されています。
CC BY 福野泰介 - Taisuke Fukuno / @taisukef / high-res profile image