0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

STM32F10x低功耗之待機(jī)模式詳解

嵌入式技術(shù) ? 來(lái)源:嵌入式技術(shù) ? 作者:嵌入式技術(shù) ? 2022-06-08 09:16 ? 次閱讀

1.待機(jī)模式介紹

STM32F10x待機(jī)模式可實(shí)現(xiàn)系統(tǒng)的最低功耗。該模式是在Cortex-M3深睡眠模式時(shí)關(guān)閉電壓調(diào)節(jié)器。整個(gè)1.8V供電區(qū)域被斷電。 PLL、HSI和HSE振蕩器也被斷電。 SRAM寄存器內(nèi)容丟失。只有備份的寄存器和待機(jī)電路維持供電。
在待機(jī)模式下,下列功能需要單獨(dú)設(shè)置:

1.獨(dú)立看門(mén)狗(IWDG):獨(dú)立看門(mén)狗一旦啟動(dòng),除了系統(tǒng)復(fù)位,它不能再被停止。可通過(guò)看門(mén)狗的鍵寄存器或硬件選擇來(lái)啟動(dòng)IWDG。
2.實(shí)時(shí)時(shí)鐘(RTC):可通過(guò)區(qū)域控制寄存器(RCC_BDCR)中的RTCEN位來(lái)設(shè)置。
3.內(nèi)部RC振蕩器(LSI RC):通過(guò)控制/狀態(tài)寄存器(RCC_CSR)的LSION位來(lái)設(shè)置。
4.外部低速時(shí)鐘LSE(32.768KHZ):通過(guò)備份域寄存器(RCC_BDCR)的LSEON位設(shè)置。

2.待機(jī)模式配置

退出待機(jī)模式
通過(guò)以下方式可退出待機(jī)模式:

  • 外部引腳復(fù)位引腳(NRST引腳)
  • 看門(mén)狗復(fù)位(IWDG)
  • WKUP引腳的上升沿觸發(fā)(PA0)
  • RTC鬧鐘事件的上升沿觸發(fā)

從待機(jī)模式喚醒后,除了電源控制/狀態(tài)寄存器(PWR_CSR),所有寄存器被復(fù)位;從待機(jī)模式喚醒的代碼等同于復(fù)位重啟。
進(jìn)入待機(jī)模式配置步驟
1、設(shè)置Cortex?-M3系統(tǒng)控制寄存器中的SLEEPDEEP位(SCB_SCR參考Cortex-M3權(quán)威指南182頁(yè))。
2、開(kāi)啟PWR時(shí)鐘(RCC_APB1的PWR位)
3、設(shè)置電源控制寄存器(PWR_CR)的PDDS位
4、清除電源控制/狀態(tài)寄存器(PWR_CSR)中的WUF位
5、等待中斷觸發(fā)喚醒(WFI等待中斷或者WFE等待事件)

/************進(jìn)入待機(jī)模式配置***************************
**
**注:使用待機(jī)模式若通過(guò)KEY_UP觸發(fā)這需要PWR_CSR的EWUP位
**
*******************************************************/
void SYS_standby_mode(void)
{
	SCB->SCR|=1<<2;//使能SLEEPDEEP位 Cortex-M3權(quán)威指南182頁(yè)	
	RCC->APB1ENR|=1<<28; //使能電源時(shí)鐘
	PWR->CSR|=1<<8;//設(shè)置WKUP喚醒(使用PA0喚醒需要配置)
	PWR->CR|=1<<1;//進(jìn)入待機(jī)模式
	PWR->CR|=1<<2;//清除WUF喚醒位
	WFI_SET();//等待中斷觸發(fā)喚醒
}

WFI等待中斷函數(shù)

//THUMB指令不支持匯編內(nèi)聯(lián)
//采用如下方法實(shí)現(xiàn)執(zhí)行匯編指令WFI,等待下一個(gè)外部中斷觸發(fā)
void WFI_SET(void)
{
	__ASM volatile("wfi");		  
}

待機(jī)模式喚醒設(shè)置

待機(jī)模式喚醒通過(guò)檢測(cè)PA0引腳的上升沿信號(hào)。

/*************待機(jī)模式喚醒設(shè)置*********************
**喚醒方式:WKUP(PA0)上升沿
**				 RTC鬧鐘事件的上升沿
**				 NRST引腳上外部復(fù)位
**				 IWDG復(fù)位
**配置PA0上升沿觸發(fā)中斷
**通過(guò)檢查PA0,按下3S退出待機(jī)模式,未按下進(jìn)入待機(jī)模式
****************************************************/
void SYS_ExitStandyMode(void)
{
	RCC->APB2ENR|=1<<2;//開(kāi)啟PA時(shí)鐘
	GPIOA->CRL&=0xFFFFFFF0;//清除原來(lái)寄存器中的值
	GPIOA->CRL|=0x00000008;//配置為上下拉輸入方式
	RCC->APB2ENR|=1<<0;//AFIO
	AFIO->EXTICR[0]&=~(0xf<<0*4);//PA0作為外部中斷0輸入源	
	EXTI->IMR|=1<<0;//開(kāi)啟EXTI0中斷請(qǐng)求
	EXTI->RTSR|=1<<0;//允許EXTI0上升沿觸發(fā)
	STM32_NVIC_SetPriority(EXTI0_IRQn,1,1);//設(shè)置優(yōu)先級(jí)	
	if(WKUP_Check()==0)SYS_standby_mode();	
}

