S32K3学习笔记—S32K3之Standy(低功耗)模式
1.前言
关于休眠策略,大致分为两种情况,一种是给MCU断电,通过外围电路来唤醒。另外一种就是MCU不断电,进入低功耗模式。对于给MCU断电这种感觉相对简单,本文主要记录一下S32K3的低功耗(Standy)模式的实现,以及由外部输入唤醒的实现。
2.原理
ECU在某些对电源功耗要求严苛的条件下或者以较长时间周期工作时,需要使芯片进入低功耗(休眠)的模式以达到节能的目的
1.此处介绍了CLKOUT_STANDBY时钟
1.从图可以看出,RUN模式支持所有的外设,但Standy模式下仅深色支持部分,像锁相环PLL是不支持的,所以将FIRC作为Standy的时钟。S32K3只有两种工作模式,Run和 Standy。这部分主要去看手册的电源管理模块。
1.此图介绍了Power-up的流程,可以看出从Standy模式唤醒,相当于一次reset。
3.EB配置
其主要依赖模块:Mcu、Icu
3.1 Mcu
关于Mcu模块,更多细节请参考:S32K3学习笔记—S32K3之MCU模块, 此处只配置Standy所需要的地方
1.增加一个Standy模式
1.将锁相环失能,下面三个全部为灰色表示无锁相环
1.此处时钟选择FIRC,因为无锁相环
1.从Mux1到Mux11,此处的时钟来源都是FIRC
2.外设时钟都不使能
1.将此处的STANDY的时钟设置为FIRC时钟
1.增加一个STANDY的模式
1.选择工作模式,此处选择SOC_STANDBY
2.使能可使中断驱动的应用程序避免返回到空的主应用程序
1.再McuPeripheral中,可以将在standy模式下不需要的时钟全部失能,但WKPU需要使能
3.2 Icu
1.选择对应的WKPU资源,可以根据IoList查找WKPU资源
1.使能对应通道的硬件中断功能
1.增加一路Channel来配置Wkpu
1.配置通道的默认激活边缘
2.配置此通道的测量模式
3.打开边缘检测,此处不需要注册回调函数
注:关于Icu模块后面会在介绍PWM输入中详细记录,此处只用作简单的唤醒功能。
至此,Standy模式就配置完成,接下来就是调试。其调试也相对简单。
4.代码调试
代码比较简单,我们再休眠流程中,将所有的输出关闭之后,重新初始化时钟、使能唤醒源、再配置低功耗模式就行
/* close all output */
....
/* Initialize the clock tree and apply PLL as system clock */
Mcu_InitClock(McuClockSetting_Standy);
/* Initialize the WAKE_UP Mode */
Icu_Init(NULL_PTR);
/* Enble callback but not used */
Icu_EnableEdgeDetection(IcuWkpu_PTE5);
/* Disable standby IO pad keeping */
IP_DCM_GPR->DCMRWF1 |= DCM_GPR_DCMRWF1_STANDBY_IO_CONFIG_MASK;
/* Initialize the Mcu Mode */
Mcu_SetMode(McuModeSetting_Standby);
注意:如果有特殊需求(比如下降沿唤醒MCU的)就需要使能pad keeping,可使用IP_DCM_GPR->DCMRWF1 &= ~DCM_GPR_DCMRWF1_STANDBY_IO_CONFIG_MASK。
那么在MCU初始化的时候一定要失能pad keeping,在初始化的时候加上就行: IP_DCM_GPR->DCMRWF1 |= DCM_GPR_DCMRWF1_STANDBY_IO_CONFIG_MASK;
最后,对于唤醒,我们只需要在对应的IO上面产生一个跳沿就能唤醒。
5.展望
有机会将会多记录一下这种实际应用,一个小功能的记录也不错,如果按照模块来记录的话,将所有的东西都放到一个模块里面,感觉太大了,对于写和读都不是很方便。后续尽可能的细分一下。此处其实还可以去看一下之前文章**S32K3学习笔记—S32K324双核双中断向量表单elf修改-优快云博客** 中所提到的Standby RAM,但其实也没有需求用到所以一直也没时间去研究这个,后续有时间补上这块。