|
以下是教程的例子:
#define configPRE_SLEEP_PROCESSING(x) OS_PreSleepProcessing(x)
#define configPOST_SLEEP_PROCESSING(x) OS_PostSleepProcessing(x)
void OS_PreSleepProcessing(uint32_t vParameters)
{
(void)vParameters;
/* 用户可以考虑在此处加入关闭外设时钟来进一步降低功耗 */
vParameters = 0;
PWR_EnterSTOPMode(PWR_Regulator_LowPower, PWR_STOPEntry_WFE);
}
void OS_PostSleepProcessing(uint32_t vParameters)
{
/* 如果前面关闭了外设时钟,需要在这里恢复 */
/*
1、当一个中断或唤醒事件导致退出停止模式时,HSI RC振荡器被选为系统时钟。
2、退出低功耗的停机模式后,需要重新配置使用HSE。
*/
RCC_HSEConfig(RCC_HSE_ON);
while (RCC_GetFlagStatus(RCC_FLAG_HSERDY) == RESET){}
RCC_PLLCmd(ENABLE);
while (RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET){}
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
while (RCC_GetSYSCLKSource() != 0x08){}
}
以下为port.c中的代码:
xModifiableIdleTime = xExpectedIdleTime;
configPRE_SLEEP_PROCESSING( xModifiableIdleTime );
if( xModifiableIdleTime > 0 )
{
__dsb( portSY_FULL_READ_WRITE );
__wfi();
__isb( portSY_FULL_READ_WRITE );
}
configPOST_SLEEP_PROCESSING( xExpectedIdleTime );
个人认为代码的意思应当是修改 xModifiableIdleTime 为 0,然后再判断是否大于0才会执行下面的__wfi()代码。
但 xModifiableIdleTime 以这种方式传入之后根本没有办法修改为0,它的值始终和xExpectedIdleTime一样。这样下面的__wfi()永远都会被执行到。
难道代码不应该如下这样调用吗?
configPRE_SLEEP_PROCESSING( &xModifiableIdleTime );
void OS_PreSleepProcessing(uint32_t *vParameters)
{
(void)vParameters;
/* 用户可以考虑在此处加入关闭外设时钟来进一步降低功耗 */
*vParameters = 0;
PWR_EnterSTOPMode(PWR_Regulator_LowPower, PWR_STOPEntry_WFE);
}
或者这样:
#define configPRE_SLEEP_PROCESSING(x) do{OS_PreSleepProcessing(x); x=0;}while(0)
void OS_PreSleepProcessing(uint32_t vParameters)
{
(void)vParameters;
/* 用户可以考虑在此处加入关闭外设时钟来进一步降低功耗 */
PWR_EnterSTOPMode(PWR_Regulator_LowPower, PWR_STOPEntry_WFE);
}
感觉教程讲的不是很清楚,FreeRTOS官网的资料和教程差不多。不知道我这样理解对不对,还望答复,十分感谢!
另:
1、为什么用PWR_STOPEntry_WFE,而不是PWR_STOPEntry_WFI?
2、如何退出停机模式?使用外部中断?
只找到以下文章,由于没有账号,无法看全,感觉他也没有最终实现。
http://www.amobbs.com/thread-5633496-1-1.html |
|