如何使用LPUART从STOP2唤醒STM32U5
如何使用LPUART从STOP2唤醒STM32U5?本文将向您展示如何使用LSE或HSI时钟源提供的LPUART1从Stop2低功率模式唤醒STM32U5 MCU。到本文结束时,您将知道要。。。
如何使用LPUART从STOP2唤醒STM32U5?
本文将向您展示如何使用LSE或HSI时钟源提供的LPUART1从Stop2低功率模式唤醒STM32U5 MCU。在本文结束时,您将知道正确设置LPUART、RCC和PWR外围寄存器所需的步骤,以便在低功率模式下保持LPUART1的运行,并准备在接收任何数据时唤醒MCU。
对于本教程,请使用NUCLEO-U575ZI-Q和STM32U575ZIT6Q 将使用,但对于任何STM32U5,步骤都应该相同,只需进行非常小的调整。
要开始,请打开STM32CubeIDE,使用您正在使用的微控制器创建一个新项目,并为其命名。
1.点击文件->新建->STM32项目

2.在STM32目标选择器中,为您找到微控制器,您可以键入零件号以便于导航,然后单击下一个在我们的案例中,将使用STM32U575ZIT6Q。

3.为您的项目命名(避免使用特殊字符和空格),然后单击完成以下为:

现在,有关项目创建的所有步骤都已完成。在打开的MCU配置工具中,让我们设置LPUART1、GPIO和整体RCC设置。
4.在列表中,查找连接->LPUART1以下为:

5.将LPUART模式更改为异步的使用下拉列表:

6.外围设备设置可以保留为默认设置,但您可以根据应用程序的需要自由更改(只需确保选择与时钟设置选择兼容的波特率,有关更多详细信息,请参阅MCU参考手册)。

7.我们应该使LPUART1全局中断在NVIC公司。为此,请打开系统核心->NVCI,然后启用相应的中断:

8.现在,配置第7页像GPIO_输出(此步骤是可选的,因为PG7与Nucleo板上的LED相连)。我们将在代码中使用名称LED_BLUE作为与GPIO相关的宏:

9.在中选择LPUART1时钟源时钟配置选项卡。您只能选择LSE、HSI或MSIK源,因为只有这些源才能保持LPUART在Stop 2模式下工作。在本例中,您可以选择HSI或LSE(请注意,无论何时使用LSE作为时钟源,LPUART波特率上限均为9600)。

9.1可选:如果您计划使用LSE,请不要忘记在系统核心->碾压混凝土选择晶体/陶瓷谐振器在低速时钟(LSE)下拉列表中设置:

10.现在,所有设置都完成了。您可以生成代码,点击设备配置工具代码生成,或使用Alt+k组合键它的快捷方式。

11.所有代码更改将在主要.C文件,所以在ProjectExplorer选项卡的项目树中打开它,接下来的步骤将为实现提供必要的代码。固件实现中最重要的主题将在下一个文本主题中进行解释。打开主.c文件并包含标准时间一些资源将被使用的图书馆。
/*私有包含-----------------------------------------------------------*/*用户代码开始包含*/#包含“stdio.h”/*用户代码结束包含*/12.添加以下定义,如果使用LSE作为LPUART时钟源,则可以取消注释此行:
/*私有定义-----------------------------------------------------------*//*用户代码开始PD*//#定义USE_LPUART_LSE 0x55/*用户代码结束PD*/13.声明这些全局变量,这些全局变量将用于缓冲传入数据并对其进行标记:
/*用户代码开始PV*/uint8_t u8pData[2];uint8_t u8U艺术RxFlag;/*用户代码端PV*/14.创建功能原型:
/*用户代码开始PFP*/void进入停止模式(void);/*用户代码端PFP*/15.添加以下代码以重定向输出函数LPUART1的内容(有关此实现的更多详细信息,请参阅本文最后的参考链接中显示的相关文章):
/*专用用户代码-----------------------------------------------------------*//*用户代码开始0*/int __io_putchar(int ch){HAL_UART_Transmit(&hlpuart1,(uint8_t*)&ch,11000);返回ch;}/*用户编码结束0*/16.在外围设备初始化之后,添加以下代码:
/*用户代码开始2*/#ifndef USE_LPUART_LSE/*指定HSI作为从停止模式唤醒后使用的时钟源*/__HAL_RCC_WAKEUPSTOP_CLK_CONFIG(RCC_stop_WAKEUPCLOCK_HSI)__HAL_RCC_KERWAKEUPSTOP_CLK_CONFIG(RCC_STOP_KERWAKEUPCLOCK_HSI)#endif printf(“LPUART演示WFI\r\n”);printf(“按'p'以低功率输入\r\n”);HAL_UART_Receive_IT(&hlpuart1,u8pData,1);/*用户代码端2*/17.将以下代码添加到while无限循环中:
/*用户代码BEGIN 3*/HAL_GPIO_WritePin(LED_BLUE_GPIO_Port、LED_BLUE_Pin、GPIO_Pin_RESET);printf(“LED熄灭\r\n”);HAL_延迟(200);HAL_GPIO_WritePin(LED_BLUE_GPIO_Port、LED_BLUE_Pin、GPIO_Pin_SET);printf(“LED亮起\r\n”);HAL_延迟(200);if(u8UartRxFlag){if(u9pData[0]=='p'){EnterStopMode();}else{printf(“按'p'以低功率输入\r\n”);}u8UrtRxFlag=0;}/*用户代码端3*/
18.最后添加Receive Complete Callback函数和自定义函数以进入STOP2模式:
/*用户代码BEGIN 4*/void HAL_UART_RxCpltCallback(UART_HandleTypeDef*huart){u8UartRxFlag=1;HAL_UART_Receive_IT(&hlpuart1,u8pData,1);}void EnterStopMode(void){/*确保LPUART传输未在进行*/while(__HAL_UART_GET_FLAG(&hlpuart1,USART_ISR_BUSY)==SET);/*确保LPUART准备好接收*/while)=重置);/*在自主模式下启用LPUART时钟*/__HAL_RCC_LPUART1_CLKAM_Enable();/*在停止模式下启用LPUART*/HAL_UARTEx_EnableStopMode(&hlpuart1)#ifndef USE_LPUART_LSE/*在STOP模式下启用HSI时钟源*/__HAL_RCC_HSISTOP_Enable()#endif/*挂起SysTick*/HAL_SuspendTick();/*将系统输入STOP2模式*/HAL_PWREx_EnterSTOP2Mode(PWR_STOPENTRY_WFI);/*检查系统是否已从停止2恢复*/if(__HAL_PWR_GET_FLAG(PWR_FLAG_STOPF)==0U){Error_Handler();}/*清除停止标志*/__HAL_PWR_Clear_FLAG(PWR_FLAG_STOFF);/*检查停止标志是否已清除*/if(__HAL_PWR_GET_flag(PWR_flag_STOPF)!=0U){Error_Handler();}/*调用系统时钟配置*/SystemClock_config();/*恢复SysTick*/HAL_ResumeTick();/*基于RXNE标志唤醒成功*/HAL_UARTEx_DisableStopMode(&hlpuart1);HAL_UART_Receive_IT(&hlpuart1,u8pData,1);}/*用户代码端4*/19.现在,所有的代码实现都完成了!单击调试按钮,您应该能够正确编译、编程和调试代码:

