STM32低電力スタンバイモード+ウェイクアップするWKUPピンの立ち上がりエッジ

今日はSTM32省エネモジュールについてお話します、そうです、このタイトルはすでにあなたに教えてくれますよね?ああ、そうです、タイトルが書かれているので、ビジネスに戻りましょう。STM32がどのように省エネを達成できるかについて、中国の先生はサスペンスを残して著者に従う、つまり私に従うと言いました。

誰もがSTM32の中国語リファレンスマニュアルを開き(読んで、読んでからスクリーンショットを撮ることができます)、STM32の低消費電力モードに関する詳細な注釈があり、突然スクリーンショットを撮りたくなくなりました。

1.スリープモード(Cortex™-M3コアが停止し、NVIC、システムクロック(SysTick)などのCortex-M3コア周辺機器を含むすべての周辺機器が引き続き実行されています)

2.停止モード(すべてのクロックが停止しています)

3.スタンバイモード(1.8V電源オフ)(ブログで特に紹介されているモードで、消費電力が最も少ないモードでもあります)

3枚の写真が添付されましたので、聴衆に喜んで

もらえるといいのですが、私の落書きに注目してください。弟は感謝しています:ああ、この写真は素晴らしいですか?私は3人の老人の家族の地位をもっと真剣に受け止めました。比較、写真からは、入り方や目覚め方、影響が明らかになっていることもわかり、恐ろしいと言えますので、私の美しいグラフィティに注目していただきたいと思います。ハ。

このブログでは、WKUPピンの立ち上がりエッジを使用してMCUをウェイクアップします。申し訳ありませんが、常に立ち上がりエッジを小さな瀋陽としてマークしているため、スタンバイウェイクアップの実装方法を具体的に紹介します。

では、どのようにしてスタンバイモードに入るのでしょうか?再び目を覚ます方法は?

「Enter」の赤い数字を見てくださいね?そうです、この手順に従って対応するレジスタを設定する必要があります。それでは、呼び出しますか?それは何ですか?さて、紹介させてください:

1. Cotex_M3システム制御レジスタのSLEEPDEEPビットはどこにありますか?みなさん、「オーソリティガイド」の182ページを参照して表をご覧ください。もちろん、スクリーンショットを撮ったので、ここで開く必要はありません

。2。電源制御レジスタのPDDSビット( PWR_CR):レジスタビットを参照してください:

3。これ
 まで、電力制御/ステータスレジスタ(PWR_CSR)EWUPビットは、これらの3つのステップでスタンバイモードに入るタスクを完了しました。プログラムでどのように達成しますか?あはは!クシェンが登場。システムがクラッシュしています。しばらくお待ちください。詳細については、10086にお問い合わせください。

ええと、事故がありました、急いでいません、それからスタンバイモードを終了する方法を見てみましょう:写真を再現します:
 それを見てください、ここで私たちは目を覚ます方法の1つを使用します:WKUPピンの上昇3つの言葉があります:エッジ、注意、この立ち上がりエッジへの注意上昇エッジに注意を払う必要がある理由については、ここに置くことに目的があります。この時点で注意を払いたい理由は私と一緒でなければならないことを忘れないでください。それが言及されているときは同じではありません、最初にここでニヤニヤしましょう、

どうやって目を覚ますの?

親愛なる、私たちは外部割り込みトリガーによって目を覚ますので、コードを見てください:

void Wkup_Init(void)
{
    
       
	EXTI_InitTypeDef EXTI_InitStructure;
	NVIC_InitTypeDef NVIC_InitStructure;	
	KEY_Init();//我的IO初始化在按键里已经初始化了	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); 
	
	GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource0);
	
	EXTI_InitStructure.EXTI_Line = EXTI_Line0; //PA0        
	EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;  
	EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;   
	EXTI_InitStructure.EXTI_LineCmd = ENABLE;
	EXTI_Init(&EXTI_InitStructure);
	
	NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;   
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02;
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x03;
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;    
	NVIC_Init(&NVIC_InitStructure);   
	
	if(Check_up() == 0)   //系统初始化后由于没有按下按键,所以系统直接进入了待机模式了,所以下载了程序没有任何反应。需要人为的唤醒:死猪,就知道睡,快醒、、
	{
    
    
	Sys_Standby();         //进入待机模式
	}      
}
//正常模式下会运行中断服务函数,而待机模式下则不会运行中断服务函数,因为待机模式下MCU不工作,所以上升沿的作用也仅仅是唤醒。
//在这里提醒:唤醒只需要上升沿,所以从待机模式切换到正常模式下从始至终都不会执行中断服务函数
//在这里,知道我为什么要在上面提醒大家要注意上升沿了吧、(下面还有)、
//至于为什么不会执行,待会我还会给出解释。

