嵌入式技术论坛
直播中

李莉

8年用户 1510经验值
私信 关注
[问答]

PM组件中断唤醒后进入中断函数其打印函数不起作用咋办?

PM组件,被按键中断唤醒后,立即进入按键中断函数,在按键中断函数中有LOGD和rt_kprintf函数,这两个打印函数在按键中断函数中无法输出到shell。
1.jpg
的确是进入了DEEP,按键能唤醒,按键唤醒中断函数中的LED亮灭正常,就是rt_kprintf输出到shell没有输出,而rt_pm_notify_set设置的进入和退出deepsleep的打印函数都正常输出。
1.jpg

另外还有个问题,进入DEEP唤醒后第一时间是执行按键中断函数,还是先执行RT_PM_EXIT_SLEEP回调函数,实测是先执行按键中断函数

回帖(8)

王波

2023-5-17 14:09:05
什么型号的单片机?
单片机进入 DEEP SLEEP(停止模式)后若由中断唤醒,先进入中断,退出中断服务程序后,接着执行 WFI 指令后的程序;若由事件唤醒,直接接着执行 WFE 后的程序。唤醒后,STM32 将使用 HSI RC 振荡器作为系统时钟。
因为唤醒后的系统时钟不是使用的 HSE 倍频后的时钟,对于 STM32F1xx 来说此时的系统时钟不是 72MHz,所以串口的波特率在唤醒后需要重新进行配置才能使串口正常输出,在 PM 组件中有函数 uart_console_reconfig() 实现了串口重新配置的功能。
1.jpg
举报

李莉

2023-5-17 14:09:50
是stm32L431的芯片,在中断中增加函数uart_console_reconfig(),不起作用
1.jpg
举报

王波

2023-5-17 14:10:03
唤醒之后应该第一步重新配置时钟,配置 HSE 作为系统的时钟源。你上面的代码虽然更新了串口的配置,但是此时的系统时钟在软件中获得的值是 HSE 的,但是唤醒后硬件上的系统时钟是 HSI,这两个值是不匹配的,而串口又与系统时钟有关所以不对。
举报

王波

2023-5-17 14:10:12
之前写的逻辑代码里面的逻辑如下:

#ifdef STOP_MODE_TEST   // stop 模式,使用外部中断唤醒
    led0_on();
    display_sysclock();     // 打印系统时钟,此时是 HSE 作为系统时钟
    enter_stop_mode();      // 进入 stop 模式
    SystemCoreClockUpdate();// 根据时钟寄存器的值更新 SystemCoreClock 变量
    MX_USART1_UART_Init();  // 因为串口使用的是HSE,停止模式唤醒后使用的是HSI,所以需要重新初始化串口
    printf("exit stop mode. line = %d\r\n", __LINE__);  // 唤醒后打印
    display_sysclock();     // 打印系统时钟,此时是 HSI 作为系统时钟
    SystemClock_Config();   // 重新配置HSE
    MX_USART1_UART_Init();  // 配置HSE后重新配置串口
    printf("\r\nsystem clock config\r\n");  // 配置时钟
    display_sysclock();     // 打印配置HSE后的系统时钟
    led0_off();
    HAL_Delay(1000);
#endif
举报

李莉

2023-5-17 14:10:20
总算搞定了,多谢了,就是时钟的问题,我在按键中断里面添加了从新初始化总时钟的代码 void SystemClock_Config(void);果然就正常了,今后的应用中的确需要在唤醒中断中立即将时钟调整过来,不然可能所有外设都可能不正常
1.jpg
举报

王波

2023-5-17 14:10:28
是的,因为外设大多挂载在 APB 总线上,而 APB 总线上的时钟也是由系统时钟分频得到的。
举报

李莉

2023-5-17 14:10:36
还有个问题想请教一下,按理来说stm32L4执行pm_release_all后,main函数中的循环rt_thread_mdelay(5000)会把main线程挂到定时器列表中,而根据PM组件的做法是会获取下次该执行的定时时间并且赋值给LPTIME,系统进入休眠状态(如果使能时间补偿,休眠之前会先启动低功耗定时器),LPTIME到期后会唤醒MAIN线程执行几下,但实际情况只有RTC和按键中断才可以把其唤醒。
1.jpg
2.jpg
还有这两个选项的作用是什么呢?

1.jpg
举报

CDCNKA

2023-5-17 14:13:12
退出唤醒,应该先初始化好时钟,如果直接去执行中断,确认下 全局屏蔽中断的操作是否失效引起的
举报

更多回帖

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