产品简介
YTM32L系列MCU是苏州云途半导体针对车身控制领域推出的入门级32位产品,最高主频达48MHz,内嵌128KB Flash和16KB SRAM,MCU内嵌CAN-FD,LIN等丰富接口,满足车规可靠性要求AEC-Q100。可以应用于车身传感器控制、电机控制、胎压监测、电动座椅、电动尾门、天窗、灯光控制及内饰灯控制等方面。
YTM32 M系列芯片基于32位车规级ARM Cortex-M33内核,CPU全温域主频高达120MHz,提供1.25MB嵌入式闪存,符合ISO26262的ASIL-B等级要求,可靠性满足AEC-Q100、Grade1标准,信息安全方面支持AES、SHA以及国密SM4等多种加密算法,并提供符合AUTOSAR标准的MCAL。
在低功耗方面,YTM32系列MCU支持Sleep,DeepSleep,Standby和Power Down(L系列不支持)几种低功耗模式,其中Standby模式是CPU可以保留运行状态信息的最低功耗模式,Power Down模式则是只有部分模块和部分SRAM可以保留运行信息,其他模块和CPU在内都会断电,系统唤醒之后需要重启,该模式是系统的最低功耗模式。YTM32系列MCU通过多种低功耗模式组合能够很好的满足汽车应用的低功耗需求。
低功耗模式简介
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 | 是 | 最低 |
低功耗模式流程
YTM32芯片的低功耗模式结合了ARM CPU的低功耗模式和整个MCU系统外设的低功耗模式,低功耗模式的进入流程如下:
- 配置相应的唤醒外设,并开启对应的NVIC中断,保证系统可以正确的唤醒
- 应用程序通过配置LDO的运行模式决定系统在低功耗模式下的供电行为(DeepSleep/Standby/PowerDown),通过相关的时钟配置设置相应的时钟在低功耗模式下是否开启
- 配置内核寄存器的
SCB→SCR
寄存器的SCB_SCR_SLEEPDEEP_Msk
比特决定系统进入Sleep模式还是Deep Sleep模式 - 执行
WFI
指令进入低功耗模式
系统执行WFI
指令之后,硬件会依据电源和时钟的配置自动关闭对应的时钟,然后切换系统电源,整个过程无需软件参与,芯片引脚将保持原有的功能配置和输入输出状态,进出低功耗模式过程中,应用无需对芯片引脚做特殊的配置。
另外,进出低功耗模式过程中,系统的时钟也是硬件切换的,应用软件无需做时钟切换。当系统从低功耗模式唤醒的时候,系统会自动恢复低功耗之前的时钟配置模式,然后从WFI指令位置继续往下执行程序(Power Down模式需要复位)。比如系统进入低功耗模式之前系统时钟为PLL,PLL参考时钟为外部晶振FXOSC,当系统进入低功耗模式(Deep Sleep和Standby)时PLL和外部晶振被硬件关闭,在唤醒过程中,系统硬件可以直接重新开启FXOSC和PLL,并等待PLL锁定后将PLL作为系统时钟执行程序。
需要注意的是,当系统时钟采用FXOSC或者PLL的时候,系统唤醒需要等待外部晶振起振和PLL锁定,而外部晶振起振时间一般是毫秒级别,所以说系统的唤醒时间会变长。如果应用对于唤醒时间要求比较高,难么建议采用FIRC作为系统的时钟,FIRC的启动时间只有几个微秒,即使从Standby模式唤醒,唤醒时间也之后几十微秒。
Power Down模式说明
Power down模式是一种掉电模式,和传统的低功耗模式在使用上有一定的差异。Power down模式本质上是将芯片内部大部分电路直接断电,从而降低整个系统的功耗。在power down模式下只有部分模块(lptmr,rtc,acmp,wku等)和部分SRAM可以继续保持工作,而包括CPU在内的其他模块和大部分SRAM都会直接断电,因为CPU和外设的数据无法保存,系统在唤醒的时候需要经过复位。
在power down模式下,芯片引脚状态(包含输入输出,上下拉及驱动强度配置)会保持进入低功耗模式之前的状态,当系统唤醒并重新复位之后,应用可以重新初始化芯片引脚功能。
芯片低功耗模式代码
YTM32芯片的电源模式主要通过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);
}
芯片低功耗模式常见问题汇总
- 芯片建议的低功耗模式是哪种,芯片处于低功耗模式下可以通过哪些模块唤醒?
YTM32B1L系列芯片最低只支持到Standby模式(不支持PowerDown模式),这种模式下所有的GPIO都是可以正常唤醒的芯片的,另外一些支持功能时钟的模块,比如lpTMR, I2C, SPI, UART, RTC, ACMP等模块也是可以正常唤醒芯片的。
YTM32B1M/H系列芯片最低功耗模式时Power Down,这种模式下只有支持WKU功能的PIN可以正常唤醒的芯片,另外一些在低功耗电源域的模块,比如lpTMR, RTC, ACMP等模块也是可以正常唤醒芯片的。 - 为什么当我进入Standby/PowerDown模式的时候,测量的电流要比数据手册上标的值高很多?
这是一个我们进行低功耗模式调试时经常碰到的一个问题,针对这个问题一般有以下几种原因:- 系统进入没有正确进入低功耗模式,此时系统电流和Sleep模式相当,如果发现是这种情况,那么就要看是不是有模块产生了唤醒中断,比如GPIO开启了中断唤醒功能,但是系统并没有使能GPIO的中断(NVIC模块禁用了中断),这个时候系统是无法进入Standby模式,因为当系统开始进入低功耗模式的时候,发现有一个Pending的外部中断没有响应,而这个中断是可以唤醒系统的,所以系统便会退出进入低功耗模式,转而等待这个中断被系统响应,而这个时候NVIC禁用了这个中断,所以CPU依然保持Sleep模式,系统上表现进入了低功耗模式,而实际上是进入了Sleep模式,对于这种情况,我们就要排查系统使能的模块是否在系统进入standby模式的时候产生了中断。
- 系统进入了低功耗模式,但是电流在200uA左右,这种情况从电流上看是进入了Standby模式,模式电流偏高的原因可能是在Standby模式下开启了部分的功能时钟,比如SIRC或者FXOSC,并且有一些模块正在工作,比如lpTMR以SIRC作为功能时钟工作,这种情况是比较正常的,如果不需要SIRC时钟,那么可以修改时钟配置,从而进一步降低系统功耗。数据手册上面的电流数据一般都是在关闭这些功能时钟的情况下测试得到的。
- 电流偏高的另外一个原因可能是GPIO上有一定的负载,比如GPIO的输入模式开启了上拉电阻,但是外部负载是将GPIO拉低的,或者GPIO输出了一个高电平,而外部负载并不是高阻态,这两种情况都会导致GPIO上面有比较大的电流。
- 是否外接了调试器,在低功耗模式下,接入调试器也会引入一定的额外功耗,所以测量低功耗模式电流时候务必断开调试器连接
- 从低功耗模式唤醒的时候,外设需要重新配置吗?进入低功耗模式之前外设是不是需要做特殊的操作?
对于大部分外设,进出低功耗都不需要做特殊的操作,因为YTM32B1L外设都是不掉电的,所有的配置都是可以保留的,所以从低功耗模式唤醒之后可以继续使用,并不需要重新初始化。
对于部分外设,当系统请求进入低功耗模式的时候,如果外设正在工作,那么外设会block系统的低功耗请求,直到当前操作完成,如果系统长时间没有得到外设的响应,系统会直接产生Reset。比如DMA正在传输数据的时候,系统请求进入低功耗模式,这个时候为了防止数据丢失,DMA需要完成当前数据传输之后才会响应低功耗模式请求。 - 低功耗模式下怎么唤醒芯片?
参考前面的表格,Sleep模式下,所有外设都是正常工作的,实际上只有CORE处于Sleep状态,此时所有外设的中断都可以唤醒芯片。在DeepSleep和Standby模式下,首先我们要在芯片手册的NVIC表格中看模块Wakeup列是否标为可唤醒,另外当模块工作时需要时钟(比如lpTMR,RTC),那么还要保证模块的功能时钟在低功耗模式下保持开启才能正常唤醒。当使用GPIO作为唤醒源的时候,要注意以下几点:- GPIO未开启数字滤波功能,GPIO开启了上升沿/下降沿/双沿中断时,中断可以直接唤醒芯片
- GPIO开启数字滤波功能,数字滤波时钟选择系统时钟,此时系统进入低功耗模式时GPIO数字滤波自动禁用,GPIO中断可以直接唤醒芯片
- GPIO开启数字滤波功能,数字滤波时钟选择128K时钟,此时必须确保128K时钟在低功耗模式开启才能正常唤醒,GPIO数字滤波功能也可以正常工作
评论
查看更多