許多的工業與消費類應用中,越來越多的需要使用低功耗功能,使用定時喚醒,停機減低功耗。靈動微電子推出的MM32F0270系列,支持多種靈活的低功耗模式,還支持LPTIM和LPUART的外設。
本文介紹了如何使用 MM32F0270的LPTIM來實現定時1s從STOP方式的低功耗模式中喚醒。實現使用LPTIM1,在低功耗stop模式下定時1s,1s后將MM32F0270從stop模式喚醒,并且點亮LED燈。
01、MM32F0270 LPTIM的簡要介紹
LPTIM即低功耗定時器,得益于其定時器的低功耗。由于 LPTIM 的時鐘源具有多樣性,因此 LPTIM 能夠在所有電源模式(待機模式除外)下保持運行狀態。
即使沒有內部時鐘源, LPTIM 也能運行,可將其用作“脈沖計數器”,這種脈沖計數器在一些特定的應用中十分有用。
LPTIM 可以支持MCU從低功耗STOP模式喚醒,非常適合實現“超時功能”,而且功耗極低。
LPTIM是低功耗產品在低功耗功耗模式下定時的最佳選擇。
圖1 LPTIM的功能框圖
02、LPTIM 的功能特性
2.1 MM32的LPTIM具有以下特性:
16 位遞增計數器
3-bit 異步時鐘預分頻器,對應的分頻系數分別為 1、2、4、8、16、32、64、128
時鐘源可選:
內部時鐘源:LSI_CLK 和 PCLK
外部時鐘源:LSE_CLK
16-bit 比較寄存器和目標值寄存器
觸發源可選:硬件觸發、軟件觸發
輸入極性可選
外部脈沖計數(無時鐘時)
低功耗超時喚醒功能
PWM 輸出
2.2 MM32F0270 LPTIM中斷
LPTIM 的中斷包括:外部觸發中斷,比較匹配中斷, 計數器溢出中斷, 當相應的中斷使能位打開,發生相應的事件時,產生相應的中斷。
需要使用喚醒時,需要使能相應的中斷外,還需配置EXTI使能相關的功能。
相關的寄存器與控制狀態位的控制與查詢,可以參考用戶手冊。
03、LPTIM 從STOP模式喚醒的軟硬件設計
LPTIM是如何控制配置實現定時1s喚醒STOP 模式的呢?
3.1 在庫函數版本的樣例中可以通過如下順序初始化LPTIM
a. 使能LPTIM外設時鐘;
RCC_APB2PeriphClockCmd(RCC_APB2ENR_LPTIM1, ENABLE);
b. 配置LPTIM的LPTIM_TimeBaseInit_TypeDef結構體中指定的參數;
選擇時鐘源為LSE 32.768KHz;
選擇計數模式為連續計數模式;
時鐘分頻為DIV1;
LPTIM_TimeBaseStructInit( init_struct); //Setting LPTIM base init_struct.ClockSource = LPTIM_LSE_Source;//LPTIM_PCLK_Source;//LPTIM_LSI_Source;// init_struct.CountMode = LPTIM_CONTINUOUS_COUNT_Mode; init_struct.OutputMode = LPTIM_NORMAL_WAV_Mode; init_struct.Waveform = LPTIM_AdjustPwmOutput_Mode; init_struct.Polarity = LPTIM_Positive_Wave; init_struct.ClockDivision = LPTIM_CLK_DIV1;
c. 開啟LSE 32.768KHz的時鐘,等待穩定;
if(init_struct.ClockSource == LPTIM_LSE_Source) { RCC_APB1PeriphClockCmd(RCC_APB1ENR_PWR | RCC_APB1ENR_BKP, ENABLE); //RCC->BDCR |= 1 << 24; PWR_BackupAccessCmd(ENABLE); RCC_LSEConfig(RCC_LSE_ON); DelayNop_Ms(1000); while(!RCC_GetFlagStatus(RCC_FLAG_LSERDY)); LPTIM_CLKConfig(LPTIM1, LPTIM_LSE_Source); }
d. 調用函數LPTIM_TimeBaseInit設置參數及比較器值與目標值;
LPTIM_TimeBaseInit(LPTIM1, init_struct); LPTIM_SetCompare(LPTIM1, arr / 2 - 1); LPTIM_SetTarget(LPTIM1, arr);
在這設定結合時鐘源時鐘,分頻系數與Target值,得到定時1s的定時值。
e. 設定NVIC 參數與EXTI參數;
void NVIC_Configuration(void) { NVIC_InitTypeDef NVIC_InitStructure; EXTI_InitTypeDef EXTI_InitStructure; EXTI_DeInit(); //set EXTI as WFI EXTI_InitStructure.EXTI_Line = EXTI_Line23 ; EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt ; EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising_Falling; EXTI_InitStructure.EXTI_LineCmd = ENABLE; EXTI_Init( EXTI_InitStructure); EXTI_ClearITPendingBit(EXTI_Line23); NVIC_InitStructure.NVIC_IRQChannel = LPTIMER1_IRQn; NVIC_InitStructure.NVIC_IRQChannelPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init( NVIC_InitStructure); }
f. 中斷相應處理函數
void LPTIMER1_IRQHandler(void) { if(LPTIM_GetITStatus(LPTIM1, LPTIF_OVIF)) { LPTIM_ClearITPendingBit(LPTIM1, LPTIF_COMPIF | LPTIF_TRIGIF | LPTIF_OVIF); EXTI_ClearITPendingBit(EXTI_Line23); LPTIM_ITConfig(LPTIM1, LPTIE_COMPIE | LPTIE_TRIGIE | LPTIE_OVIE, DISABLE); } }
3.2 實現Demo功能的主要函數代碼:
void MCU_EnterSTOP_WFI(void) { PWR_EnterSTOPMode(PWR_Regulator_ON, PWR_STOPEntry_WFI); } void LPTIM_Function_Demo(void) { int i; DelayNop_Init(); LPTIM1_Init(32768 - 1); NVIC_Configuration(); LED1_OFF(); LED1_TOGGLE(); LED1_TOGGLE(); for(i = 0; i < 10; i++) { __NOP();// DelayNop_Ms(2); LED1_TOGGLE(); } LED1_OFF(); LPTIM_ITConfig(LPTIM1, LPTIE_OVIE, ENABLE); for(i = 0; i < 10; i++) { __NOP();// DelayNop_Ms(1); LED2_TOGGLE(); } LED1_OFF(); MCU_EnterSTOP_WFI(); SystemInit(); while (1) { LED3_TOGGLE(); __NOP();// DelayNop_Ms(4); } }
配置好初始化LPTIM與LED閃燈的初始化操作后,執行翻轉5次LED燈的操作;
進入STOP 模式。
延時1S后,定時從STOP模式喚醒。
喚醒后繼續執行LED閃燈程序。
通過上述的步驟,簡單的演示了MM32F0270的LPTIM 定時1s喚醒的功能。
下載MM32F0270 lib_Samples,工程路徑如下:
~ MM32F0270_SamplesLibSamplesLPTIM
來源:靈動MM32MCU
免責聲明:本文為轉載文章,轉載此文目的在于傳遞更多信息,版權歸原作者所有。本文所用視頻、圖片、文字如涉及作品版權問題,請聯系小編進行處理
審核編輯 黃宇
-
led
+關注
關注
240文章
23134瀏覽量
658410 -
mcu
+關注
關注
146文章
16984瀏覽量
350294 -
STOP模式
+關注
關注
0文章
9瀏覽量
3064
發布評論請先 登錄
相關推薦
評論