watcdogtimerrrrrrrrrr
WatchDogTimer.cpp@0:2d7cdbcc260e, 2015-02-24 (annotated)
- Committer:
- ryuna
- Date:
- Tue Feb 24 05:35:07 2015 +0000
- Revision:
- 0:2d7cdbcc260e
aaaaaaaaaaaaa
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
ryuna | 0:2d7cdbcc260e | 1 | #include "mbed.h" |
ryuna | 0:2d7cdbcc260e | 2 | #include "WatchDogTimer.h" |
ryuna | 0:2d7cdbcc260e | 3 | |
ryuna | 0:2d7cdbcc260e | 4 | /*-------------------------------------------------------------------------------------------------- |
ryuna | 0:2d7cdbcc260e | 5 | Watchdogクラス |
ryuna | 0:2d7cdbcc260e | 6 | --------------------------------------------------------------------------------------------------*/ |
ryuna | 0:2d7cdbcc260e | 7 | // WDT発生までの時間を秒数で指定する |
ryuna | 0:2d7cdbcc260e | 8 | |
ryuna | 0:2d7cdbcc260e | 9 | |
ryuna | 0:2d7cdbcc260e | 10 | Watchdog::Watchdog() |
ryuna | 0:2d7cdbcc260e | 11 | { |
ryuna | 0:2d7cdbcc260e | 12 | |
ryuna | 0:2d7cdbcc260e | 13 | } |
ryuna | 0:2d7cdbcc260e | 14 | |
ryuna | 0:2d7cdbcc260e | 15 | void Watchdog::kick(float s) |
ryuna | 0:2d7cdbcc260e | 16 | { |
ryuna | 0:2d7cdbcc260e | 17 | // WDTを動作可能にする P22 |
ryuna | 0:2d7cdbcc260e | 18 | LPC_SYSCON->SYSAHBCLKCTRL |= (1<<15); |
ryuna | 0:2d7cdbcc260e | 19 | // WDTクロックソースの選択 |
ryuna | 0:2d7cdbcc260e | 20 | // b00 IRC発振器 |
ryuna | 0:2d7cdbcc260e | 21 | // b01 メインクロック |
ryuna | 0:2d7cdbcc260e | 22 | // b10 WDT発振器 |
ryuna | 0:2d7cdbcc260e | 23 | LPC_SYSCON->WDTCLKSEL = 0x01; |
ryuna | 0:2d7cdbcc260e | 24 | // WDTクロックソース更新 |
ryuna | 0:2d7cdbcc260e | 25 | LPC_SYSCON->WDTCLKUEN = 0; |
ryuna | 0:2d7cdbcc260e | 26 | LPC_SYSCON->WDTCLKUEN = 1; |
ryuna | 0:2d7cdbcc260e | 27 | while (!(LPC_SYSCON->WDTCLKUEN & 0x01)); |
ryuna | 0:2d7cdbcc260e | 28 | // WDTレジスタの設定(SystemCoreClock=48MHzの場合) P276 |
ryuna | 0:2d7cdbcc260e | 29 | LPC_SYSCON->WDTCLKDIV = 4; // WDTクロック分周レジスタ(0=disable,1~255=分周値) |
ryuna | 0:2d7cdbcc260e | 30 | uint32_t clk = SystemCoreClock / 16; // WD has a fixed /4 prescaler, PCLK default is /4 |
ryuna | 0:2d7cdbcc260e | 31 | LPC_WDT->TC = s * (float)clk; // タイムアウト値を設定 |
ryuna | 0:2d7cdbcc260e | 32 | Watchdog::enable(); // Enabled and Reset and reload |
ryuna | 0:2d7cdbcc260e | 33 | } |
ryuna | 0:2d7cdbcc260e | 34 | // WDTカウンタリロード |
ryuna | 0:2d7cdbcc260e | 35 | void Watchdog::kick(void) |
ryuna | 0:2d7cdbcc260e | 36 | { |
ryuna | 0:2d7cdbcc260e | 37 | //__disable_irq(); |
ryuna | 0:2d7cdbcc260e | 38 | LPC_WDT->FEED = 0xAA; |
ryuna | 0:2d7cdbcc260e | 39 | LPC_WDT->FEED = 0x55; |
ryuna | 0:2d7cdbcc260e | 40 | //__enable_irq(); |
ryuna | 0:2d7cdbcc260e | 41 | } |
ryuna | 0:2d7cdbcc260e | 42 | // WDT有効 |
ryuna | 0:2d7cdbcc260e | 43 | void Watchdog::enable(void) |
ryuna | 0:2d7cdbcc260e | 44 | { |
ryuna | 0:2d7cdbcc260e | 45 | LPC_WDT->MOD = 0x3; // b1=resetを発生させる,b0=enable |
ryuna | 0:2d7cdbcc260e | 46 | kick(); |
ryuna | 0:2d7cdbcc260e | 47 | } |
ryuna | 0:2d7cdbcc260e | 48 | // WDT無効(debug用) |
ryuna | 0:2d7cdbcc260e | 49 | void Watchdog::disable() |
ryuna | 0:2d7cdbcc260e | 50 | { |
ryuna | 0:2d7cdbcc260e | 51 | LPC_WDT->MOD = 0x0; |
ryuna | 0:2d7cdbcc260e | 52 | } |