WDT

22 Jun 2014

毎度お世話になっております。

今回はWDTについてお教え下さい。

CPUは LPC1114FN28/102です。

以下のようなコードで動作はしているのですがこれで正しいでしょうか?余計なコードなどが有りますか?

他の方のソースを見ると、SYSAHBCLKCTRLやWDTCLKSEL、WDTCLKDIVなどを設定するコードが見えないのですが、自分の環境ではこれらを設定しないと動かないようです。 https://mbed.org/users/WiredHome/code/Watchdog/file/2873f068f325/Watchdog.cpp

毎度申し訳ないのですが、またよろしくご教授をお願いいたします。

class Watchdog {
public:
    void kick(float s) {
		// クロック関係の設定 P22
		LPC_SYSCON->SYSAHBCLKCTRL |= (1<<15);	// WDTクロックをenable
		LPC_SYSCON->WDTCLKSEL = 0x01;			// WDTクロックソースとしてメインクロックを使用する
		LPC_SYSCON->WDTCLKUEN = 0;				// WDTクロックソース更新・・・0を書き込んでから
		LPC_SYSCON->WDTCLKUEN = 1;				// 1を書き込む
		while (!(LPC_SYSCON->WDTCLKUEN & 0x01));// 更新待ち
		// WDTレジスタの設定 P276
		LPC_SYSCON->WDTCLKDIV = 4;				// WDTクロック分周レジスタ(0=disable,1~255=分周値)
		uint32_t clk = SystemCoreClock / 16;	// WD has a fixed /4 prescaler, PCLK default is /4 
        LPC_WDT->TC = s * (float)clk;       	// タイムアウト値を設定
		enable();								// Enabled and Reset and reload
    }
	// WDT有効
	void enable() {
		LPC_WDT->MOD = 0x3;	// b1=resetを発生させる,b0=enable
        kick();
	}
	// WDT無効(debug用)
	void disable() {
		LPC_WDT->MOD = 0x0;
	}
	// WDTカウンタリロード
    void kick() {
		__disable_irq();
        LPC_WDT->FEED = 0xAA;
        LPC_WDT->FEED = 0x55;
		__enable_irq();
    }
};
26 Jun 2014

こんにちは。

私の個人的な意見ですが、(動作している)コードが正しいかどうかを第三者が判断するのは少し難しいのではないかと思います。

Quote:

他の方のソースを見ると、SYSAHBCLKCTRLやWDTCLKSEL、WDTCLKDIVなどを設定するコードが見えないのですが、自分の環境ではこれらを設定しないと動かないようです。 https://mbed.org/users/WiredHome/code/Watchdog/file/2873f068f325/Watchdog.cpp

おそらく、他の方のコードでは別の部分でそれらのレジスタを設定されているのではないでしょうか。使用されているマイコンも異なっているので、レジスタの構造も若干違うのかも知れません。

例えば SYSAHBCLKCTRL に関しては、LPC1114のポーティングでは初期化時にデフォルト値に対して IOCON のみをイネーブルにしています。

https://github.com/mbedmicro/mbed/blob/master/libraries/mbed/targets/cmsis/TARGET_NXP/TARGET_LPC11XX_11CXX/TARGET_LPC11XX/system_LPC11xx.c

その他のビットについては、APIが呼び出された場合に必要に応じて設定されるようになっています。以下は、PwmOut で設定される例です(pwmout_init 関数内)。

https://github.com/mbedmicro/mbed/blob/master/libraries/mbed/targets/hal/TARGET_NXP/TARGET_LPC11XX_11CXX/pwmout_api.c

SYSAHBCLKCTRL の WDT ビットについては、mbed library 側で設定している部分はないと思われるので、デフォルト値のまま(WDT ディセーブル)になっていると思います。

26 Jun 2014

お世話になっております。

mbedではクロックなどの初期化処理に決まったルールがあるものと勘違いしておりました。「決まりはなくインプリメントする人次第」であると言う事なんですね。

Quote:

APIが呼び出された場合に必要に応じて設定されるようになっています。

mbedで提供されているAPI以外の事をするときには、mbedが初期化処理で何をしているか、またAPIを使うとどのレジスタが変化するかなどを調べながらと言うことですね。了解しました。

答えにくい質問を出してしまって申し訳ありません。またお答え頂き有り難うございます。

おかげさまでmbedとの付き合い方が少しだけ分かってきたような気がします。