void EXTI0_IRQHandler(void)
{
    
                                                              
	EXTI_ClearITPendingBit(EXTI_Line0); 
	if(Check_up())
	{
    
              
		Sys_Enter_Standby();  
	}
}

上記のコードに精通していますか?ここでは説明しませんので、手順に焦点を当てましょう

1. PWRクロックを有効にします。RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR、ENABLE);

2.ウェイクアップを有効にする機能:PWR_WakeUpPinCmd(ENABLE);

3.スタンバイモードに入ります:PWR_EnterSTANDBYMode();

コードを参照してください:

void Sys_Standby(void) //在唤醒初始化中调用
{
    
       
   RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);
   PWR_WakeUpPinCmd(ENABLE);
   PWR_EnterSTANDBYMode();        
}
void Sys_Enter_Standby(void)//在中断函数里调用,用来复位,然后进入待机模式
{
    
                 
    RCC_APB2PeriphResetCmd(0X01FC,DISABLE);    //在这里只是复位了IO口、、至于0x01fc是怎么来的、、大家请看RCC_APB2RSTR(下图)
    Sys_Standby();
}

最後に、キー検出用の処理プログラムを示します。ここでは、3Sは単なる効果であり、使用することも、長くすることもできます(アトミックプログラム、海賊版については教えてください)。

u8 Check_up(void)
{
    
    
      u8 t = 0;
      u8 tx = 0;
      LED0 = 0;
      while(1)
        {
    
    
       if(KEY3 == 1) //检测到按键按下
             {
    
    
          t++;
                  tx = 0;
       }
             else
             {
    
    
                 tx++;
                  if(tx > 3)
                    {
    
    
                        LED0 = 1;
                        return 0;      //错误按键或者按键时间不够
                    }                        
             }
             delay_ms(30);
             if(t > 100)       //100*30ms = 3s
             {
    
    
                   LED0 = 0;
                   return 1;// 3s
        }
    }
}

これを見て、割り込みサービス機能のロジックがわからない方もいらっしゃるかもしれませんが、ここで説明します。

/*从正常运行模式切换到待机模式 按住wkup键 外部中断0中断被触发 
执行中断服务函数 Check_up()函数开始检测 如果时间没超过3s 返回零 
这时工作在正常运行模式 如果按住时间超过了3s 返回值为1 进入待机模式
我们的程序在刚开始运行时就是没有按键按下,所以没有上升沿,初始化函
数里条件成立,从而进入了待机模式:请看初始化的代码:*/
if (Check_up() == 0)
{
    
    
	Sys_Standby();         //进入待机模式
}  
/*从待机模式切换到正常运行模式 按住wkup键的那一瞬间会有一个上升沿 
而这个上升沿执行了唤醒功能但是没有执行外部中断0的中断服务函数 
待机模式下cpu是不工作的 从待机模式唤醒后的代码执行等同于复位后的
执行所以程序又会从头开始执行(这句话很重要) 然后又会执行到 Check_up()
函数检测 如果按住键盘的时间没有超过3s 还是会处于待机模式 加入超过了3s 
返回值为1 条件不成立 就会切换到正常运行模式 所以结论就是外部中断0的中
断服务程序在待机模式切换到正常运行模式的时候从始至终是不会运行的

记住:唤醒中只是说需要上升沿、、并没有说要进入中断*/

など:

  1. 通常の動作の場合は、まず割り込みプログラムを実行し、3秒かどうかを判断して、待機するかどうかを決定します。
  2. スタンバイ状態の場合は、最初にリセットして初期化し、3秒かどうかを判断して、電源を入れるかどうかを決定します。

あはは!ここに何が見えるのかわからないのですか?私も初心者ですので、理解できることを参考にして、ユーモラスだと思うスタイルを使ってみてはいかがでしょうか。皆さんご容赦ください。初心者は必然的に誤解を招いたり、理解や会話が不完全になったりするので、ここで間違いをお許しください。別の午後、考えを終えてこのブログを書きました。少しお腹がすいた。ああ、ああ。 、私はあなたたちを助けることができることを願っています、ありがとう!

おすすめ

転載: blog.csdn.net/qq_39400113/article/details/109130320