久芯网

请问如何解决STM32L010K8T6用USART2串口唤醒失败?

avatar 岬淢箫声 提问时间: 2023-07-08 12:04:56 / 未解决
我需要实现的功能:干电池提供电源持续使用5年以上。外部接口只有3个,2个GPIO和1个USART。2个GPIO用于外部中断,USART用于和上位机通信。项目使用STM32CubeMX生成代码,模板选择的LL,干电池电压为3V,容量为1000mAhSTM32L010K8T6上电初始化,重要代码如下:
  1. LL_PWR_EnterLowPowerRunMode();
  2. LL_PWR_SetRegulVoltageScaling(LL_PWR_REGU_VOLTAGE_SCALE3);
复制代码

初始化完成立即进入STOP模式,代码如下:
  1.     uart2_prepare_stop();
  2.     //LL_mDelay(1000);
  3.     PWR->CR &= ~PWR_CR_PDDS;
  4.     PWR->CR |= PWR_CR_CWUF;
  5.     LL_mDelay(1);
  6.     SCB->SCR |= SCB_SCR_SLEEPDEEP_Msk;
  7.     __wfi();
  8.     LL_USART_DisableInStopMode(USART2);
复制代码
函数uart2_prepare_stop代码如下:

  1.     LL_USART_EnableIT_RXNE(USART2);
  2.     LL_USART_EnableClockInStopMode(USART2);
  3.     LL_USART_EnableIT_WKUP(USART2);
  4.     LL_USART_EnableInStopMode(USART2);
复制代码
串口初始化代码如下:
  1.   USART_InitStruct.BaudRate = 9600;
  2.   USART_InitStruct.DataWidth = LL_USART_DATAWIDTH_8B;
  3.   USART_InitStruct.StopBits = LL_USART_STOPBITS_1;
  4.   USART_InitStruct.Parity = LL_USART_PARITY_NONE;
  5.   USART_InitStruct.TransferDirection = LL_USART_DIRECTION_TX_RX;
  6.   USART_InitStruct.HardwareFlowControl = LL_USART_HWCONTROL_NONE;
  7.   USART_InitStruct.OverSampling = LL_USART_OVERSAMPLING_16;
  8.   LL_USART_Init(USART2, &USART_InitStruct);
  9.   LL_USART_ConfigAsyncMode(USART2);
  10.   LL_USART_SetWKUPType(USART2, LL_USART_WAKEUP_ON_RXNE);
  11.   LL_USART_Enable(USART2);
  12.     uart2_prepare_stop();
复制代码
测试结果,2个外部中断可正常唤醒,USART2无法唤醒。上述代码都是根据手册说明打开唤醒相关的设置。


请问上述代码是存在寄存器设置错误?如何让USART2在产生RXNE中断信号时唤醒MCU?谢谢!

如需获得 STM32L010K8T6 等器件的更多信息,请点击链接或 点击此处 联系在线客服!

6个回答
  • avatar xmshao
    回答时间: 2023-07-08 12:30:23

    泛泛来讲,STM32L0芯片的UART2是具备唤醒STOP模式的功能的,具体来说还有看具体的料号,在参考手册的 USART implementation 的一个表格里有描述。要不你换UART1试试,它是一定支持STOP唤醒的。

  • avatar 岬淢箫声
    回答时间: 2023-07-08 12:54:44
    xmshao 发表于 2023-2-15 15:35
    泛泛来讲,STM32L0芯片的UART2是具备唤醒STOP模式的功能的,具体来说还有看具体的料号,在参考手册的 USART ...

    K8T6这款32PIN,没有引出LPUSART1引脚。

  • avatar xmshao
    回答时间: 2023-07-08 13:12:29

    嗯,补充下。 我刚才看的参考手册还不是针对32L010的,STM32L010对应的参考手册是 RM0451. 刚看了下,STM32L010x8的 UART2 是 支持STOP唤醒的。 你现在使用LL库组织的代码,此刻没法一眼看出问题出在哪里。 可能要找相应的开发板做些调试验证后才知道。 你看看是否少了类似这样的函数: void LL_EXTI_EnableEvent_0_31(uint32_t ExtiLine); 这里UART 事件映射的中断线为26. 先基于手册做好确认,然后自己慢慢调试。

  • avatar xmshao
    回答时间: 2023-07-08 13:30:36
    岬淢箫声 发表于 2023-2-15 15:41
    K8T6这款32PIN,没有引出LPUSART1引脚。

    嗯,补充下。 我刚才看的参考手册还不是针对32L010的,STM32L010对应的参考手册是 RM0451. 刚看了下,STM32L010x8的 UART2 是 支持STOP唤醒的。 你现在使用LL库组织的代码,此刻没法一眼看出问题出在哪里。 可能要找相应的开发板做些调试验证后才知道。 你看看是否少了类似这样的函数: void LL_EXTI_EnableEvent_0_31(uint32_t ExtiLine); 这里UART 事件映射的中断线为26. 先基于手册做好确认,然后自己慢慢调试。

  • avatar butterflyspring
    回答时间: 2023-07-08 14:00:16

    可以先测试一下,不进入低功耗,看看串口2能否工作。然后再缩小范围检查。

  • avatar butterflyspring
    回答时间: 2023-07-08 14:25:32

    补充一下,要实现低功耗下UART2的唤醒,需要配置UART2的时钟为HSI或者LSE。系统默认的PCLK1的时钟是实现不了。建议使用LSE为UART2 详细说明请参考手册中相关章节 21.5.17 Wakeup from Stop mode using USART

会员中心 微信客服
客服
回到顶部