LPC1343 スリープモード(Sleep mode )

やったこと

1. スリープモード(Sleep mode)使用

開発Listへ戻る

LPC1343のスリープモード(Sleep mode)

スリープモードを調べていくことにしました。
マニュアル(UM10375)を見ると3つのモードがあるようです。

1)スリープモード (Sleep mode)
2)ディープスリープモード(Deep sleep mode)
3)ディープパワーダウンモード(Deep power down mode)


今回はスリープモードをやっていきます。

スリープモードは

  • .MCUのコアがストップするが周辺機能(Timerとか)は動いている
  • .Interruptが入るとスリープモードから抜ける。

Interruptが入るまでコードの次の行に進まないという事なようです。


使い方
マニュアルを見ると使い方が書いてあります。(UM10375 3.9.2.2項)
1)PCONレジスタのDPDEN bitを0にする
2)ARM Coretex-M3 SCRレジスタのSLEEPDEEP bitを0にする
3)ARM Coretex-M3 Wait-For-Interrupt インストラクションを使う

1)はレジスタの説明がユーザマニュアルに書いてあるのでOKなんですが
2),3)が良くわかりません。

キーワードをイロイロ入れてググッて見たところ
LPC13xxでのローパワーモードとWake upについての資料をみつけました
(AN10973)

上記の2)ですがSLEEPDEEP bitはSCRレジスタの第2ビットで書き方は
SCB->SCR &= ~(1<<2); // Clear SLEEPDEEP bit
です。

3)については
__WFI();
で良いようです


確認方法

LPC1343 Expressoに内蔵されているP0.7でコントロールするLEDと
さらに追加でP0.6でコントロールするLEDを追加し
2つのLEDで確認します。

2つのLEDとスリープの関係は以下のようにします。
LED0.7を点灯させ
Timerをスタートさせた後でスリープ状態にします。
5秒後のタイマーのinterruptでLED0.7を消灯
スリープから復帰後にLED0.6を点灯させます。
LED0.7とLED0.6が交互に点灯するという感じで見えます。

スリープがなければLED0.7とLED0.6はほぼ同時に点灯し
Timerで5秒カウント後にLED0.7だけ消えます。

コード

#ifdef __USE_CMSIS
#include "LPC13xx.h"
#endif

#include
#include

// Variable to store CRP value in. Will be placed automatically
// by the linker when "Enable Code Read Protect" selected.
// See crp.h header for more information
__CRP const unsigned int CRP_WORD = CRP_NO_CRP ;

int main(void) {
LPC_PMU->PCON &= 0xFFC; // Clear flag bit, DPDEN bit set 0
SCB->SCR &= ~(1<<2); // Clear SLEEPDEEP bit,

LPC_IOCON->PIO0_6 = 0x00; // set as GPIO (Additional LED control PIN)
LPC_IOCON->PIO0_7 = 0x00; // set as GPIO (LPCexpresso LED control PIN)
LPC_GPIO0->DIR |= 0xC0; // P0_6 & p0_7 as output

LPC_GPIO0->MASKED_ACCESS[0x0C0]=0x080; //P0_6=0(LED off) P0_7=1(LED on)
// 32bit counter
NVIC_EnableIRQ(TIMER_32_1_IRQn); // enable Timer32_1 interrupt handler

LPC_SYSCON->SYSAHBCLKCTRL |=0x400; // Timer32B1 Turn ON

LPC_TMR32B1->PR =7200-1; // 0.1ms ,10kHz(Max 32bit dec:4294967295)
LPC_TMR32B1->MCR=0x005; // Stop timer on MR0 and interrupt
LPC_TMR32B1->MR0 = 50000;// 5sec
LPC_TMR32B1->TCR =2; // TCR Reset
LPC_TMR32B1->IR =0x0F; // Clear interrupt flag
LPC_TMR32B1->TCR =1; // TCR start

__WFI(); // Go to Sleep mode

LPC_GPIO0->DATA |=0x40; // P0_6=1(LED on)

// Enter an infinite loop, just incrementing a counter
volatile static int i = 0 ;
while(1) {
i++ ;
}
return 0 ;
}

void TIMER32_1_IRQHandler(void) {

LPC_GPIO0->DATA ^=0x80; // Toggle P0_7
LPC_TMR32B1->IR=0x0F; //clear interrupt flag
}


コード解説 

大体コメントでわかるかなー、と思います
しいて言えば、PCONの設定ではスリープ状態のFlagのクリアとDPDEN bitの0 setを同時にしています。

LPC_PMU->PCON &= 0xFFC; // Clear Flag bit, DPEEN bit set 0

__WFI();をコメントアウト有り無しで確認したところ
先に説明したとおりの動作になりました。

AN10973にはDeep sleep mode, Deep power down modeも説明が載っていたので
試していこうと思います。

開発Listにもどる