20.LPUART1未连接到NUCLEO-U575ZI-Q中的ST-LINK VCOM。为了使该通信线路可用,您可以将PG7/PG8连接到USB桥接器或更改焊接桥接器配置,如下表所示(有关更多详细信息,请参阅Nucleo板用户手册):

21.要在STM32CubeIDE接口中打开虚拟COM,请单击下图中所示的按钮(此按钮位于安慰查看选项卡),然后点击命令外壳控制台以下为:

22.在弹出菜单中,选择串行端口在“连接类型”下拉列表中,然后单击新建…以下为:

23.给出任何连接名称,选择您各自的串行端口,更改波特率,然后单击完成以下为:

24.点击好啊按钮,并检查COM控制台是否已打开(如果该选项卡未显示或已关闭,则可以从突出显示的按钮打开它)。连接VCOM后,按简历你应该在终端上看到消息

代码说明:
运行代码时,蓝色LED应开始闪烁,“LED ON”和“LED OFF”信息应通过LPUART发送。如果您键入字母“p”,则MCU应进入Stop 2 Low power(停止2低功率)模式,并且闪烁的LED将停止。要唤醒MCU,您可以通过终端将任何字符发送到LPUART,结果代码将恢复执行。
以下是需要指出的代码中的一些重要亮点:
-使用HSI时:当MCU唤醒时,以下宏是使用HSI作为时钟源所必需的。
__HAL_RCC_WAKEUPSTOP_CLK_CONFIG(RCC_STOP_WAKEUPCLOCK_HSI);
__HAL_RCC_KERWAKEUPSTOP_CLK_CONFIG(RCC_STOP_KERWAKEUPCLOCK_HSI);
__HAL_RCC_KERWAKEUPSTOP_CLK_CONFIG(RCC_STOP_KERWAKEUPCLOCK_HSI);
-使用HSI时:当MCU处于Stop 2(停止2)时,以下宏是保持HSI计时所必需的。
__HAL_RCC_HSISTOP_ENABLE();
-当MCU处于Stop 2(停止2)时,以下宏和功能是设置寄存器以保持LPUART在自主模式下运行所必需的。
__HAL_RCC_LPUART1_CLKAM_ENABLE();
HAL_UARTEx_启用停止模式(&hlpuart1);
HAL_UARTEx_启用停止模式(&hlpuart1);
祝贺你走到今天!现在,您可以实现LPUART,将STM32U5从STOP2低功率模式唤醒。这一功能在STM32U5系列的多个低功耗应用中非常有用。只需进行一些更改,所示示例即可适用于任何其他STM32U5零件。
希望你喜欢!
参考链接:
以下是与本文相关的一些链接,这些链接对您的应用程序很有用:
STM32U5 Nucleo-144板-用户手册
STM32U575ZI-主页
STM32U575xx-产品介绍
STM32U5系列-参考手册
如何将printf函数重定向到用于调试消息的UART-ST社区文章
上一篇: 如何更改STM32F1上的读取保护 下一篇: 如何设置OSPI外设与ISSI的IS25LX256接口