本帖最后由 MM灵灵灵 于 2022-11-22 11:52 编辑
基于MM32L0130的低功耗电子时钟设计
MM32L0130作为灵动微电子推出的一款低功耗芯片,内置多种省电工作模式保证低功耗应用的要求。前面章节分别对MM32L0130片上外设SLCD和RTC做了相关描述,并列举对应程序实现SLCD驱动LCD显示、RTC日历和闹钟,其实SLCD与RTC都支持在特定的低功耗模式下运行,结合这两个外设特性,在前面实验的基础上,使用EVB_L0136开发板可以轻松实现一个低功耗电子时钟设计。本次微课堂通过讲述MM32L0130 PWR电源控制模式,以及SLCD 和RTC外设配置,实现低功耗应用场景。
1. MM32L0130 PWR简介
电源控制 PWR(Power Controller)主要涉及芯片的供电系统、电源管理器和低功耗模式等功能。
1.1 供电系统
芯片由两种电源提供供电:
由VDDA和VSSA提供的模拟电源,为芯片模拟模块提供电压,用于ADC模块、内部基准电压、内部温度传感器和 PLL 等。
由VDD和VSS提供的数字电源,用于数字部分和I/O引脚工作。
VDD 域主要给 LSE, HSE, PMU, POR, PVD 和部分 I/O 上的唤醒逻辑供电,在上电后保持工作状态。
备份域主要为 RTC、 LCD、 IWDG、备份寄存器和内部低速时钟振荡器 LSI 供电。
VDD_Core 域主要给芯片的内核、内存和外设提供供电,在上电后默认是开启状态,在进入低功耗待机模式时,芯片会硬件选择关闭该 VDD_Core 域,在唤醒后芯片会自动开启。主要有以下几种工作状态:
VDD_Core 域以正常的功耗模式运行,内存、外设都正常工作。
VDD_Core 域以低功耗模式运行,内存、外设都以低功耗工作。
VDD_Core 域以正常功耗模式工作, CPU 进入睡眠模式,内存、外设都以正常的功耗模式工作。
VDD_Core 域以低功耗睡眠模式工作, CPU 进入低功耗睡眠模式,内存、外设都以低功耗工作。
VDD_Core 域以低功耗模式工作,只保持寄存器和 RAM 的内容。
VDD_Core 域以更低功耗模式工作,只保持寄存器和 RAM 的内容。
VDD_Core 域停止供电。除了备份域外,其他所有寄存器和 SRAM 的内容全部丢失。
VDD_Core 域、备份域停止供电。
1.2 MM32L0130低功耗模式
MM32L0130有6种低功耗模式:包括低功耗运行模式,睡眠模式,低功耗睡眠模式,停机模式,待机模式,关机模式:
进一步降低 MCU 在运行模式下的功耗,可以通过配置 PWR_CR1 寄存器的 LPR 位将电压稳压器设置为低功耗模式。该模式下系统频率不应超过 2MHz。
CPU 进入睡眠模式,内存、外设都以正常的功耗模式工作。在睡眠模式下,所有的 I/O 引脚都保持在运行模式时的状态。中断或事件发生后,睡眠模式立即被唤醒。
- Low Power Sleep Mode 低功耗睡眠模式
CPU 进入低功耗睡眠模式,内存、外设都以低功耗工作。在睡眠模式下,所有的 I/O 引脚都保持在运行模式时的状态。中断或事件发生后,睡眠模式立即被唤醒。
停机模式下,CPU 进入深度睡眠模式, VDD_Core 域的所有时钟都被停止, PLL、 HSI 和 HSE 振荡器的功能被禁止, SRAM 和寄存器内容被保留下来。
深度停机是在 CPU 深度睡眠模式的基础上结合了外设的时钟控制和电压稳压器控制机制的一种低功耗模式。在深度停机模式下, VDD_Core 域的所有时钟都被停止, PLL、 HSI 和 HSE 振荡器的功能被禁止, SRAM 和寄存器内容被保留下来。
待机模式是在 CPU 深睡眠模式的基础上关闭电压稳压器。整个 VDD_Core 域被切断, PLL、 HSI 和HSE 振荡器也被关闭, SRAM 和寄存器内容丢失,只有备份域的寄存器和待机电路维持供电。唤醒后芯片将复位。
在关机模式下,内部所有的稳压器全都被关闭, BOR 关闭,只保留 POR 和少数其他 VDD 域的电路正常工作(PMU 部分逻辑/POR/IO Wakeup 逻辑)。
1.3 功耗模式选择
一般根据最低电源消耗,最快启动时间和可用的唤醒源等条件,选择一种最佳的低功耗模式。相关参数可以参考各系列对应的数据手册,如下数据从数据手册摘取。
1.31 电流消耗
电流消耗是多种参数和因素的综合指标,这些参数和因素包括工作电压、环境温度、 I/O引脚的负载、产品的软件配置、工作频率、 I/O 脚的翻转速率、程序在存储器中的位置以及执行的代码等。本节中给出的所有运行模式下的电流消耗测量值,都是在执行一套精简的代码。
睡眠模式下的典型电流消耗:
停机模式下的典型电流消耗和最大电流消耗:
I/O 状态为模拟输入。
待机模式下的典型电流消耗和最大电流消耗:
I/O 状态为模拟输入。 关机模式下的典型电流消耗和最大电流消耗:
I/O 状态为模拟输入。
1.32 唤醒时间
低功耗模式的唤醒时间:
2. 实验
2.1 实验说明
MM32L0130的RTC和SLCD外设都支持睡眠模式、停机模式、和待机模式。RTC模块连接到EXTI部分用于低功耗唤醒信号,包括闹钟、唤醒单元、入侵事件。SLCD驱动模块在不需要显示的时候,可以完全关闭 SLCD 驱动以达到降低功耗的目的。
硬件使用灵动微电子设计的EVB-L0136开发板,板载LCD接口可以适配GDC0689液晶屏,以LCD中的6位数码管显示时间时、分、秒,在1s时间范围内完成唤醒并更新显示数据即可,根据需要可以选择停机模式和待机模式,待机模式功耗最低。在STOP模式下, VDD_Core域的所有时钟都被停止, PLL、 HSI 和 HSE 振荡器的功能被禁止,SRAM 和寄存器内容被保留下来,唤醒之后继续执行进入STOP模式指令之后的程序,可以保证各个任务顺利运行,从STOP模式唤醒时间约为20us,时间相当充分,且功耗较正常运行模式降低很多,这里选择STOP模式。
GDC0689液晶屏全显效果图如下:
2.2 唤醒单元
RTC内部包含周期性的唤醒单元,用于唤醒低功耗模式。
RTC 内部包含一个 16 位的递减计数单元,用于周期性产生唤醒标志,该唤醒定时器可扩展至 17 位。通过配置 RTC_CR 寄存器中的 WUTE 位使能。唤醒单元时钟源:
2、4、8 或 16 分频的 RTC 时钟:
当为 LSE 时,可配置的唤醒中断周期介于 122µs 和 32s 之间,且分辨率低至 61µs。
fck_spre(通常为 1Hz 内部时钟):
WUCKSEL[2:1]=10 时为 1s 到 18h;
WUCKSEL[2:1]=11 时约为 18h 到 36h。
当递减计数器计数到 0 时, RTC_ISR 寄存器的 WUTF 标志会置 1,唤醒计数器会重载 RTC_WUTR寄存器值,通过软件清零 WUTF 标志。
使能 RTC_CR 寄存器中的 WTIE,当计数到 0 时,会产生中断输出。
配置 RTC_CR 寄存器中的位 OSEL[1:0]等于 2, WUTF 连接到 RTC_ALARM 输出。配置 RTC_CR寄存器的 POL 位选择 RTC_ALARM 输出极性。
注:系统复位以及低功耗模式(睡眠、停机和待机)对唤醒定时器没有影响。
2.3 外设配置
关于SLCD和RTC的初始化配置在前面两节微课堂已有相关描述,以下外设配置与应用程序在前面代码上进行增添即可。
1)配置低功耗模式要先使能PWR时钟:
RCC_APB1PeriphClockCmd(RCC_APB1ENR_PWREN, ENABLE);
2)在要进入STOP模式的代码后调用相关库函数,选择低功耗模式,中断唤醒:
PWR_EnterSTOPMode(PWR_Regulator_LowPower, PWR_STOPEntry_WFI);
3)RTC的时钟源选择LSE(32.768KHZ),可配置的唤醒中断周期介于 122µs 和 32s 之间,且分辨率低至 61µs。此处对RTC时钟进行16分频,1s计数2048个,配置唤醒定时器自动重装载值为256,对应125ms,该值越小,唤醒时间越短。
RTCCAL_WakeUpClockConfig(RTCCAL_WakeUpClock_RTCCLK_Div16);
RTCCAL_SetWakeUpCounter(256);
使能唤醒单元,使能RTC唤醒中断:
RTCCAL_WakeUpCmd(ENABLE);
RTCCAL_ClearFlag(RTCCAL_FLAG_WUTF);
RTCCAL_ITConfig(RTCCAL_IT_WUT, ENABLE);
RTC&BKP 全局中断与连接到 EXTI17,配置RTC中断:
RTCCAL_NVIC_Config();
4)SLCD显示,记录当前日历和时间,使用LCD的6位数码管显示时分秒,左上方的4位数码管显示年份。
void LCD_DisplayDataUpdate(void)
{
Number1 = RTCCAL_tempTime.RTCCAL_Seconds;
Number2 = RTCCAL_tempTime.RTCCAL_Minutes;
Number3 = RTCCAL_tempTime.RTCCAL_Hours;
LCD_DisplayNumber1(0, '0' + Number3 / 10, 0);
LCD_DisplayNumber1(1, '0' + Number3 % 10, 0);
LCD_DisplayNumber1(2, '0' + Number2 / 10, 0);
LCD_DisplayNumber1(3, '0' + Number2 % 10, 0);
LCD_DisplayNumber1(4, '0' + Number1 / 10, 0);
LCD_DisplayNumber1(5, '0' + Number1 % 10, 0);
LCD_DisplayUnit(8, 1);
LCD_DisplayUnit(9, 1);
Number4 = RTCCAL_tempDate.RTCCAL_Year;
LCD_DisplayNumber2(0, '2', 0);
LCD_DisplayNumber2(1, '0', 0);
LCD_DisplayNumber2(2, '0' + Number4 / 10, 0);
LCD_DisplayNumber2(3, '0' + Number4 % 10, 0);
}
5)获取当前日历和时间,刷新显示数据,Flag_GainData、Flag_DataUpdate均为时间标志,这里间隔1ms获取数据,间隔10ms刷新数据,Flag_WKUP是中断唤醒标志,数据刷新之后再次进入STOP模式,等待唤醒,刷新时间是影响功耗的主要参数之一,需根据实际应用进行评估。
if(Flag_GainData == 1)
{
Flag_GainData = 0;
RTCCAL_GetDate(RTCCAL_Format_BIN, &RTCCAL_tempDate); RTCCAL_GetTime(RTCCAL_Format_BIN, &RTCCAL_tempTime);
}
if(Flag_DataUpdate == 1)
{
Flag_DataUpdate = 0;
LCD_DisplayDataUpdate();
if(Flag_WKUP == 1)
{
Flag_WKUP = 0;
SystemInit();
PWR_EnterSTOPMode(PWR_Regulator_LowPower, PWR_STOPEntry_WFI);
LED2_TOGGLE();
}
}
本篇文章在功能设计上仅是MM32L0130 SLCD与RTC在低功耗模式下的简单应用,如果对此感兴趣者,可以自己配置RTC闹钟功能、SLCD闪烁模式,以及按键调整时间、蜂鸣提醒、LED显示等进一步完善相关功能。
|