【SVD】低功耗模式使用SVD手动查询问题
请问DEEPSLEEP模式下怎样配置SVD手动查询,没有中断?现象:休眠前,SVD查询方法正常使用,但是休眠唤醒后,SVD查询方法就无效了。我想可能是休眠后SVD配置失效了,于是每次唤醒后重新配置启用SVD,但是依然不起作用,何解?
上代码
SVD配置如下:
/*
* @briefSVD初始化
* @note none
**/
void SVD_Init(void)
{
/*IO CONFIG*/
FL_SVD_InitTypeDef defaultInitStruct;
defaultInitStruct.referenceVoltage = FL_SVD_REFERENCE_1P0V;
defaultInitStruct.warningThreshold = FL_SVD_WARNING_THRESHOLD_GROUP12;
defaultInitStruct.digitalFilter = FL_DISABLE;
defaultInitStruct.SVSChannel = FL_DISABLE;
FL_SVD_Init(SVD,&defaultInitStruct );
//FL_SVD_SetWorkMode(SVD,FL_SVD_WORK_MODE_CONTINUOUS);
FL_SVD_Enable(SVD);
}
/*
* @briefSVD查询
* @note 手动查询,不触发中断。监测到低于阀值,点亮LED1,否则熄灭LED1
**/
void SVD_Check(void)
{
SVD_Init();
MyPrintf("check...\n");
if(FL_RESET == FL_SVD_GetLatchedPowerStatus(SVD))// SVD内部滤波后的电压检测标志,仅在使能数字滤波时有意义;软件避免写此寄存器。
{
MyPrintf("recheck...\n");
FL_DelayMs(20);//去抖
if(FL_RESET == FL_SVD_GetLatchedPowerStatus(SVD))
{
LED1_ON();
return;
}
}
MyPrintf("normal...\n");
LED1_OFF();
}
PMU配置如下
/*
* @brief休眠初始化设置
* @note none
**/
void PMU_Init(void)
{
/* PMU初始化 */
FL_PMU_SleepInitTypeDef PMU_SleepInitStruct;
PMU_SleepInitStruct.deepSleep = FL_PMU_SLEEP_MODE_DEEP;// 睡眠模式配置 ,normal&deep表示 常规 Sleep 和 deep sleep
PMU_SleepInitStruct.LDOLowPowerMode = FL_PMU_LDO_LPM_DISABLE;// 芯片LDO是否进入低功耗,true or false
PMU_SleepInitStruct.wakeupFrequency = FL_PMU_RCHF_WAKEUP_FREQ_8MHZ;// 唤醒后的系统频率,仅对RCHF
PMU_SleepInitStruct.wakeupDelay = FL_PMU_WAKEUP_DELAY_2US;// 额外唤醒延迟
PMU_SleepInitStruct.coreVoltageScaling = FL_DISABLE;// 低功耗模式下内核电压降低与否,true or false
FL_PMU_Sleep_Init(PMU,&PMU_SleepInitStruct); // 初始化
}
/*
* @brief开始休眠
* @note 进入休眠的方法
**/
void PMU_Sleep(void)
{
/* 关闭核心部件*/
FL_RCC_RCMF_Disable(); //关闭RCMF
FL_RMU_PDR_Enable(RMU); //关闭PDR
FL_RMU_BORPowerDown_Disable(RMU); //关闭BOR,2ua
/* 关闭其他外设 */
FL_VREF_Disable(VREF); //关闭VREF1p2
//FL_SVD_DisableADCMonitor(SVD); //关闭ADC电源检测
FL_ADC_Disable(ADC); //关闭ADC使能
/* 进入低功耗 */
FL_PMU_SetLowPowerMode(PMU,FL_PMU_POWER_MODE_SLEEP_OR_DEEPSLEEP); //选择睡眠模式
__WFI(); //开始休眠
}
我也遇到了,好像与PMU_Sleep中的关闭其他外设的三句代码有关,把下面三句都屏蔽掉试试。
/* 关闭其他外设 */
FL_VREF_Disable(VREF); //关闭VREF1p2
FL_SVD_DisableADCMonitor(SVD); //关闭ADC电源检测
FL_ADC_Disable(ADC); //关闭ADC使能 已验证,的确是跟这三行代码有关,多谢指导
页:
[1]