低功耗技術(shù)旨在減少設(shè)備電流消耗,延長電池壽命,可以有效的延長產(chǎn)品的使用壽命。這就需要合理分配運(yùn)行時(shí)間和空閑時(shí)間,在空閑時(shí)可以通過使MCU進(jìn)入低功耗模式降低系統(tǒng)的功耗,在需要MCU工作時(shí)喚醒MCU,低功耗定時(shí)器(LPTIM)有助于降低功耗,特別是當(dāng)系統(tǒng)處于低功耗模式時(shí)(如 stop模式)可以在休眠模式下實(shí)現(xiàn)外部脈沖計(jì)數(shù)功能。通過外部輸入的觸發(fā)信號,能夠?qū)崿F(xiàn)低功耗超時(shí)喚醒。LPTIM 具有外部時(shí)鐘計(jì)數(shù),超時(shí)喚醒功能和 PWM 輸出等多種用途。
本文主要介紹 MM32 全新低功耗系列 MM32L013x 產(chǎn)品中的 LPTIM 外設(shè)模塊,它允許系統(tǒng)執(zhí)行簡單的任務(wù),同時(shí)功耗保持在絕對最小。
1LPTIM 簡介
LPTIM 由一個(gè) 16 位計(jì)數(shù)器組成,可以為用戶提供便捷的計(jì)數(shù)和定時(shí)功能。LPTIM 運(yùn)行在 CORE 電源域,可以工作在低功耗模式下,具有低功耗的特點(diǎn),當(dāng)然也可以被當(dāng)做一個(gè)普通的 16 位基礎(chǔ)定時(shí)器來使用。
2LPTIM 常見用途
脈沖計(jì)數(shù)功能
PWM 生成器
周期性地超時(shí)喚醒sleep模式、stop模式
以上所有功能應(yīng)用均為普通 TIM 所不能實(shí)現(xiàn)的,正是由于 LPTIM 的時(shí)鐘源具有多樣性,使得其能夠在所有電源模式(standby模式除外)下保持運(yùn)行狀態(tài)。
3LPTIM 主要特性
16 位遞增計(jì)數(shù)器,相當(dāng)于 LPT_CNT 值由模塊時(shí)鐘驅(qū)動加一遞增最大到 65535,并且包括一個(gè) 16 位比較寄存器和目標(biāo)值寄存器
3 位異步時(shí)鐘預(yù)分頻器,可以將輸入進(jìn)模塊的時(shí)鐘進(jìn)行多種系數(shù)的預(yù)分頻,包括:
1/2/4/8/16/32/64/128 分頻
多種內(nèi)部和外部的時(shí)鐘源可選,包括:LSI/LSE/PCLK2
可以選擇不同邊沿的脈沖極性用作觸發(fā)計(jì)數(shù),觸發(fā)源包括:LPTIM1_TRIGGER 引腳輸入觸發(fā)、COMP OUT 事件觸發(fā)
可以設(shè)定不同的 LPT_CMP 和 LPT_TARGET 值從而通過 LPTIM1_OUT 引腳輸出不同占空比的PWM 波形或者方波
可以設(shè)定不同的 LPT_TARGET 值從而進(jìn)行不同時(shí)長的低功耗喚醒
可以開啟不同的中斷,包括:外部觸發(fā)、比較匹配和計(jì)數(shù)器溢出中斷,在喚醒 STOP 模式時(shí),除了需要使能相應(yīng)的中斷外,還需配置 EXTI_Line23 并且使能相關(guān)的功能
4LPTIM 功能框圖
LPTIM 的功能框圖如下,主要包括了:觸發(fā)源選擇模塊、時(shí)鐘輸入及分頻模塊、計(jì)數(shù)模塊以及比較匹配輸出單元等。
涉及到時(shí)鐘選擇的部分需要設(shè)置RCC_CFGR2[30:29],在 UM 手冊中時(shí)鐘配置寄存器2(RCC_CFGR2):
使能LPTIM時(shí)鐘需要設(shè)置RCC_APB2ENR[31]位:
涉及到 LPTIM1_TRIGGER 和 LPTIM1_OUT 引腳的功能定義情況在 DS 手冊中引腳復(fù)用及復(fù)用列表:
5LPTIM 寄存器表
由于 MM32L013x 系列產(chǎn)品中只有一個(gè) LPTIM 模塊,所以在文檔和程序中也習(xí)慣稱作 LPTIM1,它的基地址為 0x40012800,所有寄存器設(shè)計(jì)為 16 位,預(yù)留出 16位保持 32 位對齊,寄存器占用情況如下:
其中 LPT_CFG 、 LPT_IE 、 LPT_CTRL 、LPT_CMP 、 LPT_TARGET 為可讀可寫操作的,LPT_IF 為可讀并且寫 1 清零操作的,LPT_CNT 為只讀操作的,具體功能描述參見 UM 對應(yīng)章節(jié)內(nèi)容。
6LPTIM 功能實(shí)現(xiàn)
6.1 帶溢出中斷的普通定時(shí)器
使能 APB2 總線上的 LPTIM 外設(shè)時(shí)鐘,用于同步
初始化配置 LPT_CFG 寄存器 MODE=0,計(jì)數(shù)器被觸發(fā)后保持運(yùn)行,直到被關(guān)閉為止
初始化配置 LPT_CFG 寄存器 TMODE=00,選擇普通計(jì)數(shù)器模式
選擇外部時(shí)鐘或內(nèi)部時(shí)鐘作為計(jì)數(shù)器的時(shí)鐘源
配置 LPT_IE =1,使能 LPTIM 計(jì)數(shù)器溢出中斷
配置 LPT_CTRL 寄存器 LPTEN=1,使能 LPTIM 計(jì)數(shù)器
計(jì)數(shù)器使能后有兩個(gè)周期的同步過程,同步完成后,計(jì)數(shù)器開始工作,計(jì)數(shù)達(dá)到目標(biāo)之后回到 0 重新開始計(jì)數(shù),并產(chǎn)生溢出中斷
按上述流程的代碼配置如下:
voidLPTIM1_Init(u16arr) { LPTIM_TimeBaseInit_TypeDefinit_struct; RCC_APB2PeriphClockCmd(RCC_APB2ENR_LPTIM1,ENABLE); LPTIM_TimeBaseStructInit(&init_struct); init_struct.ClockSource=LPTIM_PCLK_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; if(init_struct.ClockSource==LPTIM_LSE_Source){ RCC_APB1PeriphClockCmd(RCC_APB1ENR_PWR|RCC_APB1ENR_BKP,ENABLE); PWR_BackupAccessCmd(ENABLE); RCC_LSEConfig(RCC_LSE_ON); DELAY_Ms(5000); while(!RCC_GetFlagStatus(RCC_FLAG_LSERDY)); LPTIM_CLKConfig(LPTIM1,LPTIM_LSE_Source); } elseif(init_struct.ClockSource==LPTIM_LSI_Source){ RCC_APB1PeriphClockCmd(RCC_APB1ENR_PWR|RCC_APB1ENR_BKP,ENABLE); PWR_BackupAccessCmd(ENABLE); RCC_LSICmd(ENABLE); DELAY_Ms(500); while(!RCC_GetFlagStatus(RCC_FLAG_LSIRDY)); LPTIM_CLKConfig(LPTIM1,LPTIM_LSI_Source); } else{//(init_struct.ClockSource==LPTIM_PCLK_Source) LPTIM_CLKConfig(LPTIM1,LPTIM_PCLK_Source); } LPTIM_TimeBaseInit(LPTIM1,&init_struct); LPTIM_SetTarget(LPTIM1,arr); } voidLPTIMER1_IRQHandler(void) { if(LPTIM_GetITStatus(LPTIM1,LPTIF_OVIF)){ LPTIM_ClearITPendingBit(LPTIM1,LPTIF_OVIF); LED3_TOGGLE(); LED4_TOGGLE(); } } voidNVIC_Configuration(void) { NVIC_InitTypeDefNVIC_InitStruct; NVIC_InitStruct.NVIC_IRQChannel=LPTIMER1_IRQn; NVIC_InitStruct.NVIC_IRQChannelPriority=2; NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE; NVIC_Init(&NVIC_InitStruct); } s32main(void) { DELAY_Init(); LED_Init(); LPTIM1_Init(4000-1); NVIC_Configuration(); LPTIM_ITConfig(LPTIM1,LPTIE_OVIE,ENABLE); LPTIM_Cmd(LPTIM1,ENABLE); while(1) { LED1_TOGGLE(); LED2_TOGGLE(); DELAY_Ms(1000); } }
6.2 PWM 輸出
初始化中使用以上相同的步驟,需要額外配置 LPT_CFG 寄存器 PWM=1,選擇 PWM 輸出模式
再配置 LPT_CMP 和 LPT_TARGET 寄存器,設(shè)定比較值和目標(biāo)值,PWM 的占空比由比較值和目標(biāo)值決定,輸出在計(jì)數(shù)器值等于比較值翻轉(zhuǎn)為 1,在等于目標(biāo)值時(shí)翻轉(zhuǎn)為 0
另外需要配置一組 LPTIM1_OUT 引腳用于輸出 PWM 波形,這里以 PB14 為例
代碼配置如下:
voidLPTIM_GPIO_Init(void) { GPIO_InitTypeDefGPIO_InitStruct; RCC_GPIO_ClockCmd(GPIOB,ENABLE); //setPB14asLPTIM1OutputPin GPIO_PinAFConfig(GPIOB,GPIO_PinSource14,GPIO_AF_3); GPIO_InitStruct.GPIO_Pin=GPIO_Pin_14; GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz; GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AF_PP; GPIO_Init(GPIOB,&GPIO_InitStruct); } voidLPTIM1_Init(u16arr) { LPTIM_TimeBaseInit_TypeDefinit_struct; RCC_APB2PeriphClockCmd(RCC_APB2ENR_LPTIM1,ENABLE); LPTIM_TimeBaseStructInit(&init_struct); init_struct.ClockSource=LPTIM_PCLK_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; if(init_struct.ClockSource==LPTIM_LSE_Source){ RCC_APB1PeriphClockCmd(RCC_APB1ENR_PWR|RCC_APB1ENR_BKP,ENABLE); PWR_BackupAccessCmd(ENABLE); RCC_LSEConfig(RCC_LSE_ON); DELAY_Ms(5000); while(!RCC_GetFlagStatus(RCC_FLAG_LSERDY)); LPTIM_CLKConfig(LPTIM1,LPTIM_LSE_Source); } elseif(init_struct.ClockSource==LPTIM_LSI_Source){ RCC_APB1PeriphClockCmd(RCC_APB1ENR_PWR|RCC_APB1ENR_BKP,ENABLE); PWR_BackupAccessCmd(ENABLE); RCC_LSICmd(ENABLE); DELAY_Ms(500); while(!RCC_GetFlagStatus(RCC_FLAG_LSIRDY)); LPTIM_CLKConfig(LPTIM1,LPTIM_LSI_Source); } else{//(init_struct.ClockSource==LPTIM_PCLK_Source) LPTIM_CLKConfig(LPTIM1,LPTIM_PCLK_Source); } LPTIM_TimeBaseInit(LPTIM1,&init_struct); } s32main(void) { DELAY_Init(); LED_Init(); LPTIM1_Init(4000-1); LPTIM_SetCompare(LPTIM1,4000/2-1); LPTIM_SetTarget(LPTIM1,4000); LPTIM_GPIO_Init(); LPTIM_Cmd(LPTIM1,ENABLE); while(1) { LED1_TOGGLE(); LED2_TOGGLE(); DELAY_Ms(1000); } }
6.3 Trigger 脈沖觸發(fā)計(jì)數(shù)
初始化中使用以上相同的步驟,需要修改配置 LPT_CFG 寄存器 TMODE=01,選擇 Trigger 脈沖觸發(fā)計(jì)數(shù)模式
配置 LPT_CFG 寄存器 TRIGSEL = 0,選擇外部引腳觸發(fā)計(jì)數(shù)
配置 LPT_CFG 寄存器 TRIGCFG,選擇外部觸發(fā)信號的有效沿
用戶可以根據(jù)需求選擇是否使能濾波器,配置LPT_CFG 寄存器
根據(jù)需求是否使能外部觸發(fā)中斷位
另外需要配置一組 LPTIM1_TRIGGER 引腳用于觸發(fā)輸入,這里以 PB13 為例
代碼配置如下:
voidLPTIM_GPIO_Init(void) { GPIO_InitTypeDefGPIO_InitStruct; RCC_GPIO_ClockCmd(GPIOB,ENABLE); //setPB13asLPTIM1TriggerPin GPIO_PinAFConfig(GPIOB,GPIO_PinSource13,GPIO_AF_3); GPIO_InitStruct.GPIO_Pin=GPIO_Pin_13; GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz; GPIO_InitStruct.GPIO_Mode=GPIO_Mode_FLOATING; GPIO_Init(GPIOB,&GPIO_InitStruct); } voidLPTIM1_Init(u16arr) { LPTIM_TimeBaseInit_TypeDefinit_struct; RCC_APB2PeriphClockCmd(RCC_APB2ENR_LPTIM1,ENABLE); LPTIM_TimeBaseStructInit(&init_struct); init_struct.ClockSource=LPTIM_PCLK_Source; init_struct.CountMode=LPTIM_CONTINUOUS_COUNT_Mode; init_struct.OutputMode=LPTIM_PULSE_TRIG_Mode; init_struct.Waveform=LPTIM_AdjustPwmOutput_Mode; init_struct.Polarity=LPTIM_Positive_Wave; init_struct.ClockDivision=LPTIM_CLK_DIV1; if(init_struct.ClockSource==LPTIM_LSE_Source){ RCC_APB1PeriphClockCmd(RCC_APB1ENR_PWR|RCC_APB1ENR_BKP,ENABLE); PWR_BackupAccessCmd(ENABLE); RCC_LSEConfig(RCC_LSE_ON); DELAY_Ms(5000); while(!RCC_GetFlagStatus(RCC_FLAG_LSERDY)); LPTIM_CLKConfig(LPTIM1,LPTIM_LSE_Source); } elseif(init_struct.ClockSource==LPTIM_LSI_Source){ RCC_APB1PeriphClockCmd(RCC_APB1ENR_PWR|RCC_APB1ENR_BKP,ENABLE); PWR_BackupAccessCmd(ENABLE); RCC_LSICmd(ENABLE); DELAY_Ms(500); while(!RCC_GetFlagStatus(RCC_FLAG_LSIRDY)); LPTIM_CLKConfig(LPTIM1,LPTIM_LSI_Source); } else{//(init_struct.ClockSource==LPTIM_PCLK_Source) LPTIM_CLKConfig(LPTIM1,LPTIM_PCLK_Source); } LPTIM_TimeBaseInit(LPTIM1,&init_struct); LPTIM1->CFGR=LPTIM_ExInputUpEdge; LPTIM1->CFGR=LPTIM_External_PIN_Trig; }
6.4 1s 周期性喚醒 STOP 模式
詳細(xì)可以參見靈動微課堂 (第196講) | 使用MM32F0270 LPTIM從STOP模式喚醒(點(diǎn)擊跳轉(zhuǎn))。
審核編輯:湯梓紅
-
mcu
+關(guān)注
關(guān)注
146文章
16667瀏覽量
347771 -
計(jì)數(shù)器
+關(guān)注
關(guān)注
32文章
2241瀏覽量
93972 -
MM32
+關(guān)注
關(guān)注
1文章
106瀏覽量
659
原文標(biāo)題:靈動微課堂 (第235講) | MM32L013x——LPTIM的應(yīng)用介紹
文章出處:【微信號:MindMotion-MMCU,微信公眾號:靈動MM32MCU】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論