RT-Thread论坛
直播中

宜家

9年用户 1209经验值
私信 关注
[问答]

休眠后串口还在打印数据怎么解决?

在使用RTthread的PM模块时,想控制STM32f103进入最浅的睡眠模式,于是使用PM的IDLE状态,增加了以下代码,然后发现程序不停的在串口打印第21行的内容,debug后发现没有进入其他的轮询任务,这是否意味着休眠?还是说一直在尝试唤醒然后又进入了睡眠?有什么解决方法吗?(休眠不应该是什么都不执行了吗?串口理论上应该没法打印才对)

  • void PM_DisableSystick(void)
  • {
  •     /* Disable SysTick */
  •     HAL_SuspendTick();
  •     // SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;
  • }

  • void PM_EnableSystick(void)
  • {
  •     /* Enable SysTick */
  •     // SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk;
  •     HAL_ResumeTick();
  • }
  • #endif

  • void pm_sleep_idle(struct rt_pm *pm)
  • {
  •     LOG_D("sleep light mode start");

  •     control_40v_status(GPIO_CLOSE);
  •     control_3_3v_status(GPIO_CLOSE);
  •     control_led_status(GPIO_CLOSE);

  •     set_40v_gpio_mode(GPIO_INPUT_MODE);
  •     set_3_3v_gpio_mode(GPIO_INPUT_MODE);
  •     set_led_gpio_mode(GPIO_INPUT_MODE);

  •     set_co1_gpio_mode(GPIO_INPUT_MODE);
  •     set_co2_gpio_mode(GPIO_INPUT_MODE);
  •     set_co3_gpio_mode(GPIO_INPUT_MODE);
  •     set_co4_gpio_mode(GPIO_INPUT_MODE);
  •     set_co5_gpio_mode(GPIO_INPUT_MODE);
  •     set_co6_gpio_mode(GPIO_INPUT_MODE);

  •     HAL_CAN_RequestSleep(&hcan);  //set can bus into leep mode

  •     PM_DisableSystick();
  •     HAL_PWR_EnterSLEEPMode(PWR_MAINREGULATOR_ON, PWR_SLEEPENTRY_WFI);
  • }

  • static void sleep(struct rt_pm *pm, uint8_t mode)
  • {
  •     switch (mode)
  •     {
  •     case PM_SLEEP_MODE_NONE:
  •         break;

  •     case PM_SLEEP_MODE_IDLE:
  •         pm_sleep_idle(pm);
  •         break;

  •     case PM_SLEEP_MODE_LIGHT:
  •         break;

  •     case PM_SLEEP_MODE_DEEP:
  •         break;

  •     case PM_SLEEP_MODE_STANDBY:
  •         break;

  •     case PM_SLEEP_MODE_SHUTDOWN:
  •         break;

  •     default:
  •         RT_ASSERT(0);
  •         break;
  •     }
  • }

  • #ifdef PM_IIC_CALLBACK
  • /* iic module rt_device_pm_ops callback */
  • int pm_i2c_suspend(const struct rt_device *device, rt_uint8_t mode)
  • {
  •     LOG_W("pm_i2c_suspend works");

  •     return RT_EOK;
  • }

  • void pm_i2c_resume(const struct rt_device *device, rt_uint8_t mode)
  • {
  •     LOG_W("pm_i2c_resume works");

  •     return ;
  • }

  • static const struct rt_device_pm_ops _i2c_pm_ops =
  • {
  •     pm_i2c_suspend,
  •     pm_i2c_resume,
  •     RT_NULL
  • };
  • #endif

  • static const struct rt_pm_ops _ops =
  •     {
  •         sleep,
  • #ifdef PM_USING_RUN_AND_TICKLESS
  •         run,
  •         pm_timer_start,
  •         pm_timer_stop,
  •         pm_timer_get_tick
  • #else
  •         RT_NULL,
  •         RT_NULL,
  •         RT_NULL,
  •         RT_NULL
  • #endif
  •     };

  • int drv_pm_hw_init(void)
  • {
  •     rt_uint8_t timer_mask = 0;

  • #ifdef PM_USING_RUN_AND_TICKLESS
  •     /* initialize timer mask */
  •     timer_mask = 1UL << PM_SLEEP_MODE_NONE;
  • #endif

  • #ifdef PM_IIC_CALLBACK
  •     /* regisiter device pm module */
  •     rt_pm_device_register("i2c1", &_i2c_pm_ops);
  • #endif

  •     /* initialize system pm module */
  •     rt_system_pm_init(&_ops, timer_mask, RT_NULL);

  •     LOG_I("PM init successful");

  •     return 0;
  • }
  • INIT_BOARD_EXPORT(drv_pm_hw_init);





更多回帖

发帖
×
20
完善资料,
赚取积分