WKUP按鍵檢測(cè)函數(shù)
判斷PA0引腳是否連續(xù)按下2S,連續(xù)按下2s則進(jìn)入或退出待機(jī)模式。

/****************檢測(cè)WKUP按鍵****************/
u8 WKUP_Check(void)
{
	u16 t=0;
	LED2=0;
	while(1)
	{
		if(KEY1)//檢測(cè)是否按下
		{
			t++;
			Delay_Ms(10);
			if(t>=200)
			{
				LED2=1;
				return 1;
			}
		}
		else 
		{
			LED2=1;
			return 0;
		}
	}
}

主函數(shù)實(shí)現(xiàn)
1.系統(tǒng)初始化后直接進(jìn)入待機(jī)模式
2.初始化通過(guò)RTC配置鬧鐘中斷30s后喚醒
3.通過(guò)檢測(cè)WKUP按鍵(PA0)持續(xù)按下3S后退出待機(jī)模式
4.在正常模式下可通過(guò)WKUP按鍵(PA0)持續(xù)按下3S進(jìn)入待機(jī)模式或者通過(guò)按下KEY2進(jìn)入待機(jī)模式

int main()
{
	u16 cnt=0;
	u8 key=0;
	Beep_Init();
	Led_Init();
	Key_Init();
	Usartx_Init(USART1,115200,72);
	TIMx_Init(TIM2,72,20*1000);
	printf("初始化完成\r\n");
	RTC_Init();//RTC配置
	Delay_Ms(1000);
	Delay_Ms(1000);
	SYS_ExitStandyMode();//待機(jī)模式設(shè)置
	while(1)
	{
		Delay_Ms(1);
		cnt++;
		if(cnt>=500)
		{
			cnt=0;
			LED1=!LED1;
		}
		key=Key_Scan();
		if(key==2)
		{
			SYS_standby_mode();//按鍵2按下進(jìn)待機(jī)模式
		}
		if(usart1_flag)
		{
			usart1_rx_buff[usart1_cnt]='\0';
			printf("USART1:%s\r\n",usart1_rx_buff);
			usart1_flag=0;
			usart1_cnt=0;
		}
	}
}

