本帖最后由 knifeflying 于 2018-6-10 17:07 编辑
折腾了好长时间的LPUART,怎么还是不能成功呢。
我希望进入到stop2模式后,接收到任何一个字符,就唤醒,执行中断处理函数和callback函数,执行完之后,就再次进入stop2模式。但是在callback函数中,获得的字符总是错的。
应该怎样设置才正确呢?
我的代码,主函数中进入sotp模式之前:
- WakeUpSelection.WakeUpEvent = UART_WAKEUP_ON_READDATA_NONEMPTY;
- if (HAL_UARTEx_StopModeWakeUpSourceConfig(&hlpuart1, WakeUpSelection)!= HAL_OK)
- {
- Error_Handler();
- }
-
- /* Enable the LPUART Wake UP from STOP mode Interrupt */
- __HAL_UART_ENABLE_IT(&hlpuart1, UART_IT_WUF);
- /* enable MCU wake-up by LPUART */
- HAL_UARTEx_EnableStopMode(&hlpuart1);
-
- HAL_PWR_EnableSleepOnExit();
-
- /* enter STOP mode */
- HAL_PWREx_EnterSTOP2Mode(PWR_STOPENTRY_WFI);
复制代码
中断处理函数:
- void LPUART1_IRQHandler(void)
- {
- /* USER CODE BEGIN LPUART1_IRQn 0 */
-
- /* Check WUF flag value in ISR register */
- if(LL_LPUART_IsActiveFlag_WKUP(LPUART1) && LL_LPUART_IsEnabledIT_WKUP(LPUART1))
- {
- /* Configure LPUART1 transfer interrupts : */
- /* WUF flag clearing */
- LL_LPUART_ClearFlag_WKUP(LPUART1);
-
- /* Call function in charge of handling Character reception */
- LPUART_CharReception_Callback();
- }
- else
- {
- /* Call Error function */
- Error_Callback();
- }
复制代码
callback函数:
- void LPUART_CharReception_Callback(void)
- {
- /* Read Received character. RXNE flag is cleared by reading of RDR register */
- putchar(LL_LPUART_ReceiveData8(LPUART1));
- HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin);
- }
复制代码
|
【低功耗模式下使用UART唤醒Kinetis L系列】
【32位机如何用UART做低功耗模式转换】
【新手求助,如何通过UART使MCU进入低功耗模式】
如果LPUART的时钟没有的话,是不能接收数据的。
因为一般来说UART的接收管脚,同时可以作为中断输入来唤醒MCU的,那么只需要检测RX管脚上的一个下降沿即可认为是有唤醒信号。
评分
查看全部评分
评分
查看全部评分
https://www.stmcu.org.cn/module/forum/forum.php?mod=viewthread&tid=611266&highlight=lpuart
(出处: 论坛-意法半导体STM32/STM8技术社区)