在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

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)品的使用壽命。這就需要合理分配運行時間和空閑時間,在空閑時可以通過使MCU進(jìn)入低功耗模式降低系統(tǒng)的功耗,在需要MCU工作時喚醒MCU,低功耗定時器(LPTIM)有助于降低功耗,特別是當(dāng)系統(tǒng)處于低功耗模式時(如 stop模式)可以在休眠模式下實現(xiàn)外部脈沖計數(shù)功能。通過外部輸入的觸發(fā)信號,能夠?qū)崿F(xiàn)低功耗超時喚醒。LPTIM 具有外部時鐘計數(shù),超時喚醒功能和 PWM 輸出等多種用途。

本文主要介紹 MM32 全新低功耗系列 MM32L013x 產(chǎn)品中的 LPTIM 外設(shè)模塊,它允許系統(tǒng)執(zhí)行簡單的任務(wù),同時功耗保持在絕對最小。

1LPTIM 簡介

LPTIM 由一個 16 位計數(shù)器組成,可以為用戶提供便捷的計數(shù)和定時功能。LPTIM 運行在 CORE 電源域,可以工作在低功耗模式下,具有低功耗的特點,當(dāng)然也可以被當(dāng)做一個普通的 16 位基礎(chǔ)定時器來使用。

2LPTIM 常見用途

脈沖計數(shù)功能

PWM 生成器

周期性地超時喚醒sleep模式、stop模式

以上所有功能應(yīng)用均為普通 TIM 所不能實現(xiàn)的,正是由于 LPTIM 的時鐘源具有多樣性,使得其能夠在所有電源模式(standby模式除外)下保持運行狀態(tài)。

3LPTIM 主要特性

16 位遞增計數(shù)器,相當(dāng)于 LPT_CNT 值由模塊時鐘驅(qū)動加一遞增最大到 65535,并且包括一個 16 位比較寄存器和目標(biāo)值寄存器

3 位異步時鐘預(yù)分頻器,可以將輸入進(jìn)模塊的時鐘進(jìn)行多種系數(shù)的預(yù)分頻,包括:

1/2/4/8/16/32/64/128 分頻

多種內(nèi)部和外部的時鐘源可選,包括:LSI/LSE/PCLK2

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

可以選擇不同邊沿的脈沖極性用作觸發(fā)計數(shù),觸發(fā)源包括:LPTIM1_TRIGGER 引腳輸入觸發(fā)、COMP OUT 事件觸發(fā)

可以設(shè)定不同的 LPT_CMP 和 LPT_TARGET 值從而通過 LPTIM1_OUT 引腳輸出不同占空比的PWM 波形或者方波

可以設(shè)定不同的 LPT_TARGET 值從而進(jìn)行不同時長的低功耗喚醒

可以開啟不同的中斷,包括:外部觸發(fā)、比較匹配和計數(shù)器溢出中斷,在喚醒 STOP 模式時,除了需要使能相應(yīng)的中斷外,還需配置 EXTI_Line23 并且使能相關(guān)的功能

4LPTIM 功能框圖

LPTIM 的功能框圖如下,主要包括了:觸發(fā)源選擇模塊、時鐘輸入及分頻模塊、計數(shù)模塊以及比較匹配輸出單元等。

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

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

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

使能LPTIM時鐘需要設(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)品中只有一個 LPTIM 模塊,所以在文檔和程序中也習(xí)慣稱作 LPTIM1,它的基地址為 0x40012800,所有寄存器設(shè)計為 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 功能實現(xiàn)

6.1 帶溢出中斷的普通定時器

使能 APB2 總線上的 LPTIM 外設(shè)時鐘,用于同步

初始化配置 LPT_CFG 寄存器 MODE=0,計數(shù)器被觸發(fā)后保持運行,直到被關(guān)閉為止

初始化配置 LPT_CFG 寄存器 TMODE=00,選擇普通計數(shù)器模式

選擇外部時鐘或內(nèi)部時鐘作為計數(shù)器的時鐘源

配置 LPT_IE =1,使能 LPTIM 計數(shù)器溢出中斷

配置 LPT_CTRL 寄存器 LPTEN=1,使能 LPTIM 計數(shù)器

