国产毛片a精品毛-国产毛片黄片-国产毛片久久国产-国产毛片久久精品-青娱乐极品在线-青娱乐精品

STM32的待機喚醒實驗分析(基于原子哥程序)

發布時間:2016-10-20 15:36    發布者:designapp
關鍵詞: STM32 , 待機喚醒
  前段時間我稍微涉及節能減排大賽、、倡導節能的社會、、沒錯了、你真是太聰明了、、知道了我今天要講關于STM32節能方面的模塊、、沒錯、、這標題已經告訴你了是吧、、哦,對,標題有寫、、所以、、言歸正傳、至于STM32如何達到節能的、、語文老師說要留下懸念、、跟著作者走下去、、也就是跟我啦、、
  大家翻開STM32的中文參考手冊(你們看就行了,我翻,然后截圖),里面關于STM32的低功耗模式有詳細的標注,突然不想截圖。。
  1、睡眠模式(Cortex?-M3內核停止,所有外設包括Cortex-M3核心的外設,如NVIC、系統時鐘(SysTick)等仍在運行)
  2、停止模式(所有的時鐘都已停止)
  3、待機模式(1.8V電源關閉)(我們本博客中具體介紹的一種模式,也是功耗最低的模式)
  現附上三者照片、、望觀眾好好欣賞、、還有請稍微注意下我的涂鴉、、小弟感激不盡:
  


  啊哈、、這照片是不是很神奇呀、、即把三個老家伙的家底進行了較為認真的比較,而且從照片中我們也可以看出,如何進入,如何喚醒他們、、而且有什么影響都跟我們透露了、、可謂是后生可畏呀、、所以我叫大家注意我美麗的涂鴉是有道理的、、哈、
  在本博客中,我們就利用WKUP引腳的上升沿來喚醒MCU、、不好意思哈、、老是把上升沿打成上小沈陽、、所以我們就具體來介紹待機喚醒的實現方法、、
  那我們要怎么來進入待機模式、、又要怎么喚醒呢?
  


  看到“進入”中的紅色數字標號了吧、、沒錯了、、我們只要按照此步驟來設置相應的寄存器就行了、、那、、我打???的是什么呢??好了、、請容許我介紹下:
  1、 Cotex_M3系統控制寄存器中的SLEEPDEEP位到底在哪呢??大家請翻開《權威指南》第182頁可以看到表格、、當然這里不用你翻開、、因為我已截圖:
  


  2、電源控制寄存器(PWR_CR)中PDDS位:請看寄存器的位:
  


  3、電源控制/狀態寄存器(PWR_CSR)中EWUP位
  


  至此、我們通過這三步、完成了進入待機模式的任務、、那我們怎么通過程序實現呢?啊哈、、庫神出現吧、、:::系統出現奔潰、、請稍后、、詳情請咨詢10086、、
  額、、出現了點意外、、不急哈、、那我們先來看看怎么退出待機模式:重現一張圖片:
  


  看到了吧、、在這里我們就利用其中一種方式來喚醒:WKUP引腳的上升沿、、注意哈、、注意此上升沿三個字哈、、 至于為什么要注意上升沿、、在這里提出我也是有目的、、先記著哈、、你此時想的為什么要注意的原因肯定跟我待會提到的時候不一樣、、在此先奸笑下、、
  那我們要怎么來喚醒呢??
  親、、我們通過外部中斷觸發來喚醒、、所以請看代碼:
  1 void Wkup_Init(void)
  2 {
  7 EXTI_InitTypeDef EXTI_InitStructure;
  8 NVIC_InitTypeDef NVIC_InitStructure;
  9
  10 KEY_Init();//我的IO初始化在按鍵里已經初始化了
  11
  12 RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
  13
  14 GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource0);
  15
  16 EXTI_InitStructure.EXTI_Line = EXTI_Line0; //PA0
  17 EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
  18 EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
  19 EXTI_InitStructure.EXTI_LineCmd = ENABLE;
  20 EXTI_Init(&EXTI_InitStructure);
  21
  22 NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;
  23 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02;
  24 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x03;
  25 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  26 NVIC_Init(&NVIC_InitStructure);
  27
  28 if(Check_up() == 0) //系統初始化后由于沒有按下按鍵、、所以系統直接進入了待機模式了,所以下載了程序沒有任何反應、、需要人為的喚醒:死豬,就知道睡,快醒、、
  29 {
  30 Sys_Standby(); //進入待機模式
  31 }
  32 }
  復制代碼
  復制代碼
  //正常模式下會運行中斷服務函數,而待機模式下則不會運行中斷服務函數、、因為待機模式下MCU不工作,所以上升沿的作用也僅僅是喚醒、、
  //在這里提醒:喚醒只需要上升沿、、所以從待機模式切換到正常模式下從始至終都不會執行中斷服務函數
  //在這里,知道我為什么要在上面提醒大家要注意上升沿了吧、(下面還有)、
  //至于為什么不會執行,待會我還會給出解釋、、
  3 void EXTI0_IRQHandler(void)
  4 {
  5 EXTI_ClearITPendingBit(EXTI_Line0);
  6 if(Check_up())
  7 {
  8 Sys_Enter_Standby();
  9 }
  10 }
                                
                                                               
                                
                  看到以上代碼會不會熟悉呢??在這里就不解釋了哈、、所以重點來講講步驟
  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)
  29 {
  30 Sys_Standby(); //進入待機模式
  31 }
  從待機模式切換到正常運行模式 按住wkup鍵的那一瞬間會有一個上升沿 而這個上升沿執行了喚醒功能但是沒有執行外部中斷0的中斷服務函數 待機模式下cpu是不工作的 從待機模式喚醒后的代碼執行等同于復位后的執行所以程序又會從頭開始執行(這句話很重要) 然后又會執行到 Check_up()函數檢測 如果按住鍵盤的時間沒有超過3s 還是會處于待機模式 加入超過了3s 返回值為1 條件不成立 就會切換到正常運行模式 所以結論就是外部中斷0的中斷服務程序在待機模式切換到正常運行模式的時候從始至終是不會運行的
  記住:喚醒中只是說需要上升沿、、并沒有說要進入中斷
  所以:
  1 、如果是正常運行,先執行中斷程序,判斷是否3秒,決定是否待機。
  2 、如果是待機狀態,則先復位并初始化,判斷是否3秒,決定是否開機。
  啊哈、、不知看到這里的你理解得怎么樣了、、我也是初學者,盡量用我所理解的來幫助你們理解、、用點自認為是幽默的風格來、、不會顯得那么的死板、、希望大家見諒哈、、初學者難免有理解上的失誤或者不懂或者講得不全面、、所以在這有寫錯的敬請原諒哈、、
