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

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

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

MM32L013x——LPTIM的應(yīng)用介紹

靈動MM32MCU ? 來源:靈動MM32MCU ? 作者:靈動MM32MCU ? 2022-11-10 17:16 ? 次閱讀

低功耗技術(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

47936d42-60d5-11ed-8abf-dac502259ad0.png

可以選擇不同邊沿的脈沖極性用作觸發(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ù)模塊以及比較匹配輸出單元等。

47aa07c8-60d5-11ed-8abf-dac502259ad0.png

涉及到時(shí)鐘選擇的部分需要設(shè)置RCC_CFGR2[30:29],在 UM 手冊中時(shí)鐘配置寄存器2(RCC_CFGR2):

47cd569c-60d5-11ed-8abf-dac502259ad0.png

使能LPTIM時(shí)鐘需要設(shè)置RCC_APB2ENR[31]位:

488ec160-60d5-11ed-8abf-dac502259ad0.png

涉及到 LPTIM1_TRIGGER 和 LPTIM1_OUT 引腳的功能定義情況在 DS 手冊中引腳復(fù)用及復(fù)用列表:

48aa6d70-60d5-11ed-8abf-dac502259ad0.png

5LPTIM 寄存器表

由于 MM32L013x 系列產(chǎn)品中只有一個(gè) LPTIM 模塊,所以在文檔和程序中也習(xí)慣稱作 LPTIM1,它的基地址為 0x40012800,所有寄存器設(shè)計(jì)為 16 位,預(yù)留出 16位保持 32 位對齊,寄存器占用情況如下:

49057170-60d5-11ed-8abf-dac502259ad0.png

其中 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))。

492db978-60d5-11ed-8abf-dac502259ad0.png

審核編輯:湯梓紅

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

收藏 人收藏

    評論

    相關(guān)推薦

    MM32F013x上實(shí)現(xiàn)UART單線半雙工的功能應(yīng)用

    本文將介紹MM32F013x上實(shí)現(xiàn)UART單線半雙工的功能應(yīng)用。
    發(fā)表于 01-22 07:42

    MM32F013x上實(shí)現(xiàn)UART單線半雙工的功能應(yīng)用

    本文將介紹MM32F013x上實(shí)現(xiàn)UART單線半雙工的功能應(yīng)用。
    的頭像 發(fā)表于 02-21 10:49 ?3519次閱讀

    MM32F013x上實(shí)現(xiàn)UART極性取反的功能應(yīng)用

    本文是針對在MM32F013x上實(shí)現(xiàn)UART極性取反的功能應(yīng)用。
    的頭像 發(fā)表于 02-21 10:38 ?2429次閱讀
    在<b class='flag-5'>MM32F013x</b>上實(shí)現(xiàn)UART極性取反的功能應(yīng)用

    MM32F013x——UART 極性取反通信

    本文是針對在MM32F013x上實(shí)現(xiàn)UART極性取反的功能應(yīng)用。
    發(fā)表于 01-29 09:41 ?17次下載
    <b class='flag-5'>MM32F013x</b>——UART 極性取反通信

    MM32F013x——UART 單線半雙工通信

    本文將介紹MM32F013x上實(shí)現(xiàn)UART單線半雙工的功能應(yīng)用。
    發(fā)表于 03-10 06:06 ?36次下載
    <b class='flag-5'>MM32F013x</b>——UART 單線半雙工通信

    基于ARM Cortex M0的微控制器MM32F013x

    基于ARM Cortex M0的微控制器MM32F013x
    發(fā)表于 08-26 09:55 ?22次下載

    MM32F013x——移植EasyLogger組件

    在上篇文章中我們介紹了EasyFlash組件三大功能中的ENV功能及使用,本篇通過移植開源的EasyLogger組件結(jié)合EasyFlash,使用MM32F013x內(nèi)置...
    發(fā)表于 01-25 19:02 ?5次下載
    <b class='flag-5'>MM32F013x</b>——移植EasyLogger組件

    MM32F013x——ADC任意通道工作模式

    在MCU的應(yīng)用場景中,處處都有用到ADC,比如電池電量的采集、溫度采集、電機(jī)應(yīng)用中電流檢測等等。MM32F013x的ADC模塊新增了任意通道工作...
    發(fā)表于 01-25 19:35 ?6次下載
    <b class='flag-5'>MM32F013x</b>——ADC任意通道工作模式

    MM32F013x——UART 單線半雙工通信

    在上一章中和大家分享過MM32F013x上實(shí)現(xiàn)UART極性取反的功能應(yīng)用,本文再來介紹一下MM32F013x上實(shí)現(xiàn)UART單線半雙工的功能應(yīng)用。
    發(fā)表于 01-25 19:53 ?23次下載
    <b class='flag-5'>MM32F013x</b>——UART 單線半雙工通信

    MM32F013x——UART 極性取反通信

    在上一次的文章中和大家分享過UART多處理器通信,本文是針對在MM32F013x上實(shí)現(xiàn)UART極性取反的功能應(yīng)用。在嵌入式領(lǐng)域,通常默認(rèn)串口的電...
    發(fā)表于 01-25 19:53 ?2次下載
    <b class='flag-5'>MM32F013x</b>——UART 極性取反通信

    MM32F013x——UART 多處理器通信

    在上一次的靈動微課堂中和大家分享過MM32F013x-UART 9bit通信實(shí)例,本次微課堂在此實(shí)例的基礎(chǔ)上實(shí)現(xiàn)UART多處理器通信。MM32F013x系列MCU...
    發(fā)表于 01-25 19:55 ?4次下載
    <b class='flag-5'>MM32F013x</b>——UART 多處理器通信

    MM32F013x——移植EasyLogger組件

    本篇通過移植開源的EasyLogger組件結(jié)合EasyFlash,使用MM32F013x內(nèi)置空閑的FLASH存儲空間來實(shí)現(xiàn)LOG日志的存儲記錄,使用芯片自帶的RTC功能使日志在存儲的時(shí)候帶有日期和時(shí)間信息。
    發(fā)表于 02-08 16:28 ?0次下載
    <b class='flag-5'>MM32F013x</b>——移植EasyLogger組件

    MM32F013x——RTC鬧鐘定時(shí)喚醒

    本文將重點(diǎn)介紹如何在MM32F013x上通過內(nèi)部RTC模塊的鬧鐘事件來喚醒處于停機(jī)模式下的MCU。
    發(fā)表于 02-08 17:02 ?17次下載
    <b class='flag-5'>MM32F013x</b>——RTC鬧鐘定時(shí)喚醒

    MM32F013x——ADC任意通道工作模式

    在MCU的應(yīng)用場景中,處處都有用到ADC,比如電池電量的采集、溫度采集、電機(jī)應(yīng)用中電流檢測等等。MM32F013x的ADC模塊新增了任意通道工作模式,支持在多種應(yīng)用場景中更靈活的應(yīng)用;本文針對任意通道工作模式,分享在MM32F013x上實(shí)現(xiàn)任意通道工作模式的使用與具體配置
    發(fā)表于 02-08 17:09 ?10次下載
    <b class='flag-5'>MM32F013x</b>——ADC任意通道工作模式

    使用MM32F0270 LPTIM從STOP模式喚醒

    使用MM32F0270 LPTIM從STOP模式喚醒
    的頭像 發(fā)表于 10-26 16:46 ?824次閱讀
    使用<b class='flag-5'>MM</b>32F0270 <b class='flag-5'>LPTIM</b>從STOP模式喚醒