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

请问如何解决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管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版