最近使用到407的低功耗模式,在系统空闲时进入低功耗状态。硬件上WK_UP引脚PA0已被复用,所以不能使用“待机”模式,进行了“停止”模式的学习、探索、实践。
PWR_EnterSTOPMode(uint32_t PWR_Regulator, uint8_t PWR_STOPEntry)函数介绍,进入停止模式时IO口会保持原状态,中断可以从停止模式唤醒系统,唤醒以后使用的是HSI时钟。
第一次测试时调用函数后设置了新的系统时钟:
[mw_shl_code=c,true]PWR_EnterSTOPMode(PWR_Regulator_LowPower,PWR_STOPEntry_WFI);
Stm32_Clock_Init(192,8,2,7);//设置时钟,Fsys = 96 Mhz[/mw_shl_code]
测试效果系统并没有正常从休眠中唤醒,按键后外部中断唤醒系统,在串口上打印了一些乱码后又进入了停止模式。并且此时IO口保持原状态,功耗还是比较高的。
第二次测试,出于降低停止模式功耗的思路,在进入停止模式前复位了IO口:
[mw_shl_code=c,true]RCC_AHB1PeriphResetCmd(0X04FF,ENABLE);//复位所有IO口
PWR_EnterSTOPMode(PWR_Regulator_LowPower,PWR_STOPEntry_WFI);[/mw_shl_code]
这时的实验现象是,按键中断可以唤醒系统,但不是从休眠处继续执行,而是进行了系统复位的操作,代码会从main()重新执行。这时进入停止模式时系统功耗在3mA左右,有一些板载硬件关不掉,功耗还可以接受。
stm32这里我也是新手,想请问的是上面第二次测试的做法是否可行,会不会对系统造成什么影响?
上述实验过程参考了原子哥的睡眠模式、停止模式、待机模式代码,顶原子哥
一周热门 更多>