こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

SH2 (SH7144)のソフトウェアスタンバイ

初めて質問します。
マイコン初心者なので宜しくお願いします。

SH-7144で、ソフトウェアスタンバイをIRQ3から解除したいのですが、うまくいきません。
環境は、HEWを使ってます。


実験中の為コメント付きの汚いコードになってますが、あらかじめ失礼します。

以下コードです。

// スリープ時の処理を設定
SBYCR.BIT.SSBY = 0x01; // SLEEP 命令実行後、ソフトウェアスタンバイモードに遷移

//SBYCR.BIT.HIZ = 0x01; // ソフトウェアスタンバイモード時に、端子状態をハイインピーダンス
SBYCR.BIT.HIZ = 0x00; // デバッグ用

//SBYCR.BIT.IRQEH = 0x01; // IRQ7~4 ソフトウェアスタンバイモードの解除を無効にする
SBYCR.BIT.IRQEH = 0x00; // デバッグ用
SBYCR.BIT.IRQEL = 0x00; // IRQ3~0 ソフトウェアスタンバイモードの解除を有効にする

//INTC.ICR1.BIT.IRQ3S = 0x00;
//INTC.ICR2.BIT.IRQ3ES = 0x00;
INTC.ICR1.BIT.IRQ3S = 0x01;
INTC.ICR2.BIT.IRQ3ES = 0x00;

INTC.IPRA.BIT._IRQ3 = 0xF;

~~~~~~~~~中略~~~~~~~~~~~

// 42PIN を Port A.PA9 から IRQ3 として使用する
PFC.PACRL1.BIT.PA9MD = 0x02;


//INTC.IPRH.BIT._WDT = 0xF;

WDT.WRITE.TCSR = 0xA55F; // WT/IT = 1, TME = 0, CKS2,1,0 = 0
//WDT.WRITE.RSTCSR = 0x5A5F;

sleep();

以上コードでした。


//INTC.ICR1.BIT.IRQ3S = 0x00;
//INTC.ICR2.BIT.IRQ3ES = 0x00;
INTC.ICR1.BIT.IRQ3S = 0x01;
INTC.ICR2.BIT.IRQ3ES = 0x00;
の部分ですが、本来IRQ3がローの時にスタンバイ解除したかったのですが、
ハードウェアマニュアルの低消費電力状態の項目には、立ち上がり・立ち下がりエッジでの表現しかなかったため上記のような状態になりました。

WDTのみでパワーオンリセットが出来る事と、IRQ3だけで割り込みが出来る事は確認出来たのですが、どうしてもスタンバイの解除が出来ません。

それと、スタンバイの解除が出来た場合は、WDT同様にパワーオンリセットになると考えて宜しいでしょうか。

アドバイス等でも宜しいのでお願いします。

投稿日時 - 2010-12-06 15:35:54

QNo.6366696

すぐに回答ほしいです

質問者が選んだベストアンサー

こんにちは。

当方手持ちの7144ボードで、ご提示のコードを試してみたところ、割と普通に起きてくれましたよ。
もしかして、何か勘違いをされていませんでしょうか。
スタンバイの解除が出来た場合は、リセットではなく、IRQ3の割り込みが発生した時と同じ事が、SLEEP命令の次から起こります。
つまり、SRを0にするなどして割り込みを許可していれば、IRQ3の割り込みハンドラが走り出すし、割り込み禁止なら、SLEEP命令の次から何事もなかったかのように走り出します。
この観点から、もう一度ご確認されてみてはいかがでしょうか。

ご提示のコードから見えない事の確認事項としては、
・WDTは、もともと使っていないですよね?(TCSRのTMEが1になっていないですよね?)
という事くらいでしょうか。

あと、「デバッグ中」の実験もしてみましたが、
・レベルセンスでも、起きてきました。
・SBYCRのHIZビットを1に設定しても、起きてくれました。

もう少しですので、頑張って下さい。

あと、蛇足ながら、「パワーオン・リセット」という用語について。
WDTでのリセットと、パワーオン・リセットは、ソフトウェアから見ると似ていますが、全くの別物です。
違いをよくお調べになって、常に意識して区別される事をお勧めいたします。

投稿日時 - 2010-12-07 14:08:26

お礼

pyonmae様
ご回答ありがとうございます。

少し諦めかけていたのですが、pyonmae様の環境で出来たという事で少し頑張ってみました。

ご指摘通り、スタンバイからの復帰に関して認識が間違ってました。
sleep→WDT→WDTの設定によるパワーオンリセット
になるのか、
sleep→IRQ割り込み→mainへ飛ぶ
のどちらかと思ってました。

sleep→IRQ割り込み→sleep直後に戻る
が正解ですね。

IRQ割り込みの時にSCIによるデバッグメッセージを入れていたのですが、SCIがソフトウェアスタンバイ時にリセットされる事を失念していて余計に混乱してしまいました。

IRQ割り込み処理の中に、SCIの初期処理を追加してsleep直後にデバッグメッセージを出力してみた所、スタンバイからの復帰が確認出来ました。

>WDTでのリセットと、パワーオン・リセットは、ソフトウェアから見ると似ていますが、全くの別物です。
違いをよくお調べになって、常に意識して区別される事をお勧めいたします。

ありがとうございます。もう少し勉強してみます。

お陰様で解決出来ました。ありがとうございます。

投稿日時 - 2010-12-07 19:33:24

ANo.2

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.1

データシートRev.4.00 「24.3.2 ソフトウェアスタンバイモード」に関する記載の中に以下の記述があります.

IRQ割り込み入力による解除
スタンバイコントロールレジスタ(SBYCR)のIRQELビット、IRQEHビットが1に設定されている場合、/IRQ端子の立ち下がりエッジまたは立ち上がりエッジ・・・(中略)・・・が検出されると、クロックの発振が開始されます*

記載の通り
SBYCR.BIT.IRQEH = 0x01;
SBYCR.BIT.IRQEL = 0x01;
で試してみましょう.
ビット名称(※イネーブル)から推察しても「24.2.1 レジスタの説明」は誤記かも.

WDTについては「12.4.3」と「12.6.6」を読めば謎が解けると思いますよ.
"WDT = リセット"ではありません.

投稿日時 - 2010-12-07 13:29:39

お礼

bug_bug様
ありがとうございます。

ご指摘通り、
IRQ端子の立ち下がりエッジまたは立ち上がりエッジでしか、動作しませんでした。
なので、IRQは立ち下がりで割り込みされるように設定致しました。

SBYCR.BIT.IRQEH = 0x01;
SBYCR.BIT.IRQEL = 0x01;
に関しては、マニュアル通り、0x01 で無効。0x00 で有効でした。
イネーブルという表現は、少し混乱を生みました。

WDTに関しては、自分の認識に誤りがございました。

ご回答ありがとうございました。

投稿日時 - 2010-12-07 19:20:18

あなたにオススメの質問