鬧鐘中斷觸發(fā)喚醒,或者按鍵觸發(fā)喚醒

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDQ1MzY5NA==,size_16,color_FFFFFF,t_70

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • STM32
    +關(guān)注

    關(guān)注

    2264

    文章

    10854

    瀏覽量

    354300
  • STM32F10x
    +關(guān)注

    關(guān)注

    1

    文章

    81

    瀏覽量

    20651
  • 低功耗
    +關(guān)注

    關(guān)注

    10

    文章

    2352

    瀏覽量

    103541
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    APM32F10xx進(jìn)入低功耗模式的問(wèn)題分析

    近日,在學(xué)習(xí)APM32開(kāi)發(fā)板關(guān)于PMU模塊的內(nèi)容,看到很多內(nèi)容都是調(diào)用WFI內(nèi)核指令進(jìn)入低功耗模式,于是自己想嘗試調(diào)用WFE內(nèi)核指令進(jìn)入低功耗模式,但在APM32
    的頭像 發(fā)表于 10-18 16:13 ?184次閱讀
    APM32<b class='flag-5'>F10</b>xx進(jìn)入<b class='flag-5'>低功耗</b><b class='flag-5'>模式</b>的問(wèn)題分析

    【GD32 MCU 移植教程】9、從 STM32F10x 系列移植到 GD32F30x 系列

    GD32F30x 系列 MCU 是基于 Arm? Cortex?-M4 處理器的 32 位通用微控制器,與 STM32F10x 系列 MCU 保持高度兼容。本文主要從以下三個(gè)方面進(jìn)行介紹:硬件資源
    的頭像 發(fā)表于 09-07 09:57 ?461次閱讀
    【GD32 MCU 移植教程】9、從 <b class='flag-5'>STM32F10x</b> 系列移植到 GD32<b class='flag-5'>F30x</b> 系列

    GD32F303無(wú)法進(jìn)入低功耗模式的原因?怎么解決?

    希望在原有代碼的基礎(chǔ)上加入PM組件實(shí)現(xiàn)低功耗,目前是直接進(jìn)入待機(jī)模式就可以 但是在測(cè)試的時(shí)候發(fā)現(xiàn),無(wú)法進(jìn)入低功耗模式,現(xiàn)象如下: void
    發(fā)表于 07-09 06:29

    stm32在進(jìn)入最低功耗待機(jī)模式下是否可以保持io的狀態(tài)?

    請(qǐng)教各大佬,ST的各系列在進(jìn)入最低功耗待機(jī)模式下是否可以保持io的狀態(tài)? 如果不行需要配置什么模式使得電流最低達(dá)到uA級(jí)別的,且io的狀態(tài)可以保持,
    發(fā)表于 07-04 06:58

    STM32F10x標(biāo)準(zhǔn)外設(shè)庫(kù)參考手冊(cè)

    STM32F10x標(biāo)準(zhǔn)外設(shè)庫(kù)參考手冊(cè)
    發(fā)表于 06-24 09:26 ?11次下載

    CS32F03X低功耗Deepsleep應(yīng)用配置

    本技術(shù)文檔旨在幫助客戶快速配置 MCU CS32F03x 低功耗模式。 Deepsleep 模式是應(yīng)用較為廣泛的一個(gè)低功耗
    發(fā)表于 05-16 10:35

    STM32 Cortex M3內(nèi)核的3種低功耗模式,睡眠、停機(jī)和待機(jī),在M0內(nèi)核也適用嗎?

    M3內(nèi)核的3種低功耗模式,睡眠、停機(jī)和待機(jī),在M0內(nèi)核也適用嗎
    發(fā)表于 05-16 06:56

    STM32待機(jī)模式適合用于那些應(yīng)用場(chǎng)景?

    對(duì)于查看STM32低功耗模式,共有三種,其中最省電的為待機(jī)模式,但是待機(jī)
    發(fā)表于 05-07 07:46

    STM32低功耗控制一般都是采用哪種模式?

    STM32中,低功耗控制有三種,休眠模式,停機(jī)模式待機(jī)模式,想知道大家都常用哪個(gè)
    發(fā)表于 04-30 08:03

    STM32F407 STOP模式低功耗的電流偏大怎么解決?

    大家好!最近有個(gè)項(xiàng)目用 STM32F407VGT6(100pin , 內(nèi)1MBFLASH)低功耗的電流偏大 , 程序 測(cè)試說(shuō)明如下: 1. STM32F407VGT6 只接了8M的高頻晶振和32K
    發(fā)表于 04-15 07:00

    stm32L4R9ZI在低功耗的停止模式或者待機(jī)模式下,是否支持獨(dú)立看門(mén)狗計(jì)數(shù)凍結(jié)?

    stm32L4R9ZI這款芯片,在低功耗的停止模式或者待機(jī)模式下,是否支持獨(dú)立看門(mén)狗計(jì)數(shù)凍結(jié)?
    發(fā)表于 03-27 06:04

    GD32F303 低功耗模式要點(diǎn)

    我們都知道,MCU有低功耗模式,比如GD32F303芯片,就有Sleep、Deepsleep和Standby三種模式。關(guān)于這三種模式的具體使
    的頭像 發(fā)表于 01-17 09:40 ?2391次閱讀
    GD32<b class='flag-5'>F</b>303 <b class='flag-5'>低功耗</b><b class='flag-5'>模式</b>要點(diǎn)

    stm32f030K4t6 低功耗設(shè)置

    低功耗設(shè)置。 首先,我們需要了解STM32F030K4T6微控制器的低功耗模式。該微控制器具有多種低功耗
    的頭像 發(fā)表于 01-04 10:41 ?1084次閱讀

    在GD32F103移植STM32F103代碼

    使用相同F(xiàn)LASH和管腳數(shù)量相同的芯片,例如GDF103C8T6移植STM32F103C8T6程序。雖然兩個(gè)款芯片的寄存器地址以及架構(gòu)基本相同。但是需要注意的是GD32F10x主頻是108兆,但是STM32F10x主頻是72兆。
    的頭像 發(fā)表于 12-15 13:37 ?1521次閱讀
    在GD32<b class='flag-5'>F</b>103移植<b class='flag-5'>STM32F</b>103代碼

    RT-thread源碼移植到STM32F10xSTM32F4xx

    RT-thread源碼移植到STM32F10xSTM32F4xx: 一、源碼下載 點(diǎn)擊入門(mén)->下載 ? 在歷史版本里邊隨便選取一個(gè) ? 會(huì)進(jìn)入百度云盤(pán)的下載地址,里邊有全部版本的源碼。這里下載
    的頭像 發(fā)表于 11-15 09:38 ?2364次閱讀
    RT-thread源碼移植到<b class='flag-5'>STM32F10x</b>和<b class='flag-5'>STM32F</b>4xx