計數(shù)器使能后有兩個周期的同步過程,同步完成后,計數(shù)器開始工作,計數(shù)達(dá)到目標(biāo)之后回到 0 重新開始計數(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)值決定,輸出在計數(shù)器值等于比較值翻轉(zhuǎn)為 1,在等于目標(biāo)值時翻轉(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ā)計數(shù)

初始化中使用以上相同的步驟,需要修改配置 LPT_CFG 寄存器 TMODE=01,選擇 Trigger 脈沖觸發(fā)計數(shù)模式

配置 LPT_CFG 寄存器 TRIGSEL = 0,選擇外部引腳觸發(fā)計數(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模式喚醒(點擊跳轉(zhuǎn))。

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

審核編輯:湯梓紅

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

    關(guān)注

    146

    文章

    17686

    瀏覽量

    357684
  • 計數(shù)器
    +關(guān)注

    關(guān)注

    32

    文章

    2281

    瀏覽量

    95797
  • MM32
    +關(guān)注

    關(guān)注

    1

    文章

    107

    瀏覽量

    957

原文標(biāo)題:靈動微課堂 (第235講) | MM32L013x——LPTIM的應(yīng)用介紹

文章出處:【微信號:MindMotion-MMCU,微信公眾號:靈動MM32MCU】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

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

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

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

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

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

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

    MM32F013x——UART 極性取反通信

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

    MM32F013x——UART 單線半雙工通信

    本文將介紹MM32F013x上實現(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,比如電池電量的采集、溫度采集、電機應(yīng)用中電流檢測等等。MM32F013x的ADC模塊新增了任意通道工作...
    發(fā)表于 01-25 19:35 ?6次下載
    <b class='flag-5'>MM32F013x</b>——ADC任意通道工作模式

    MM32F013x——UART 單線半雙工通信

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

    MM32F013x——UART 極性取反通信

    在上一次的文章中和大家分享過UART多處理器通信,本文是針對在MM32F013x上實現(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通信實例,本次微課堂在此實例的基礎(chǔ)上實現(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存儲空間來實現(xiàn)LOG日志的存儲記錄,使用芯片自帶的RTC功能使日志在存儲的時候帶有日期和時間信息。
    發(fā)表于 02-08 16:28 ?0次下載
    <b class='flag-5'>MM32F013x</b>——移植EasyLogger組件

    MM32F013x——RTC鬧鐘定時喚醒

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

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

    在MCU的應(yīng)用場景中,處處都有用到ADC,比如電池電量的采集、溫度采集、電機應(yīng)用中電流檢測等等。MM32F013x的ADC模塊新增了任意通道工作模式,支持在多種應(yīng)用場景中更靈活的應(yīng)用;本文針對任意通道工作模式,分享在MM32F013x上實現(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 ?1253次閱讀
    使用<b class='flag-5'>MM</b>32F0270 <b class='flag-5'>LPTIM</b>從STOP模式喚醒
    主站蜘蛛池模板: 国产一级特黄aa大片爽爽 | 性黄视频 | 亚洲成人资源 | 三级黄色一级视频 | 狠狠色噜狠狠狠狠色综合久 | 天天干天天色天天射 | 天天摸天天干 | 欧美婷婷 | 能可以直接看的av网址 | 天天操天天干天天干 | 九九99视频在线观看视频观看 | 深夜免费在线视频 | 黄色成人在线 | 精品综合久久88色鬼首页 | 国产特级毛片 | 女人张开腿让男人桶免费最新 | 伊人久久精品成人网 | 狠狠色噜狠狠狠狠 | 欧美午夜网| 爽好舒服老师快点 | 天天射天天操天天色 | 天天干天天插天天射 | 国产激烈床戏无遮挡在线观看 | 77788色淫网站免费观看 | 亚洲色图综合图区 | 一级毛片在线播放 | 亚洲男人的天堂成人 | 国内色综合精品视频在线 | 久久青草精品一区二区三区 | 久久思re热9一区二区三区 | 国产香蕉视频在线观看 | 日韩日韩| 亚洲理论在线 | 狠狠色网 | 四虎影院永久免费 | 手机视频在线播放 | 国产精品三区四区 | 国产成人永久在线播放 | 欧美高清一级片 | 国模大尺度在线 | 亚洲高清一区二区三区四区 |