1.STM32F10xx低功耗模式
- 睡眠模式:Cortex?-M3內核停止,所有外設包括Cortex-M3核心的外設,如NVIC、系統(tǒng)時鐘(SysTick)等仍在運行
- 停止模式:所有的時鐘都已停止
- 待機模式:1.8V電源關閉
2.STM32F10X停止模式的配置
停止模式是在Cortex?-M3的深睡眠模式基礎上結合了外設的時鐘控制機制,在停止模式下電壓調節(jié)器可運行在正常或低功耗模式。此時在1.8V供電區(qū)域的的所有時鐘都被停止, PLL、 HSI和HSE RC振蕩器的功能被禁止, SRAM和寄存器內容被保留下來。
進入停止模式:
在停止模式下,通過設置電源控制寄存器(PWR_CR)的LPDS位使內部調節(jié)器進入低功耗模式,能夠降低更多的功耗。
如果正在進行閃存編程,直到對內存訪問完成,系統(tǒng)才進入停止模式。
如果正在進行對APB的訪問,直到對APB訪問完成,系統(tǒng)才進入停止模式。
在配置停止模式時,以下功能能需要獨立進行編程:
獨立看門狗(IWDG)一旦啟動除非系統(tǒng)復位,它不能再被停止;
實時時鐘(RTC)需要單獨通過備份欲寄存器(RCC_DBCR)的RTCEN來設置;
內部RC振蕩器(LSI RC):通過控制/狀態(tài)寄存器 (RCC_CSR)的LSION位來設置。
外部32.768kHz振蕩器(LSE):通過備份域控制寄存器 (RCC_BDCR)的LSEON位設置。
在停止模式下,如果在進入該模式前ADC和DAC沒有被關閉,那么這些外設仍然消耗電流。通過設置寄存器ADC_CR2的ADON位和寄存器DAC_CR的ENx位為0可關閉這2個外設。
配置步驟
1、設置Cortex-M3系統(tǒng)控制寄存器中的SLEEPDEEP位(SCB_SCR參考Cortex-M3權威指南182頁)。
2、 清除電源控制寄存器(PWR_CR)中的PDDS位。
3、通過設置PWR_CR中LPDS位選擇電壓調節(jié)器的模式
4、執(zhí)行WFI或者WFE匯編指令
注:為了進入停止模式,所有的外部中斷的請求位(掛起寄存器(EXTI_PR))和RTC的鬧鐘標志都必須被清除,否則停止模式的進入流程將會被跳過,程序繼續(xù)運行。
//THUMB指令不支持匯編內聯(lián)
//采用如下方法實現(xiàn)執(zhí)行匯編指令WFI,等待下一個外部中斷觸發(fā)
void WFI_SET(void)
{
__ASM volatile("wfi");
}
/******************進入停止模式*********************/
void SYS_StopMode(void)
{
SCB->SCR|=1<<2;//使能SLEEPDEEP位 Cortex-M3權威指南182頁
RCC->APB1ENR|=1<<28; //使能電源時鐘
PWR->CR&=~(1<<1);//進入停機模式
PWR->CR|=1<<0;//在停機模式下電壓調壓器處于低功耗模式
WFI_SET();
}
退出停止模式
當一個中斷或喚醒事件導致退出停止模式時, HSI RC振蕩器被選為系統(tǒng)時鐘。
當電壓調節(jié)器處于低功耗模式下,當系統(tǒng)從停止模式退出時,將會有一段額外的啟動延時。如果在停止模式期間保持內部調節(jié)器開啟,則退出啟動時間會縮短,但相應的功耗會增加。
配置步驟
1、如果執(zhí)行WFI進入停止模式:設置任一外部中斷線為中斷模式(在NVIC中必須使能相應的外部中斷向量)。
2、如果執(zhí)行WFE進入停止模式:設置任一外部中斷線為事件模式。
這里以WFI模式為例,通過外部中斷線2下降沿觸發(fā)退出停止模式:
從停止模式退出時HSI RC振蕩器將作為系統(tǒng)時鐘。為了保證從停止模式退出后各項功能可以正常使用我們需要重新配置系統(tǒng)時鐘。
/*系統(tǒng)時鐘配置*/
void STM32_Clock_Init(u8 PLL)
{
u8 temp;
RCC->CR|=1<<16;//開啟HSE時鐘
while(!(RCC->CR>>17));//等待外部時鐘就緒
RCC->CFGR|=0x4<<8;//APB1時鐘由系統(tǒng)時鐘2分頻
PLL-=2;//實際倍頻數(shù)和填入?yún)?shù)差2,9倍頻寫入的數(shù)值為7
RCC->CFGR|=PLL<<18;//PLL時鐘9倍頻
RCC->CFGR|=1<<16; //HSE作為PLL時鐘輸入源
FLASH->ACR|=0x32; //FLASH 2個延時周期
RCC->CR|=1<<24;//PLL時鐘使能
while(!(RCC->CR>>25));//等待PLL鎖定
RCC->CFGR|=0x2<<0;//PLL輸出作為系統(tǒng)時鐘
while(1)
{
temp=(RCC->CFGR>>2)&0x3;
if(temp==0x2)break;
}
}
/********************退出停止模式***********************/
void SYS_ExitStopMode(void)
{
RCC->APB2ENR|=1<<0;//AFIO
/*PA5配置外部中斷模式*/
AFIO->EXTICR[0]|=(0X4<<2*4);//PE2作為外部中斷5輸入源
EXTI->IMR|=1<<2;//開啟EXTI2中斷請求
EXTI->FTSR|=1<<2;//允許EXTI2下降沿觸發(fā)
STM32_NVIC_SetPriority(EXTI2_IRQn,1,1);//設置優(yōu)先級
}
void EXTI2_IRQHandler(void)
{
STM32_Clock_Init(9);//時鐘配置,從停止模式喚醒時默認選擇的為HSI作為系統(tǒng)時鐘源
printf("退出停止模式rn");
EXTI->PR|=1<<2;//清除標志
}
主函數(shù)實現(xiàn)
通過按鍵進入停止模式,外部中斷2下降沿觸發(fā)退出停止模式。
int main()
{
u16 cnt=0;
u8 key=0;
Beep_Init();
Led_Init();
Key_Init();
SYS_ExitStopMode();
Usartx_Init(USART1,115200,72);
TIMx_Init(TIM2,72,20*1000);
printf("USART1初始化完成rn");
while(1)
{
Delay_Ms(1);
cnt++;
if(cnt>=500)
{
cnt=0;
LED1=!LED1;
}
key=Key_Scan();
if(key==1)
{
printf("進入停止模式rn");
LED1=1;
SYS_StopMode();
}
if(usart1_flag)
{
usart1_rx_buff[usart1_cnt]='?';
printf("USART1:%srn",usart1_rx_buff);
usart1_flag=0;
usart1_cnt=0;
}
}
}
-
STM32
+關注
關注
2266文章
10873瀏覽量
354844 -
STM32F10x
+關注
關注
1文章
81瀏覽量
20658
發(fā)布評論請先 登錄
相關推薦
評論