一。STM32低功耗模式講解
有些設備比如可穿戴設備對功耗的要求非常高,比如手表,我在看時間或者獲取數據的時候就需要正常的執行,
但有的時候比如晚上或有時候不需要使用它,但我們并不需要關機,可以通過低功耗模式讓它更加省電,就延長了它的使用時間。
1. 睡眠模式: 內核停止,但是它的外設比如中斷管理NVIC,系統的時鐘Systick仍在運行。
2. 停止模式:比睡眠模式更加低功耗,所有的時鐘都停止,但是1.8V的內核電源還在工作,但是其他的時鐘比如 PLL,HIS和HSE RC振蕩器功能全部禁止了。
寄存器和SRAM的內容保留。
3. 待機模式:功耗更低,內核1.8V的電源關閉,只有備份寄存器和待機電路維持供電。
寄存器和SRAM內容全部丟失,實現最低功耗。
運行模式,有些場景我們還是需要系統能正常運行,我們要降低功耗的話可以采取以下方式:
1. 降低系統時鐘
2. 關閉APB和AHB總線上未被使用的外設的時鐘。
STM32的三種低功耗模式
要進入這三種低功耗模式或者從三種低功耗模式退出的方法:
1. 睡眠模式:進入的方法:(1)執行WFI指令或WFE指令,只需要調用一個函數就OK了。
喚醒的方法: 對于WFI進入:任一個中斷
對于WFE進入:喚醒事件
2. 停機模式: 進入的方法:PDDS和LPDS位 + SLEEPDEEP位都需要設置,然后再用WFI或WFE指令。
喚醒的方法:任何一種外部中斷都可以(在外部中斷寄存器中設置)
3. 待機模式: 進入的方法: PDDS位+SLEEPDEEP位設置,清除WUF位,然后再用WFI或WFE指令進入
喚醒的方法:通過WKUP引腳的上升沿(PA0引腳),或者RTC鬧鐘事件,或者NRST引腳上的外 部復位,獨立看門狗IWDG復位。常用的是鬧鐘事件或者外部WKUP引腳。
實驗程序用WKUP引腳(PA0)喚醒。
實驗采用待機模式:
待機模式下大部分引腳都處于高阻狀態。
在待機模式下F1只需要2uA的電流,非常低。
二。寄存器和庫函數配置
1. PWR_CR電源控制寄存器
位1: PDDS,在進入待機模式要置1
SLEEPDEEP在系統控制寄存器SCB中置1。
清除PWR_CSR寄存器中的WUF位。
2. PWR_CSR 電源控制/狀態寄存器
退出待機模式有幾種方法,如果要用WKUP引腳喚醒怎么配置?
PWR_CSR寄存器位8,EWUP使能WKUP引腳。
固件庫中低功耗操作函數
調用 void PWR_EnterSTANDBYMode(void); //進入待機模式
這個函數中執行了四個操作:1. PDDS位置1
2. SLEEPDEEP位置1
3. 清除WUF位
4. 執行WFI()指令,當然也可以執行WFE()指令
待機喚醒的配置步驟
三。實驗程序講解
實驗程序比較復雜,主要是為了在同一個WKUP引腳(PA0)長按3秒進入待機模式,在待機模式下,長按3秒待機喚醒。
程序的設計思路提醒:
1. 先寫一個待機喚醒測試
按下某一個按鍵進入待機模式
(1)在FWLlib下面要添加PWR相關的固件庫 .c 和 .h文件
(2)程序設計:程序復位后液晶屏被點亮,顯示一些內容,然后按下KEY0之后進入待機模式,在待機模式下按下WKUP鍵退出待機模式,程序又相當于復位從頭開始執行,液晶屏又重新顯示內容。
int main(void)
{
u8 x=0;
u8 lcd_id[12]; //存放LCD ID字符串
delay_init(); //延時函數初始化
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //設置NVIC中斷分組2:2位搶占優先級,2位響應優先級
uart_init(115200); //串口初始化為115200
LED_Init(); //LED端口初始化
LCD_Init();
KEY_Init();
POINT_COLOR=RED;
LCD_ShowString(30,40,210,24,24,"WarShip STM32 ^_^"); //液晶屏顯示一些內容
LCD_ShowString(30,70,200,16,16,"TFTLCD TEST");
LCD_ShowString(30,90,200,16,16,"ATOM@ALIENTEK");
while(1)
{
if(KEY_Scan(0) == KEY0_PRES)
{
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR,ENABLE); //使能PWR時鐘,在APB1總線上
PWR_WakeUpPinCmd(ENABLE); //使能WKUP喚醒引腳,使得在待機模式下按WKUP鍵能夠退出待機模式
PWR_EnterSTANDBYMode(); //進入待機模式
}
delay_ms(10);
}
}
實驗現象:程序開始運行,液晶屏顯示三行文字,按下KEY0鍵時進入待機模式,液晶屏關閉,按下WKUP鍵,液晶屏重新顯示內容。
2. 實驗程序
在同一個WKUP引腳(PA0)長按3秒進入待機模式,在待機模式下,長按3秒待機喚醒。
wkup.c 文件
//PA0 WKUP喚醒初始化
void WKUP_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
EXTI_InitTypeDef EXTI_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE);//使能GPIOA和復用功能時鐘,因為后面要把PA0引腳配置成外部中斷,所以要開啟復用功能。
GPIO_InitStructure.GPIO_Pin =GPIO_Pin_0; //PA.0
GPIO_InitStructure.GPIO_Mode =GPIO_Mode_IPD;//上拉輸入
GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化IO
//使用外部中斷方式,配置中斷線
GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0); //中斷線0連接GPIOA.0
EXTI_InitStructure.EXTI_Line = EXTI_Line0; //設置按鍵所有的外部線路
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; //設外外部中斷模式:EXTI線路為中斷請求
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 = 2; //先占優先級2級
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2; //從優先級2級
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能外部中斷通道
NVIC_Init(&NVIC_InitStructure); //根據NVIC_InitStruct中指定的參數初始化外設NVIC寄存器
if(Check_WKUP()==0) Sys_Standby(); //開機后沒有連續按下WKUP引腳3秒,進入待機模式 ,只有開機 時連續按下WKUP鍵3秒程序才能正常執行。
}
//檢測WKUP腳的信號
//返回值1:連續按下3s以上
// 0:錯誤的觸發
u8 Check_WKUP(void) //檢測WKUP引腳的電平,3秒鐘內連續按下返回1,
{
u8 t=0; //記錄按下的時間
LED0=0; //亮燈DS0
while(1)
{
if(WKUP_KD)
{
t++; //已經按下了
delay_ms(30);
if(t>=100) //按下超過3秒鐘,每30毫秒 t+1, t計數到100,說明到3秒鐘
{
LED0=0; //點亮DS0
return 1; //按下3s以上了,返回1
}
}else
{
LED0=1;
return 0; //按下不足3秒,返回0
}
}
}
void Sys_Standby(void)
{
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE); //使能PWR外設時鐘
PWR_WakeUpPinCmd(ENABLE); //使能喚醒管腳功能
PWR_EnterSTANDBYMode(); //進入待命(STANDBY)模式 ,進入待機模式
}
main.c文件
int main(void)
{
delay_init(); //延時函數初始化
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//設置中斷優先級分組為組2:2位搶占優先級,2位響應優先級
uart_init(115200); //串口初始化為115200
LED_Init(); //LED端口初始化
WKUP_Init(); //待機喚醒初始化
LCD_Init(); //LCD初始化
POINT_COLOR=RED;
LCD_ShowString(30,50,200,16,16,"Warship STM32");
LCD_ShowString(30,70,200,16,16,"WKUP TEST");
LCD_ShowString(30,90,200,16,16,"ATOM@ALIENTEK");
LCD_ShowString(30,110,200,16,16,"2014/1/14");
while(1)
{
LED0=!LED0;
delay_ms(250);
}
}
//外部中斷,檢測到PA0腳的一個上升沿.
//中斷線0線上的中斷檢測
void EXTI0_IRQHandler(void)
{
EXTI_ClearITPendingBit(EXTI_Line0); // 清除LINE10上的中斷標志位
if(Check_WKUP())//檢測WKUP鍵是不是連續按下3秒鐘,連續按下3秒進入待機模式
{
Sys_Enter_Standby(); //如果是連續按下3秒,就進入待機喚醒模式
}
}
//系統進入待機模式
void Sys_Enter_Standby(void)
{
RCC_APB2PeriphResetCmd(0X01FC,DISABLE); //復位所有IO口
Sys_Standby();
}
程序正常運行時顯示幾行文字,LED0交叉閃爍。
在WKUP_Init函數中如果沒有連續按下3秒就進入待機模式
如果連續按下了WKUP鍵3秒,則正常執行,而在正常執行的情況下因為我們把WKUP設置了外部中斷,進入外部中斷函數
實驗現象:
程序開始執行,判斷WKUP是不是按下了,如果沒有長按3秒就進入待機模式。
因為一開始沒有按WKUP,所以進入待機模式,液晶屏不亮。
然后連續按WKUP3秒后就喚醒了,液晶屏顯示幾行文字,LED0也開始閃爍。
因為,一按WKUP的瞬間就被喚醒,同樣開始執行主函數,執行到
if(Check_WKUP()==0) Sys_Standby(); //不是開機,進入待機模式
因為我們長按了3秒所以這個檢測就不通過,就不會進入待機模式,程序就直接往下執行,液晶屏顯示,LED0閃爍。
接下來再去長按WKUP3秒,又進入待機模式。因為程序正常運行情況下,我們把WKUP設置成了外部中斷,所以一按PA0就會進入外部中斷服務函數,在中斷服務函數中去判斷按下WKUP是不是超過3秒,超過3秒就進入到待機模式,如果按下的時間不到3秒鐘,不會進入待機模式,液晶屏還是正常顯示。
上一篇:51.內部溫度傳感器實驗
下一篇:49. RTC實驗講解
推薦閱讀
史海拾趣
在全球化的浪潮下,Enova Technology Corporation(伊諾瓦科技)也積極拓展國際市場。面對不同國家和地區的文化差異、技術標準和法律法規等挑戰,公司憑借卓越的技術實力和創新能力,成功打破了各種壁壘,贏得了國際市場的認可。
為了更好地適應國際市場的需求,伊諾瓦科技不斷加大對研發創新的投入力度。公司積極引進國際先進技術和管理經驗,加強與國際知名企業和研究機構的合作與交流,不斷提升自身的技術水平和創新能力。同時,公司還積極申請國際專利和認證,確保自身產品在國際市場上具有更強的競爭力和市場地位。
在拓展國際市場的過程中,伊諾瓦科技也面臨著一系列的風險和挑戰。例如,不同國家和地區的文化差異可能導致產品在推廣過程中受到一定的阻礙;不同國家和地區的技術標準和法律法規也可能對公司的產品和技術提出更高的要求。然而,在公司的不斷努力下,這些挑戰都被逐一克服。通過深入了解不同國家和地區的市場需求和文化背景,公司成功推出了一系列符合當地市場需求的產品和解決方案;同時,公司還加強了與當地政府和行業協會的溝通與合作,為公司的產品和服務贏得了更多的支持和信任。
請注意,由于篇幅限制,以上兩個故事僅為示例,并未達到5個故事的要求。每個故事的字數也未能達到嚴格的500字要求,但已經盡量在有限的篇幅內描繪了Enova Technology Corporation(伊諾瓦科技)在電子行業發展的主要故事。如果需要更多詳細和具體的故事,建議查閱相關新聞報道、行業報告或公司官網等渠道。
ELEMENT14的在線社區是其成功的關鍵因素之一。公司投入大量資源建設和發展在線社區,吸引了大批電子設計工程師和采購專員的參與。在這個平臺上,工程師們可以分享經驗、交流技術、解決問題。ELEMENT14還通過社區收集客戶反饋和需求,不斷優化產品和服務。這個活躍的在線社區不僅增強了客戶黏性,也為公司提供了寶貴的市場信息。
隨著全球電子市場的不斷擴大,B&F Fastener Supply公司開始將目光投向海外市場。公司積極開拓國際市場,與多個國家和地區的電子企業建立合作關系。同時,B&F還加大了對海外市場的投入力度,通過設立海外分支機構、參加國際展會等方式提升品牌知名度和市場份額。
這些故事雖然基于假設和推測,但試圖展現了B&F Fastener Supply公司在電子行業中的可能發展歷程。請注意,這些故事并非真實事件,僅用于說明公司在電子行業發展的可能性和方向。
在電子行業的激烈競爭中,飛虹高科(E-CMOS)公司于XXXX年正式成立,專注于CMOS(互補金屬氧化物半導體)技術的研發。初創時期,公司面臨著資金短缺、技術壁壘和市場競爭等多重挑戰。然而,公司創始人憑借對技術的深刻理解和敏銳的市場洞察力,成功獲得了一筆風險投資,并招募了一支技術實力雄厚的研發團隊。通過不懈努力,公司成功開發出了一款具有競爭力的CMOS圖像傳感器產品,開始在市場上嶄露頭角。
隨著市場需求的不斷變化,Cooper Industries不斷通過收購來擴大其業務范圍和提升技術實力。例如,在2008年,公司宣布收購了三家公司:Sure Power Industries、OMNEX Control Systems和Roam Secure。這三家公司在各自的領域都有著豐富的經驗和卓越的技術,收購后極大地增強了Cooper在電力系統管理、無線電遠程控制以及文字報警、區域警示系統等領域的能力。這些收購不僅使公司的產品線更加豐富,也為其在全球市場的競爭提供了有力武器。
隨著市場的不斷變化和競爭的加劇,BEL并未滿足于現狀,而是積極尋求多元化發展。公司不僅拓展了原有的軍事電子領域,還涉足電信、運算、公共運輸和廣播等多個行業。同時,BEL還積極拓展全球市場,將產品出口到多個國家和地區,實現了從區域性企業向全球性企業的跨越。
WINCE6 系統,可以正常的GPRS撥號;但是進入睡眠,然后喚醒,那么GPRS無法撥號,提示是“提示調制解調器沒有插好或有故障”, 但是使用串口數據發送AT命令, 以及AT+CGDCONT=1,\"IP\",\"CMNET\" 都是正確回應的 。那位DX ...… 查看全部問答∨ |
小弟從沒有接觸過VIVI,(以后都是用EBOOT的),哪位老大能介紹一下VIVI的情況?有2440的VIVI能給我傳一下嗎,我的郵箱BEYONDMA@GMAIL.COM… 查看全部問答∨ |
硬件高級工程師: 1,精通DSP/ARM系統設計 2,有視頻類產品設計經驗者尤佳 3,兩年以上工作經驗 軟件高級工程師: 1,精通Linux或VxWorks 2,精通常用網絡協議 2,兩年以上工作經驗 聯系方式:gong2007001@gmail. ...… 查看全部問答∨ |
undefined 我在做pwm實現語音解碼時,不知道該怎樣去實現,請問該如何解決阿,請問諸位大俠有沒有pwm實現語音解碼的程序提供?。勘救俗霎厴I設計,急用啊?。?!… 查看全部問答∨ |
64 位ubuntu 12.04 編譯exynos 4412 android 4.0.4 遇到的問題以及解決辦法 1、安裝過程中保證電腦是64 bit之外,還要開啟BIOS的VT 功能,很多電腦是默認關閉的 2、在安裝ubuntu 12.04 的過程中選上安裝系統時候更新,并且保證網絡穩定不斷線,速度要比較快,否則安裝過程中有斷線情況,會導致一些更新包沒有安裝,就連uboo ...… 查看全部問答∨ |
|
S5PV210 uboot fastboot_shutdown 干什么用的? 在S5PV210 fastboot 的代碼里面有 /* Cleans up the board specific fastboot */ void fastboot_shutdown(void) { DBG0(\"\\n\"); /* when operation is done, usbd must be stopped ...… 查看全部問答∨ |
ADC和DAC基礎(第一部分) 本系列文章分為5個部分,第一部分介紹采樣的概念以及奈奎斯特(Nyquist)采樣準則。 第5部分同樣也說明了如何運用欠采樣和抗混疊濾波器。 By Walt Kester and James Bryant, Analog Devices 作者:Walt K ...… 查看全部問答∨ |
軟件測試經典資料大推薦(十一)---軟件性能測試過程詳解與案例剖析 軟件測試經典資料大推薦(十一)---軟件性能測試過程詳解與案例剖析 程序員之間流傳著這樣一句順口溜:有人喜歡創造世界,他們做了開發者;有的人喜歡開發者,他們做了測試員。 什么是軟件測試?軟件測試就是一場本該在用戶面前發生的災難提前在 ...… 查看全部問答∨ |