2017-11-20 20 views
0

スリープモードでシステムに問題があります。スリープモードから復帰する際に割り込みが発生する

現在、私のMCUは無線で定期的にメッセージを送信する無線チップを駆動しています。私は、無線チップがメッセージを送信しているときにMCUをスリープモードに設定しました。

しかし、無線チップがデータを送信しているときに割り込みが発生し、MCUを起動してデータ送信を中止することがあります。 私はシステムが現在irqを "ランダムに"走らせることができる多くのタスクで動作しているので、どのirqが私を目覚めさせるのかわかりませんが、無線チップが送信しているときにはメッセージ。

スリープモードで使用された__WFI()の後でブレークしようとすると、コールスタックはすでに新しいデータでリフレッシュされていて、最後に実行された命令は何もわかりません。

私は睡眠システムを目覚めさせるirqを知る方法を知っていますか?

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

答えて

1

ウェイクアップ直後にNVIC->ISPR[x]SCB->ICSRレジスタを調べます。ハンドラが実行される前に、あなたが壊すことができない場合は(gccを使用していない場合または同等のもの)、このマクロで__WFI()を置き換える

uint32_t ispr0, ispr1, ispr2, icsr; 
#define __WFI() ({ \ 
    uint32_t primask = __get_PRIMASK(); \ 
    __disable_irq(); \ 
    asm volatile("wfi"); \ 
    ispr0 = NVIC->ISPR[0]; \ 
    ispr1 = NVIC->ISPR[1]; \ 
    ispr2 = NVIC->ISPR[2]; \ 
    icsr = SCB->ICSR;  \ 
    __set_PRIMASK(primask); \ 
}) 

快適に後で内容を確認することができるようにします。私はST Cortex-M3プログラミングマニュアルからレジスタ名を取りました。このプロセスは他のコアと同様でなければなりません。

関連する問題