在使用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);