ME0-demo_PowerDown_PollingWeakup
-
- 背景
- powerdown模式下polling唤醒
- 需求
- 100ms周期唤醒,由 powerdown mode---active 状态,Active保持200us;
- active 状态下打开10个IO口,4路AD ,用来做唤醒判断;
- ADC可以唤醒(powerdown模式下不能直接使用ADC唤醒,可以使用acmp模块间接ADC唤醒);
- 云途ME0 ev板测试睡眠电流大小;
- SDK: 1.3.1 , gcc
- 解决方案描述
- 步骤1:使用lptmr定时100ms定时自动唤醒(此唤醒是WKU模块的lptmr硬件中断唤醒),保证唤醒时间保持200us,并测量开发板的powerdown模式整板功耗;
- 步骤2:定义restart_init函数,在starup.s中的ram初始化之前添加汇编代码通过判断进入restart_init函数,若restart_init没有唤醒条件,则直接休眠,若有唤醒条件则去唤醒,之后再运行主程序;
- 判断REGFILE->DR[0]的原因是此寄存器在powerdown模式下存储的数据不会丢失;
- 步骤3:在restart_init函数中实现打开10个IO及采4路ADC的值(10个IO,9个输入状态,检测输入值可以做手动唤醒,1个输出用作翻转;4路AD全部使用的是ADC0的通道,所以只开了ADC0的时钟);
- 唤醒逻辑:进休眠前配置REGFILE->DR[0]=0x55, lptmr硬件中断唤醒后通过判断(防止非休眠导致的reset进入restart_init,因此判断REGFILE->DR[0]是否为0x55)进入restart_init函数,此时处于半唤醒状态(即过200us后继续进休眠,程序不会顺序向下执行到main函数处),在restart_init函数中可以判断IO口状态及ADC采样值,若满足全唤醒条件则可以配置REGFILE->DR[1]=0x55进行全唤醒操作(即程序不再进入休眠,而是顺序向下执行到main函数处);
- 步骤4:测试restart_init函数运行所需要的时间,保证唤醒能保持200us;
- 步骤5:测量平均休眠功耗;
- 示例说明
- 步骤1配置lptmr 100ms唤醒,整板功耗测试powerdown大概是97ua左右,此时休眠下enable SIRC:
- 步骤4测试程序唤醒后能保持够200us,因此程序加了延时,使之100ms唤醒后保持200us在进入休眠;
- 步骤5测试数据:polling时间为200us,功耗为138ua
- 工程代码
- 代码中可以看到增加的有可选代码,Acmp的唤醒方案,可以通过宏定义打开,ACMP目前比较的是ACMP_ch0(正端,也是adc_ch0的采样值,两者是同一个通道)和内部dac(负端,配置的是(128/256)*vref(4096)),当正端值低于负端值触发中断进行唤醒;
- 变量的定义要放到retention_ram区域,避开重启后的ram初始化,注意lptmr和acmp的唤醒配置;
- 程序中会不停查询demo板上SW3的状态,按下后即进入休眠状态;
- 综上所述:此demo程序通过按下SW3进入休眠状态,lptmr每100ms进行半唤醒,可以通过按下SW2或者提高adc_ch1采样值(旋动AN1/RP1变阻器)进入全唤醒;若开启acmp唤醒,则需要调节adc_ch0的采样值(旋动AN2/RP2变阻器)使之小于 vref(4096)/2 即可直接进行全唤醒;
- 功耗测量:将电流表接在demo板J8两端,注意断开debug口;
ME0_Powerdown_Polling_wakeup.zip
-
从PD模式下唤醒,引起复位,对应RSSR寄存器的值,是没有的是吗?
实测也是没有影响的:
帮助没办法联网的电脑使用YCT
帮助改进和优化YT CONFIG TOOL,有机会抽取YTM32B1ME0 EVB哦...