查看: 3571|回复: 2

【SVD】低功耗模式使用SVD手动查询问题

[复制链接]

7

主题

20

帖子

267

积分

高级工程师

Rank: 3Rank: 3

积分
267
发表于 2022-4-1 20:51:08 | 显示全部楼层 |阅读模式
请问DEEPSLEEP模式下怎样配置SVD手动查询,没有中断?
现象:休眠前,SVD查询方法正常使用,但是休眠唤醒后,SVD查询方法就无效了。我想可能是休眠后SVD配置失效了,于是每次唤醒后重新配置启用SVD,但是依然不起作用,何解?


上代码
SVD配置如下:

  1. /*
  2. *   @brief  SVD初始化
  3. *   @note   none
  4. **/
  5. void SVD_Init(void)
  6. {

  7.     /*IO CONFIG*/
  8.     FL_SVD_InitTypeDef    defaultInitStruct;

  9.     defaultInitStruct.referenceVoltage = FL_SVD_REFERENCE_1P0V;
  10.     defaultInitStruct.warningThreshold = FL_SVD_WARNING_THRESHOLD_GROUP12;
  11.     defaultInitStruct.digitalFilter = FL_DISABLE;
  12.     defaultInitStruct.SVSChannel = FL_DISABLE;

  13.     FL_SVD_Init(SVD,&defaultInitStruct );
  14.    
  15.     //FL_SVD_SetWorkMode(SVD,FL_SVD_WORK_MODE_CONTINUOUS);
  16.    
  17.     FL_SVD_Enable(SVD);
  18.    
  19. }

  20. /*
  21. *   @brief  SVD查询
  22. *   @note   手动查询,不触发中断。监测到低于阀值,点亮LED1,否则熄灭LED1
  23. **/
  24. void SVD_Check(void)
  25. {
  26.         SVD_Init();

  27.         MyPrintf("check...\n");
  28.         
  29.         if(FL_RESET == FL_SVD_GetLatchedPowerStatus(SVD))// SVD内部滤波后的电压检测标志,仅在使能数字滤波时有意义;软件避免写此寄存器。
  30.         {
  31.             MyPrintf("recheck...\n");
  32.             FL_DelayMs(20);//去抖
  33.             
  34.             if(FL_RESET == FL_SVD_GetLatchedPowerStatus(SVD))
  35.             {
  36.                 LED1_ON();
  37.                 return;
  38.             }
  39.         }
  40.         
  41.         MyPrintf("normal...\n");
  42.         LED1_OFF();
  43.         
  44. }
复制代码

PMU配置如下
  1. /*
  2. *   @brief  休眠初始化设置
  3. *   @note   none
  4. **/
  5. void PMU_Init(void)
  6. {
  7.     /* PMU初始化 */
  8.     FL_PMU_SleepInitTypeDef PMU_SleepInitStruct;
  9.    
  10.     PMU_SleepInitStruct.deepSleep = FL_PMU_SLEEP_MODE_DEEP;// 睡眠模式配置 ,normal&deep表示 常规 Sleep 和 deep sleep
  11.     PMU_SleepInitStruct.LDOLowPowerMode = FL_PMU_LDO_LPM_DISABLE;// 芯片LDO是否进入低功耗,true or false
  12.     PMU_SleepInitStruct.wakeupFrequency = FL_PMU_RCHF_WAKEUP_FREQ_8MHZ;// 唤醒后的系统频率,仅对RCHF
  13.     PMU_SleepInitStruct.wakeupDelay = FL_PMU_WAKEUP_DELAY_2US;// 额外唤醒延迟
  14.     PMU_SleepInitStruct.coreVoltageScaling = FL_DISABLE;// 低功耗模式下内核电压降低与否,true or false
  15.    
  16.     FL_PMU_Sleep_Init(PMU,&PMU_SleepInitStruct); // 初始化
  17. }

  18. /*
  19. *   @brief  开始休眠
  20. *   @note   进入休眠的方法
  21. **/
  22. void PMU_Sleep(void)
  23. {
  24.     /* 关闭核心部件  */
  25.     FL_RCC_RCMF_Disable(); //关闭RCMF
  26.     FL_RMU_PDR_Enable(RMU); //关闭PDR
  27.     FL_RMU_BORPowerDown_Disable(RMU); //关闭BOR,2ua
  28.    
  29.     /* 关闭其他外设 */
  30.     FL_VREF_Disable(VREF); //关闭VREF1p2
  31.     //FL_SVD_DisableADCMonitor(SVD); //关闭ADC电源检测
  32.     FL_ADC_Disable(ADC); //关闭ADC使能
  33.    
  34.     /* 进入低功耗 */
  35.     FL_PMU_SetLowPowerMode(PMU,FL_PMU_POWER_MODE_SLEEP_OR_DEEPSLEEP); //选择睡眠模式
  36.     __WFI(); //开始休眠
  37. }

复制代码




回复

使用道具 举报

1

主题

4

帖子

165

积分

中级工程师

Rank: 2

积分
165
发表于 2022-4-2 21:02:04 | 显示全部楼层
我也遇到了,好像与PMU_Sleep中的关闭其他外设的三句代码有关,把下面三句都屏蔽掉试试。


    /* 关闭其他外设 */
    FL_VREF_Disable(VREF); //关闭VREF1p2
    FL_SVD_DisableADCMonitor(SVD); //关闭ADC电源检测
    FL_ADC_Disable(ADC); //关闭ADC使能
回复

使用道具 举报

7

主题

20

帖子

267

积分

高级工程师

Rank: 3Rank: 3

积分
267
 楼主| 发表于 2022-4-6 11:47:19 | 显示全部楼层
已验证,的确是跟这三行代码有关,多谢指导
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表