產品簡介
YTM32L系列MCU是蘇州云途半導體針對車身控制領域推出的入門級32位產品,最高主頻達48MHz,內嵌128KB Flash和16KB SRAM,MCU內嵌CAN-FD,LIN等豐富接口,滿足車規(guī)可靠性要求AEC-Q100。可以應用于車身傳感器控制、電機控制、胎壓監(jiān)測、電動座椅、電動尾門、天窗、燈光控制及內飾燈控制等方面。
YTM32 M系列芯片基于32位車規(guī)級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可以保留運行狀態(tài)信息的最低功耗模式,Power Down模式則是只有部分模塊和部分SRAM可以保留運行信息,其他模塊和CPU在內都會斷電,系統(tǒng)喚醒之后需要重啟,該模式是系統(tǒng)的最低功耗模式。YTM32系列MCU通過多種低功耗模式組合能夠很好的滿足汽車應用的低功耗需求。
低功耗模式簡介
YTM系列MCU針對汽車的低功耗需求,定義了幾種不同的低功耗模式:
- Sleep模式,也稱為睡眠模式。這種模式下MCU內部的時鐘都保持工作狀態(tài),CPU核心停止工作,等待外設中斷喚醒,因為只有CPU停止工作,所以一般功耗降低的比較少,但是系統(tǒng)可以最快速的喚醒,對于采用系統(tǒng)時鐘的外設也是沒有影響的。在Sleep模式下,芯片內部電源模塊依然保持正常運行狀態(tài),有比較高的帶負載能力。
- DeepSleep模式,也稱深入睡眠模式。這種模式下系統(tǒng)總線時鐘停止工作,CPU核心停止工作,等待外設中斷喚醒,此時對于采用系統(tǒng)時鐘作為主時鐘的外設,比如eTMR,pTMR,DMA等模塊因為沒有了時鐘,所以都是不能工作的。系統(tǒng)的其他時鐘,比如FIRC,F(xiàn)XOSC等時鐘是可以根據(jù)時鐘配置選擇開啟和關閉的,對于支持功能時鐘的外設,如果相應的時鐘保持開啟,那這些模塊也是可以正常工作的。DeepSleep模式由于總線時鐘關閉,一些依賴總線時鐘的模塊也無法工作,所以功耗會有比較大的降低。在DeepSleep模式下,芯片內部電源模塊依然保持正常運行狀態(tài),有比較高的帶負載能力。從DeepSleep模式喚醒的時候,因為一些功能時鐘需要重新啟動,所以喚醒時間相比于Sleep模式會有一定的延長,這個時間還取決于有多少時鐘需要重新啟動。
- Standby模式,也稱為待機模式。這種模式和DeepSleep模式的主要區(qū)別是芯片內部的電源模塊工作在低功耗模式,此時芯片的帶負載能力有一定減弱。這種模式下對于支持功能時鐘的模塊,如果相應的功能時鐘開啟,這些模塊也可以正常工作,并可以正常喚醒芯片。這種模式下因為芯片內部電源模塊需要從正常工作模式轉換成低功耗模式,喚醒的時候需要從低功耗模式回到正常模式,所以進入待機模式和從待機模式喚醒都需要一定的時間,這個時間一般是微秒級別。在Standby模式下,芯片內部RAM數(shù)據(jù)依然保持,F(xiàn)lash進入低功耗模式,所有模塊寄存器配置保持不變,所以喚醒的時候,CPU還是可以繼續(xù)運行。
- PowerDown模式,也稱為掉電模式。這種模式芯片大部分數(shù)字電路的供電被斷開,只有少部分數(shù)字邏輯單獨供電,芯片內部電源模塊僅維持不斷電的少量數(shù)字邏輯供電,此時芯片的功耗是最低的。在PowerDown模式下僅有支持喚醒功能的IO可以喚醒系統(tǒng),另外還支持喚醒的內部模塊包括lpTMR,RTC,ACMP等,模塊的功能時鐘也只有SIRC和SXOSC可以選擇。PowerDown模式因為大部分數(shù)字電路都已經斷電,所以喚醒的時候系統(tǒng)需要復位才能正常運行。
Mode(模式) | Clock(時鐘) | 外設 | 喚醒源 | 復位 | 功耗 |
---|---|---|---|---|---|
Sleep(睡眠) | 無變化 | 正常工作 | 所有中斷 | 否 | 稍有降低 |
DeepSleep(深度睡眠) | 總線時鐘關閉,功能時鐘可配置 | 支持功能時鐘,且功能時鐘開啟的模塊正常工作 | 異步中斷,所有GPIO | 否 | 較低 |
Standby(待機) | 總線時鐘關閉,功能時鐘可配置 | 支持功能時鐘,且功能時鐘開啟的模塊正常工作 | 異步中斷,所有GPIO | 否 | 很低 |
PowerDown(掉電) | SIRC/SXOSC可配置 | lpTMR, RTC, ACMP, WKU且有功能時鐘 | lpTMR, RTC, ACMP, WKU特定GPIO | 是 | 最低 |
低功耗模式流程
YTM32芯片的低功耗模式結合了ARM CPU的低功耗模式和整個MCU系統(tǒng)外設的低功耗模式,低功耗模式的進入流程如下:
- 配置相應的喚醒外設,并開啟對應的NVIC中斷,保證系統(tǒng)可以正確的喚醒
- 應用程序通過配置LDO的運行模式決定系統(tǒng)在低功耗模式下的供電行為(DeepSleep/Standby/PowerDown),通過相關的時鐘配置設置相應的時鐘在低功耗模式下是否開啟
- 配置內核寄存器的
SCB→SCR
寄存器的SCB_SCR_SLEEPDEEP_Msk
比特決定系統(tǒng)進入Sleep模式還是Deep Sleep模式 - 執(zhí)行
WFI
指令進入低功耗模式
系統(tǒng)執(zhí)行WFI
指令之后,硬件會依據(jù)電源和時鐘的配置自動關閉對應的時鐘,然后切換系統(tǒng)電源,整個過程無需軟件參與,芯片引腳將保持原有的功能配置和輸入輸出狀態(tài),進出低功耗模式過程中,應用無需對芯片引腳做特殊的配置。
另外,進出低功耗模式過程中,系統(tǒng)的時鐘也是硬件切換的,應用軟件無需做時鐘切換。當系統(tǒng)從低功耗模式喚醒的時候,系統(tǒng)會自動恢復低功耗之前的時鐘配置模式,然后從WFI指令位置繼續(xù)往下執(zhí)行程序(Power Down模式需要復位)。比如系統(tǒng)進入低功耗模式之前系統(tǒng)時鐘為PLL,PLL參考時鐘為外部晶振FXOSC,當系統(tǒng)進入低功耗模式(Deep Sleep和Standby)時PLL和外部晶振被硬件關閉,在喚醒過程中,系統(tǒng)硬件可以直接重新開啟FXOSC和PLL,并等待PLL鎖定后將PLL作為系統(tǒng)時鐘執(zhí)行程序。
需要注意的是,當系統(tǒng)時鐘采用FXOSC或者PLL的時候,系統(tǒng)喚醒需要等待外部晶振起振和PLL鎖定,而外部晶振起振時間一般是毫秒級別,所以說系統(tǒng)的喚醒時間會變長。如果應用對于喚醒時間要求比較高,難么建議采用FIRC作為系統(tǒng)的時鐘,F(xiàn)IRC的啟動時間只有幾個微秒,即使從Standby模式喚醒,喚醒時間也之后幾十微秒。
Power Down模式說明
Power down模式是一種掉電模式,和傳統(tǒng)的低功耗模式在使用上有一定的差異。Power down模式本質上是將芯片內部大部分電路直接斷電,從而降低整個系統(tǒng)的功耗。在power down模式下只有部分模塊(lptmr,rtc,acmp,wku等)和部分SRAM可以繼續(xù)保持工作,而包括CPU在內的其他模塊和大部分SRAM都會直接斷電,因為CPU和外設的數(shù)據(jù)無法保存,系統(tǒng)在喚醒的時候需要經過復位。
在power down模式下,芯片引腳狀態(tài)(包含輸入輸出,上下拉及驅動強度配置)會保持進入低功耗模式之前的狀態(tài),當系統(tǒng)喚醒并重新復位之后,應用可以重新初始化芯片引腳功能。
芯片低功耗模式代碼
YTM32芯片的電源模式主要通過power_manager
實現(xiàn),用戶可以根據(jù)自己的需要配置多種低功耗模式,然后通過相應的函數(shù)進行切換。電源模式的定義如下:
/*******************************************************************************
* Included files
******************************************************************************/
#include "power_config.h"
/*! @brief User Configuration structure pwrMan1_InitConfig4 */
power_manager_user_config_t pwrMan_InitConfigRun = {
.powerMode = POWER_MANAGER_RUN, /*!< 目標系統(tǒng)模式 */
.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 */
/* 定義模式切換之前和之后的回調函數(shù) */
power_manager_callback_user_config_t * powerStaticCallbacksConfigsArr[] = {(void *)0};
模式切換函數(shù):
#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模式的時候,測量的電流要比數(shù)據(jù)手冊上標的值高很多?
這是一個我們進行低功耗模式調試時經常碰到的一個問題,針對這個問題一般有以下幾種原因:- 系統(tǒng)進入沒有正確進入低功耗模式,此時系統(tǒng)電流和Sleep模式相當,如果發(fā)現(xiàn)是這種情況,那么就要看是不是有模塊產生了喚醒中斷,比如GPIO開啟了中斷喚醒功能,但是系統(tǒng)并沒有使能GPIO的中斷(NVIC模塊禁用了中斷),這個時候系統(tǒng)是無法進入Standby模式,因為當系統(tǒng)開始進入低功耗模式的時候,發(fā)現(xiàn)有一個Pending的外部中斷沒有響應,而這個中斷是可以喚醒系統(tǒng)的,所以系統(tǒng)便會退出進入低功耗模式,轉而等待這個中斷被系統(tǒng)響應,而這個時候NVIC禁用了這個中斷,所以CPU依然保持Sleep模式,系統(tǒng)上表現(xiàn)進入了低功耗模式,而實際上是進入了Sleep模式,對于這種情況,我們就要排查系統(tǒng)使能的模塊是否在系統(tǒng)進入standby模式的時候產生了中斷。
- 系統(tǒng)進入了低功耗模式,但是電流在200uA左右,這種情況從電流上看是進入了Standby模式,模式電流偏高的原因可能是在Standby模式下開啟了部分的功能時鐘,比如SIRC或者FXOSC,并且有一些模塊正在工作,比如lpTMR以SIRC作為功能時鐘工作,這種情況是比較正常的,如果不需要SIRC時鐘,那么可以修改時鐘配置,從而進一步降低系統(tǒng)功耗。數(shù)據(jù)手冊上面的電流數(shù)據(jù)一般都是在關閉這些功能時鐘的情況下測試得到的。
- 電流偏高的另外一個原因可能是GPIO上有一定的負載,比如GPIO的輸入模式開啟了上拉電阻,但是外部負載是將GPIO拉低的,或者GPIO輸出了一個高電平,而外部負載并不是高阻態(tài),這兩種情況都會導致GPIO上面有比較大的電流。
- 是否外接了調試器,在低功耗模式下,接入調試器也會引入一定的額外功耗,所以測量低功耗模式電流時候務必斷開調試器連接
- 從低功耗模式喚醒的時候,外設需要重新配置嗎?進入低功耗模式之前外設是不是需要做特殊的操作?
對于大部分外設,進出低功耗都不需要做特殊的操作,因為YTM32B1L外設都是不掉電的,所有的配置都是可以保留的,所以從低功耗模式喚醒之后可以繼續(xù)使用,并不需要重新初始化。
對于部分外設,當系統(tǒng)請求進入低功耗模式的時候,如果外設正在工作,那么外設會block系統(tǒng)的低功耗請求,直到當前操作完成,如果系統(tǒng)長時間沒有得到外設的響應,系統(tǒng)會直接產生Reset。比如DMA正在傳輸數(shù)據(jù)的時候,系統(tǒng)請求進入低功耗模式,這個時候為了防止數(shù)據(jù)丟失,DMA需要完成當前數(shù)據(jù)傳輸之后才會響應低功耗模式請求。 - 低功耗模式下怎么喚醒芯片?
參考前面的表格,Sleep模式下,所有外設都是正常工作的,實際上只有CORE處于Sleep狀態(tài),此時所有外設的中斷都可以喚醒芯片。在DeepSleep和Standby模式下,首先我們要在芯片手冊的NVIC表格中看模塊Wakeup列是否標為可喚醒,另外當模塊工作時需要時鐘(比如lpTMR,RTC),那么還要保證模塊的功能時鐘在低功耗模式下保持開啟才能正常喚醒。當使用GPIO作為喚醒源的時候,要注意以下幾點:- GPIO未開啟數(shù)字濾波功能,GPIO開啟了上升沿/下降沿/雙沿中斷時,中斷可以直接喚醒芯片
- GPIO開啟數(shù)字濾波功能,數(shù)字濾波時鐘選擇系統(tǒng)時鐘,此時系統(tǒng)進入低功耗模式時GPIO數(shù)字濾波自動禁用,GPIO中斷可以直接喚醒芯片
- GPIO開啟數(shù)字濾波功能,數(shù)字濾波時鐘選擇128K時鐘,此時必須確保128K時鐘在低功耗模式開啟才能正常喚醒,GPIO數(shù)字濾波功能也可以正常工作
評論
查看更多