查看: 5336|回复: 5

【低功耗】SLEEP唤醒后不能重复进入

[复制链接]

2

主题

8

帖子

76

积分

中级工程师

Rank: 2

积分
76
发表于 2022-5-27 11:17:33 | 显示全部楼层 |阅读模式
使用官方的WKUP例程,进入主循环后只有一个sleep()函数,上电后功耗是正常睡眠功耗,然后通过按键唤醒后能看到功耗上去了,但是没降回来,按理说主循环会重复休眠啊!

主循环:
  1.     while(1)
  2.     {
  3.         Sleep();   
  4.     }
复制代码




sleep函数:

  1. void Sleep(void)
  2. {
  3.     FL_RCC_RCMF_Disable();               //关闭RCMF
  4.     FL_RMU_PDR_Enable(RMU);              //打开PDR
  5.     FL_RMU_BORPowerDown_Disable(RMU);    //关闭BOR 2uA

  6.     /*使用ADC时ADCMonitor功能以及Vref需同时开始,同时关闭*/
  7.     FL_VREF_Disable(VREF);               //关闭VREF1p2
  8.     FL_SVD_DisableADCMonitor(SVD);       //关闭ADC电源检测
  9.     FL_ADC_Disable(ADC);                 //关闭ADC使能

  10.     FL_PMU_SetLowPowerMode(PMU, FL_PMU_POWER_MODE_SLEEP_OR_DEEPSLEEP);
  11.     __WFI();
  12. }
复制代码
初始化函数:
  1. void MF_PMU_Init(void)
  2. {

  3.     /*IO CONFIG*/
  4.     FL_PMU_SleepInitTypeDef    defaultInitStruct;

  5.     defaultInitStruct.deepSleep = FL_PMU_SLEEP_MODE_DEEP;
  6.     defaultInitStruct.LDOLowPowerMode = FL_PMU_LDO_LPM_DISABLE;
  7.     defaultInitStruct.wakeupFrequency = FL_PMU_RCHF_WAKEUP_FREQ_8MHZ;
  8.     defaultInitStruct.wakeupDelay = FL_PMU_WAKEUP_DELAY_2US;
  9.     defaultInitStruct.coreVoltageScaling = FL_DISABLE;

  10.     FL_PMU_Sleep_Init(PMU,&defaultInitStruct );

  11.    
  12. }

  13. void NMI_Handler(void)
  14. {
  15.     //NWKUP默认连接到了cpu的NMI不可屏蔽中断,不受NVIC控制,不受全局中断使能控制,唤醒后必然进NMI中断
  16.     if(FL_SET == FL_PMU_IsActiveFlag_WakeupPIN(PMU, FL_PMU_WKUP7PIN))
  17.     {
  18.         FL_PMU_ClearFlag_WakeupPIN(PMU, FL_PMU_WKUP7PIN);
  19.     }
  20.         FL_PMU_ClearFlag_WakeupPIN(PMU, FL_PMU_WKUP7PIN);
  21. }


  22. // 外部引脚中断初始化
  23. void WKUP_init(void)
  24. {
  25.     FL_GPIO_InitTypeDef GPIO_InitStruct = {0};

  26.     //引脚边沿触发选择
  27.     FL_RCC_EnableEXTIOnSleep();//休眠使能外部中断采样
  28.     FL_RCC_EnableGroup1OperationClock(FL_RCC_GROUP1_OPCLK_EXTI);//EXTI工作时钟使能

  29.     //用到的GPIO引脚    设为输入
  30.     GPIO_InitStruct.pin        = FL_GPIO_PIN_6;
  31.     GPIO_InitStruct.mode       = FL_GPIO_MODE_INPUT;
  32.     GPIO_InitStruct.outputType = FL_GPIO_OUTPUT_PUSHPULL;
  33.     GPIO_InitStruct.pull       = FL_DISABLE;
  34.     GPIO_InitStruct.remapPin   = FL_DISABLE;
  35.     FL_GPIO_Init(GPIOD, &GPIO_InitStruct);


  36.     FL_GPIO_SetWakeupInterruptEntry(GPIO, FL_GPIO_WAKEUP_INT_ENTRY_NMI);//NMI中断入口
  37.     FL_GPIO_SetWakeupEdge(GPIO, FL_GPIO_WAKEUP_7, FL_GPIO_WAKEUP_TRIGGER_FALLING);//下降沿唤醒
  38.     FL_GPIO_EnableWakeup(GPIO, FL_GPIO_WAKEUP_7);//使能NWKUP功能
  39. }
复制代码




回复

使用道具 举报

155

主题

847

帖子

4681

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
4681
发表于 2022-5-30 14:00:58 | 显示全部楼层
我使用例程没有问题啊,改成你的PD6 引脚也是对的。
感觉是其他地方有问题吧,或者硬件问题,或者你没用最新的例程,可能驱动有问题
回复

使用道具 举报

2

主题

8

帖子

76

积分

中级工程师

Rank: 2

积分
76
 楼主| 发表于 2022-6-5 17:11:48 | 显示全部楼层
已查到原因
是因为使用了CH340N连接UART5,去掉CH340N就好了,似乎是通信脚有电流倒灌导致供电不稳
回复

使用道具 举报

2

主题

8

帖子

76

积分

中级工程师

Rank: 2

积分
76
 楼主| 发表于 2022-6-5 17:13:09 | 显示全部楼层
已查到原因,似乎是CH340N电流倒灌导致供电异常,具体也不清楚,反正拿掉340就好了
回复

使用道具 举报

6

主题

25

帖子

210

积分

高级工程师

Rank: 3Rank: 3

积分
210
发表于 2022-8-26 09:32:13 | 显示全部楼层
yukezhe2008 发表于 2022-6-5 17:13
已查到原因,似乎是CH340N电流倒灌导致供电异常,具体也不清楚,反正拿掉340就好了 ...

请问一下你用CH340N,是因为RXTX脚有电流导管导致的吗,还是因为接了VCC,
回复

使用道具 举报

155

主题

847

帖子

4681

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
4681
发表于 2022-8-29 08:37:52 | 显示全部楼层
sigerio 发表于 2022-8-26 09:32
请问一下你用CH340N,是因为RXTX脚有电流导管导致的吗,还是因为接了VCC,

原理就是 引脚不要有压降。
1、 内外电压要一致,不能引脚输出低,外部接vdd。或者引脚配置成高阻态(输入,输入不使能)也可以,不会有电流经过。
2、外部电压不能超过vdd,超过肯定灌入电流。
回复

使用道具 举报

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

本版积分规则

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