本文地址:http://www.qingdxww.cn/thread-176538-1-1.html     【打印本頁】

本站部分文章為轉載或網友發布,目的在于傳遞和分享信息,并不代表本網贊同其觀點和對其真實性負責;文章版權歸原作者及原出處所有,如涉及作品內容、版權和其它問題,我們將根據著作權人的要求,第一時間更正或刪除。
潘瑋柏 發表于 2016-10-25 00:15:54
厲害啊。我的哥
您需要登錄后才可以發表評論 登錄 | 立即注冊

廠商推薦

  • Microchip視頻專區
  • FPGA設計流程培訓教程
  • Chiptorials——如何使用ATECC608 TrustFLEX實現公鑰輪換
  • Chiptorials ——使用ATECC608 TrustFLEX實現基本非對稱身份驗證
  • Chiptorials ——如何將CryptoAuthLib庫用于Microchip安全身份驗證IC
  • 貿澤電子(Mouser)專區

相關視頻

關于我們  -  服務條款  -  使用指南  -  站點地圖  -  友情鏈接  -  聯系我們
電子工程網 © 版權所有   京ICP備16069177號 | 京公網安備11010502021702
快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲欧美成人永久第一网站 | 97在线视频免费公开观看 | 狠狠色综合网站久久久久久久 | 中文字幕日韩一区二区三区不卡 | 九九视频在线观看视频23 | 欧美日本免费一区二区三区 | 欧美日韩一区二区三区视视频 | 青青草国产一区二区三区 | 天堂网www在线 | 亚洲黄色片视频 | 亚洲黄色免费网站 | 免费在线观看污视频网站 | 国产福利午夜自产拍视频在线 | 亚洲黄色在线视频 | 天天操夜夜艹 | 欧美日韩高清在线观看一区二区 | 欧美日韩国产高清视频 | 免费看国产黄色片 | 亚洲看片| 美女胸又大又黄又www小说 | 国产成人在线观看免费网站 | 亚洲天堂五月天 | 美女视频黄的免费视频网页 | aaa免费毛片 | 岛国免费视频 | 婷婷激情六月 | 亚洲天堂久久精品成人 | 成人欧美一区二区三区在线 | 狠狠狠色丁香婷婷综合久久俺 | 四虎影视884a精品国产古代 | 国产在线观看入口 | 久久国产成人 | 国产日韩欧美一区二区三区综合 | 国产成人香蕉在线视频网站 | 欧美一级在线观看视频 | 亚洲一区不卡视频 | 1国产精品卡1卡2卡3 | 国产精品福利在线 | 真实国产乱视频国语 | 99热99re8国产在线播放 | 两个人在线观看视频bd |