目录
1、概述
S32K3xx仅有两种电源模式,RUN模式和STANDBY模式。S32K1xx之所以有Run、Sleep、Deep Sleep三种电源状态,是因为S32k1xx使用的ARM Cortex M4的内核,其内核就规定了这三种电源模式:
Run:正常工作模式,允许PLL 倍频,内核、系统、总线频率运行在芯片的最高频率,功耗可达数十mA–上百mA
Sleep:普通睡眠模式,大部分外设停止工作,内核、系统和总线部分关闭或降频工作,功耗可降至几个mA
Deep Sleep:深度睡眠,几乎所有外设停止工作、NVIC停止工作,内核、系统和总线关闭,CPU内核停止工作,仅AWIC(异步唤醒中断控制器)这个用于唤醒的外设保持功能,功耗仅几十个uA。
ARM cortex M系列内核进入低功耗模式是通过CPU执行汇编指令WFI(Wait for Interrupt)或者WFE(Wait for Event)完成。
唤醒源
四个内部源与60个外部源可以产生中断与唤醒事件。
WKPU0:SWT0唤醒
WKPU1:RTC唤醒
WKPU2:CMP唤醒
WKPU3:RTI唤醒
WKPU4 - WKPU63:外部引脚
外部中断唤醒源的示例图如下
2、配置目标
2.1、配置资源
芯片型号 | 唤醒源 | IO |
S32K312 | 17 | PTB16 |
2.2、模块依赖关系
模块 | 作用 |
FIRC快速时钟 | 进入Standby之前需要切换到快速时钟 |
Power | 提供run与standby模式 |
Wkpu | 休眠唤醒配置 |
链接文件 | 分配standby RAM使用 |
启动文件 | 上电启动更改 |
IntCtrl_Ip | 中断 |
IO | 设置为唤醒管脚 |
3、RTD配置
本工程实践通过S32DS自带的illd配置工具实现。
3.1、时钟配置
找到时钟选项,添加一路standby 时钟
注意添加完成之后会报错与警告如下图,因为这些时钟是不使用的,需要关闭。
消除错误方法如下,详细信息里面选择不使用即可
根据自身需要,在进入休眠时候哪些使能,哪些不使能呢?这里是可以自己选择的。但是WKPU是必须使能的。
其它的按照默认就行了,配置出来如下图
为什么要添加一路呢,此处添加之后生成部分就会生成一份standby的时钟,如下图所示。
3.2、Power配置
电源管理这块配置如下所示
增加standby模式
3.3、IO配置
3.3、Wkpu配置
设置唤醒方式为上升沿唤醒
设置唤醒源:注意一下为什么是17呢?刚才前面提到了,前面4个源为内部源,IO这块需要在原本13的基础上加4,这点需要非常注意。
添加中断
3.5、中断配置
注意后面的句柄函数出处如下,不是随便写的。
这些准备工作准备好了,下面就是执行代码层面的操作了。
4、代码处理
单独的根据配置生成的代码,休眠是没什么大的问题的,但是唤醒方面就比较不行了,唤醒只能唤醒部分,其实唤醒之后操作等同于复位,直接跳转到复位位置。
4.1、链接文件处理
S32K3中的RAM前32K属于standby ram在休眠模式下也是可以起作用的。所以链接文件上需要在这块做文章,这块根据心情分多少不大于32K就行。
int_standbysram : ORIGIN = 0x20400000, LENGTH = 0x00000800 /* 2K */
int_standbysram_stack : ORIGIN = 0x20400800, LENGTH = 0x00000800 /* 2K */
为启动文件增加一个table,之后.s文件会使用
增加section段,便于存放standby ram里面数据
增加地址信息
4.2、启动文件startup_cm7.s设置
对应链接文件的段
去除ECC错误
4.3、休眠唤醒代码处理
寄存器方面需要重点关注如下
下图为设置下次启动的位置与唤醒等设置信息
下图寄存器为阅读唤醒源信息
ECC初始化信息,下面的代码是不调用的,在上电的时候会执行,所以调试器打不了断点信息的。
下次进入的向量表如下
程序的运行,在初始化的时候无需初始化唤醒操作,在进入唤醒之前进行初始化就行了。
5、实验结果
休眠时刻信息
唤醒源为17
Log信息如下
6、代码链接
休眠唤醒源码https://download.csdn.net/download/weixin_43580890/89427906?spm=1001.2014.3001.5503