你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

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

[复制链接]
岬淢箫声 提问时间:2023-2-15 14:29 / 未解决
我需要实现的功能:干电池提供电源持续使用5年以上。外部接口只有3个,2个GPIO和1个USART。2个GPIO用于外部中断,USART用于和上位机通信。项目使用STM32CubeMX生成代码,模板选择的LL,干电池电压为3V,容量为1000mAh。STM32L010K8T6上电初始化,重要代码如下:
  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?谢谢!
收藏 评论6 发布时间:2023-2-15 14:29

举报

6个回答
xmshao 回答时间:2023-2-15 15:35:51
泛泛来讲,STM32L0芯片的UART2是具备唤醒STOP模式的功能的,具体来说还有看具体的料号,在参考手册的 USART implementation 的一个表格里有描述。要不你换UART1试试,它是一定支持STOP唤醒的。
岬淢箫声 回答时间:2023-2-15 15:41:02

xmshao 发表于 2023-2-15 15:35
泛泛来讲,STM32L0芯片的UART2是具备唤醒STOP模式的功能的,具体来说还有看具体的料号,在参考手册的 USART ...

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

xmshao 回答时间:2023-2-15 17:15:51
嗯,补充下。


我刚才看的参考手册还不是针对32L010的,STM32L010对应的参考手册是 RM0451.


刚看了下,STM32L010x8的 UART2 是 支持STOP唤醒的。


你现在使用LL库组织的代码,此刻没法一眼看出问题出在哪里。


可能要找相应的开发板做些调试验证后才知道。


你看看是否少了类似这样的函数:


void LL_EXTI_EnableEvent_0_31(uint32_t ExtiLine);  这里UART 事件映射的中断线为26.



先基于手册做好确认,然后自己慢慢调试。
xmshao 回答时间:2023-2-15 17:22:13

岬淢箫声 发表于 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.

先基于手册做好确认,然后自己慢慢调试。

butterflyspring 回答时间:2023-2-16 10:15:35

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

butterflyspring 回答时间:2023-2-16 11:30:38

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

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版