YTM32B1LD0系列MCU低功耗模式介绍
YTM32B1LD0系列MCU是苏州云途半导体针对车身控制领域推出的入门级32位产品,最高主频达48MHz,内嵌128KB Flash和16KB SRAM,MCU内嵌CAN-FD,LIN等丰富接口,满足车规可靠性要求AEC-Q100。可以应用于车身传感器控制、电机控制、胎压监测、电动座椅、电动尾门、天窗、灯光控制及内饰灯控制等方面。
低功耗模式简介
YTM系列MCU针对汽车的低功耗需求,定义了几种不同的低功耗模式:
- Sleep模式,也称为睡眠模式。这种模式下MCU内部的时钟都保持工作状态,CPU核心停止工作,等待外设中断唤醒,因为只有CPU停止工作,所以一般功耗降低的比较少,但是系统可以最快速的唤醒,对于采用系统时钟的外设也是没有影响的。在Sleep模式下,芯片内部电源模块依然保持正常运行状态,有比较高的带负载能力。
- DeepSleep模式,也称深入睡眠模式。这种模式下系统总线时钟停止工作,CPU核心停止工作,等待外设中断唤醒,此时对于采用系统时钟作为主时钟的外设,比如eTMR,pTMR,DMA等模块因为没有了时钟,所以都是不能工作的。系统的其他时钟,比如FIRC,FXOSC等时钟是可以根据时钟配置选择开启和关闭的,对于支持功能时钟的外设,如果相应的时钟保持开启,那这些模块也是可以正常工作的。DeepSleep模式由于总线时钟关闭,一些依赖总线时钟的模块也无法工作,所以功耗会有比较大的降低。在DeepSleep模式下,芯片内部电源模块依然保持正常运行状态,有比较高的带负载能力。从DeepSleep模式唤醒的时候,因为一些功能时钟需要重新启动,所以唤醒时间相比于Sleep模式会有一定的延长,这个时间还取决于有多少时钟需要重新启动。
- Standby模式,也称为待机模式。这种模式和DeepSleep模式的主要区别是芯片内部的电源模块工作在低功耗模式,此时芯片的带负载能力有一定减弱。这种模式下对于支持功能时钟的模块,如果相应的功能时钟开启,这些模块也可以正常工作,并可以正常唤醒芯片。这种模式下因为芯片内部电源模块需要从正常工作模式转换成低功耗模式,唤醒的时候需要从低功耗模式回到正常模式,所以进入待机模式和从待机模式唤醒都需要一定的时间,这个时间一般是微秒级别。在Standby模式下,芯片内部RAM数据依然保持,Flash进入低功耗模式,所有模块寄存器配置保持不变,所以唤醒的时候,CPU还是可以继续运行。
- PowerDown模式,也称为掉电模式。这种模式芯片大部分数字电路的供电被断开,只有少部分数字逻辑单独供电,芯片内部电源模块仅维持不断电的少量数字逻辑供电,此时芯片的功耗是最低的。在PowerDown模式下仅有支持唤醒功能的IO可以唤醒系统,另外还支持唤醒的内部模块包括lpTMR,RTC,ACMP等,模块的功能时钟也只有SIRC和SXOSC可以选择。PowerDown模式因为大部分数字电路都已经断电,所以唤醒的时候系统需要复位才能正常运行。
Mode(模式) | Clock(时钟) | 外设 | 唤醒源 | 复位 | 功耗 |
---|---|---|---|---|---|
Sleep(睡眠) | 无变化 | 正常工作 | 所有中断 | 否 | 稍有降低 |
DeepSleep(深度睡眠) | 总线时钟关闭,功能时钟可配置 | 支持功能时钟,且功能时钟开启的模块正常工作 | 异步中断,所有GPIO | 否 | 较低 |
Standby(待机) | 总线时钟关闭,功能时钟可配置 | 支持功能时钟,且功能时钟开启的模块正常工作 | 异步中断,所有GPIO | 否 | 很低 |
PowerDown(掉电) | SIRC/SXOSC可配置 | lpTMR, RTC, ACMP, WKU且有功能时钟 | lpTMR, RTC, ACMP, WKU特定GPIO | 是 | 最低 |
芯片低功耗模式代码分析
YTM32B1LD0芯片的电源模式主要通过power_manager
实现,用户可以根据自己的需要配置多种低功耗模式,然后通过相应的函数进行切换。电源模式的定义如下:
/*******************************************************************************
* Included files
******************************************************************************/
#include "power_config.h"
/*! @brief User Configuration structure pwrMan1_InitConfig4 */
power_manager_user_config_t pwrMan_InitConfigRun = {
.powerMode = POWER_MANAGER_RUN, /*!< 目标系统模式 */
.sleepOnExitValue = false, /*!< RUN模式无效 */
};
power_manager_user_config_t pwrMan_InitConfigSleep = {
.powerMode = POWER_MANAGER_SLEEP, /*!< 目标模式为Sleep睡眠模式 */
.sleepOnExitValue = false, /*!< 立即进入模式 */
};
power_manager_user_config_t pwrMan_InitConfigDeepSleep = {
.powerMode = POWER_MANAGER_DEEPSLEEP, /*!< 目标模式为DeepSleep深度睡眠模式 */
.sleepOnExitValue = false, /*!< 立即进入模式 */
};
power_manager_user_config_t pwrMan_InitConfigStandBy = {
.powerMode = POWER_MANAGER_STANDBY, /*!< 目标模式为Standby待机模式 */
.sleepOnExitValue = false, /*!< 立即进入模式 */
};
/*! @brief Array of pointers to User configuration structures */
power_manager_user_config_t * powerConfigsArr[] = {
&pwrMan_InitConfigRun,
&pwrMan_InitConfigSleep,
&pwrMan_InitConfigDeepSleep,
&pwrMan_InitConfigStandBy,
};
/*! @brief Array of pointers to User defined Callbacks configuration structures */
/* 定义模式切换之前和之后的回调函数 */
power_manager_callback_user_config_t * powerStaticCallbacksConfigsArr[] = {(void *)0};
模式切换函数:
#define RUN_MODE (0)
#define SLEEP_MODE (1)
#define DEEPSLEEP_MODE (2)
#define STANDBY_MODE (3)
void power_mode_swtich()
{
/* 初始化电源模式 */
POWER_SYS_Init(
&powerConfigsArr,
POWER_MANAGER_CONFIG_CNT,
&powerStaticCallbacksConfigsArr,
POWER_MANAGER_CALLBACK_CNT);
/* 设置电源模式 */
POWER_SYS_SetMode(STANDBY_MODE, POWER_MANAGER_POLICY_AGREEMENT);
}
芯片低功耗模式常见问题汇总:
- 芯片建议的低功耗模式是哪种,芯片处于低功耗模式下可以通过哪些模块唤醒?
YTM32B1LD0系列芯片最低只支持到Standby模式(不支持PowerDown模式),这种模式下芯片功耗可以达到20uA以下,这种模式下所有的GPIO都是可以正常唤醒的芯片的,另外一些支持功能时钟的模块,比如lpTMR, I2C, SPI, UART, RTC, ACMP等模块也是可以正常唤醒芯片的。
- 为什么当我进入Standby模式的时候,测量的电流要比数据手册上标的值高很多?
这是一个我们进行低功耗模式调试时经常碰到的一个问题,针对这个问题一般有以下几种原因:
- 系统进入没有正确进入低功耗模式,此时系统电流和Sleep模式相当,如果发现是这种情况,那么就要看是不是有模块产生了唤醒中断,比如GPIO开启了中断唤醒功能,但是系统并没有使能GPIO的中断(NVIC模块禁用了中断),这个时候系统是无法进入Standby模式,因为当系统开始进入低功耗模式的时候,发现有一个Pending的外部中断没有响应,而这个中断是可以唤醒系统的,所以系统便会退出进入低功耗模式,转而等待这个中断被系统响应,而这个时候NVIC禁用了这个中断,所以CPU依然保持Sleep模式,系统上表现进入了低功耗模式,而实际上是进入了Sleep模式,对于这种情况,我们就要排查系统使能的模块是否在系统进入standby模式的时候产生了中断。
- 系统进入了低功耗模式,但是电流在200uA左右,这种情况从电流上看是进入了Standby模式,模式电流偏高的原因可能是在Standby模式下开启了部分的功能时钟,比如SIRC或者FXOSC,并且有一些模块正在工作,比如lpTMR以SIRC作为功能时钟工作,这种情况是比较正常的,如果不需要SIRC时钟,那么可以修改时钟配置,从而进一步降低系统功耗。我们数据手册上面的电流数据都是在关闭这些功能时钟的情况下测试得到的。
- 电流偏高的另外一个原因可能是GPIO上有一定的负载,比如GPIO的输入模式开启了上拉电阻,但是外部负载是将GPIO拉低的,或者GPIO输出了一个高电平,而外部负载并不是高阻态,这两种情况都会导致GPIO上面有比较大的电流。
- 从低功耗模式唤醒的时候,外设需要重新配置吗?进入低功耗模式之前外设是不是需要做特殊的操作?
对于大部分外设,进出低功耗都不需要做特殊的操作,因为YTM32B1LD0外设都是不掉电的,所有的配置都是可以保留的,所以从低功耗模式唤醒之后可以继续使用,并不需要重新初始化。
对于部分外设,当系统请求进入低功耗模式的时候,如果外设正在工作,那么外设会Block系统的低功耗请求,直到当前操作完成,如果系统长时间没有得到外设的响应,系统会直接产生Reset。比如DMA正在传输数据的时候,系统请求进入低功耗模式,这个时候为了防止数据丢失,DMA需要完成当前数据传输之后才会响应低功耗模式请求。
- 低功耗模式下怎么唤醒芯片?
参考前面的表格,Sleep模式下,所有外设都是正常工作的,实际上只有CORE处于Sleep状态,此时所有外设的中断都可以唤醒芯片。在DeepSleep和Standby模式下,首先我们要在芯片手册的7.2章节NVIC表格中看模块Wakeup列是否标为可唤醒,另外当模块工作时需要时钟(比如lpTMR,RTC,WDG),那么还要保证模块的功能时钟在低功耗模式下保持开启才能正常唤醒。当使用GPIO作为唤醒源的时候,要注意以下几点:
- GPIO未开启数字滤波功能,GPIO开启了上升沿/下降沿/双沿中断时,中断可以直接唤醒芯片
- GPIO开启数字滤波功能,数字滤波时钟选择系统时钟,此时系统进入低功耗模式时GPIO数字滤波自动禁用,GPIO中断可以直接唤醒芯片
- GPIO开启数字滤波功能,数字滤波时钟选择128K时钟,此时必须确保128K时钟在低功耗模式开启才能正常唤醒,GPIO数字滤波功能也可以正常工作
最后更新于 2021-12-17 03:25:35 并被添加「应用笔记 低功耗模式 YTM32」标签,已有 3370 位童鞋阅读过。
本作品采用知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议进行许可。