S32K3xx低功耗获取唤醒源
在上一篇学习总结中知道S32K3xx只有两种运行模式:RUN和Standby模式,从Standby模式唤醒后从启动程序开始运行,直接复位了。因此MCU需要知道复位原因,若是唤醒复位需要再判断唤醒源。
我参考某大佬的S32K3xx电源管理例程后,回过头去芯片手册找寻例程为何这样写的原因?学习提升看芯片手册的能力!
《S32K3xx Reference Manual》
一、获取复位原因
获取复位原因很简单,只需要调用一个接口即可:
根据返回值判断复位原因:
二、获取唤醒源
1.思路分析
RUN模式和Standby模式的切换参考上一篇学习总结。
查阅S32K3xx芯片手册:
可以看到在Standby模式种虽然Flash关闭了,但是还有一个32KB的SRAM可以使用
从Standby boot流程图可以看到,退出Standby模式也分为”Fast standby mode“和”Normal boot on exit from standby“。”Normal boot on exit from standby“在退出Standby模式时就直接正常复位启动了,”Fast standby mode“模式则可以读”APPlication Core“的复位寄存器”DCMRWF5“。
可以看到”DCMRWF5“的第0位用来选择”Fast standby mode“和”Normal boot on exit from standby“,1-31位用于存放在退出待机模式后使用的向量表的Cortex-M7_0基址(仅在Fast Standby模式下有效)。
可以看到唤醒源的标志位存放在”WISR“和”WISR_64“中。
因此可以得出程序设计思路:
1)Standby模式中可运行32KB的SRAM,因此开辟出32KB的standby ram,将存放唤醒源的数组arr1放到standby ram;
2)写一个获取唤醒源的函数func1,将”WISR“和”WISR_64“中唤醒源标志存放到arr1,后续直接读取arr1可获得唤醒源;
3)写一个向量表VectorTable,VectorTable中包含func1,则可以在执行向量表时执行func1以获取唤醒源;
4)在进入Standby模式之前配置DCMRWF5寄存器,将DCMRWF5[31-1]放入VectorTable地址,将DCMRWF5[0]配置为”Fast standby mode“。
运行流程:进入Standby模式之前已经配置DCMRWF5,当进行”Fast standby mode“唤醒时,先执行VectorTable中的func1获取唤醒源,并将唤醒源放入arr1,然后复位,复位之后可查看arr1以确定唤醒源。
2.程序分析
1)开辟32KB standby ram
.ld文件学习参考:S32DS中.ld(链接)文件学习和S32DS中链接文件及启动代码学习
在flash的.ld文件中将int_sram分出16KB为int_standbysram,再分出16KB为int_standbysram_stack
在对应int_flash和int_sram之间添加int_standbysram内容
在设置栈stack处添加int_standbysram_stack
在设置RAM/ROM大小处添加STANDBY_SRAM_SIZE
2)创建存放唤醒源数组、获取唤醒源函数、向量表
创建存放唤醒源数组
获取唤醒源函数(获取完唤醒源之后跳到Reset_Handler进行复位)
创建向量表(向量表中依次是Standby的栈入口,获取唤醒源函数入口和undefined_handler入口。为什么要加undefined_handler我也不理解;为什么要将向量表放到.rodata只读数据段(const),我的理解是因为向量表以及向量表中的入口本质都是地址,32bit地址就是常量数据)
3)进入Standby模式之前配置DCMRWF5
4)复位后查询/清除唤醒源
最后再写一个查询唤醒源和清除唤醒源的接口
到此就完成了S32K3xx从Standby模式唤醒后查询唤醒源的工作,参考例程。