在许多的工业与消费类应用中,越来越多的需要使用低功耗功能,使用外部串口数据通信发送命令来唤醒MCU。灵动微电子推出的MM32F0270系列,支持多种灵活的低功耗模式,支持LPUART的外设。
本文介绍了如何使用 MM32F0270的LPUART来实现通过接收外部UART的信号,触发MCU从Sleep/DeepSleep低功耗模式中唤醒。
<strong><font color="#004a85">1、MM32F0270 LPUART的简要介绍</font> </strong>
LPUART 为低功耗通用异步收发器,相比标准的UART,其功耗极低,并支持在Sleep,DeepSleep模式运行以及唤醒芯片。
LPUART 工作时钟为32768Hz。通过配置LPUART 数据收发的最高支持波特率为9600。MM32F0270的LPUART 的时钟源仅支持LSE 32.768KHz,结合LSE的特性,LPUART 能够在所有电源模式(待机模式除外)下保持运行状态。
LPUART 可以支持MCU结合LPUART的接收特性,触发MCU从低功耗SLEEP/DeepSleep模式唤醒,实现非通信时的低功耗运行。
<center><img src="http://mcu.eetrend.com/files/2022-01/wen_zhang_/100556998-239543-1.png&…; alt=“图1 LPUART的功能框图"></center><center><i>图1 LPUART的功能框图</i></center>
<strong><font color="#004a85">2、LPUART 的功能特性</font> </strong>
<strong>2.1 MM32的LPUART具有以下特性:</strong>
<ul><li>支持UART 帧格式的异步数据收发</li>
<li>支持DMA 请求(RUN 或LPRUN 模式下支持DMA,Sleep/DeepSleep 模式下不支持DMA)</li>
<li>全双工异步操作</li>
<li>工作时钟为32768Hz LSE 时钟或40KHz LSI 时钟,经过分频后波特率范围为300~9600</li>
<li>内置独立的1 字节发送和1 字节接收缓冲</li>
<li>发送和接收数据低位在前</li>
<li>一个起始位开始,后面接数据位,输出的数据长度可为7 位、8 位,最后为停止位。另外可选择是否有加奇偶校验位,奇偶校验位在数据位之后停止位之前。</li>
<li>支持硬件奇数或者偶数校验产生和侦测</li>
<li>支持信号接收和发送取反</li>
<li>支持Sleep/DeepSleep 模式进行数据收发</li></ul>
<strong>2.2 MM32F0270 LPUART中断</strong>
LPUART支持下面中断源:
<ul><li>接收缓冲溢出</li>
<li>帧错误</li>
<li>奇偶校验错误</li>
<li>接收器检测到起始位</li>
<li>接收器检测到下降沿</li>
<li>接收器完整接收 1byte数据</li>
<li>接收器完整接收数据且与预设数据匹配</li>
<li>发送器数据完成发送</li>
<li>发送器缓冲空</li></ul>
<strong>2.3 MM32F0270 LPUART支持唤醒源</strong>
LPUART支持 Sleep/DeepSleep模式以下唤醒源:
<ul><li>接收器检测到下降沿唤醒</li>
<li>接收器检测到起始位唤醒</li>
<li>接收器 1字节接收完成唤醒</li>
<li>接收器 1字节数据接收并匹配唤醒</li></ul>
需要使用唤醒时,需要使能相应的中断外,还需配置EXTI 22使能相关的功能。
相关的寄存器与控制状态位的控制与查询,可以参考用户手册。
<strong><font color="#004a85">3、 LPUART 从Sleep/DeepSleep模式唤醒的软硬件设计</font> </strong>
LPUART是如何控制配置实现接收UART数据,利用对方UART发送一个Byte中的START起始位,唤醒Sleep/DeepSleep模式的呢?
<strong>3.1在库函数版本的样例中可以通过如下顺序初始化LPUART</strong>
a. 使能SYSCFG ,PWR,BKP,LSE时钟,待LSE稳定,使能LPUART时钟;
<pre style="overflow-x:auto; background-color:#e9e9e9;"> RCC_APB2PeriphClockCmd(RCC_APB2ENR_SYSCFG, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1ENR_PWR, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1ENR_BKP, ENABLE);
PWR_BackupAccessCmd(ENABLE);
RCC_LSEConfig(RCC_LSE_ON);
DelayNop_Init();
DelayNop_Ms(100);
while(RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET) {;}
RCC_APB2PeriphClockCmd(RCC_APB2ENR_LPUART1, ENABLE);</pre>
b. 配置LPUART的LPUART_InitTypeDef结构体中指定的参数;
选择时钟源为LSE 32.768KHz;
选择波特率为9600Bps,8个数据位,1个停止位,无校验位;
对应9600Bps的MDU匹配值为0x952;
<pre style="overflow-x:auto; background-color:#e9e9e9;"> LPUART_InitTypeDef init_struct;
LPUART_StructInit(&init_struct);
init_struct.LPUART_Clock_Source = 0;
init_struct.LPUART_BaudRate = LPUART_Baudrate_9600;
init_struct.LPUART_WordLength = LPUART_WordLength_8b;
init_struct.LPUART_StopBits = LPUART_StopBits_1;
init_struct.LPUART_Parity = LPUART_Parity_No;
init_struct.LPUART_MDU_Value = 0x952;
init_struct.LPUART_RecvEventCfg = LPUART_RecvEvent_Start_Bit;
LPUART_Init(LPUART1, &init_struct);</pre>
c. 使能LPUART接收中断
<pre style="overflow-x:auto; background-color:#e9e9e9;"> LPUART_ClearITPendingBit( LPUART1, LPUART_LPUIF_RXIF);
LPUART_ITConfig( LPUART1, LPUART_LPUCON_RXIE, ENABLE );</pre>
d. 设置LPUART中断向量
<pre style="overflow-x:auto; background-color:#e9e9e9;">void NVIC_LPUART_ConfigInit(void)
{
NVIC_InitTypeDef NVIC_InitStruct;
NVIC_InitStruct.NVIC_IRQChannel = LPUART1_IRQn;
NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
NVIC_InitStruct.NVIC_IRQChannelPriority = 1;
NVIC_Init( &NVIC_InitStruct);
}</pre>
e. 设置LPUART1复用的GPIO,复用到PA4&PA5;
<pre style="overflow-x:auto; background-color:#e9e9e9;">void LPUART1_GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
RCC_AHBPeriphClockCmd(RCC_AHBENR_GPIOA, ENABLE);
GPIO_PinAFConfig(GPIOA, GPIO_PinSource4, GPIO_AF_3);
GPIO_PinAFConfig(GPIOA, GPIO_PinSource5, GPIO_AF_3);
//LPUART1_TX GPIOA.4
GPIO_StructInit(&GPIO_InitStruct);
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_4;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOA, &GPIO_InitStruct);
//LPUART1_RX GPIOA.5
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_5;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPU;
GPIO_Init(GPIOA, &GPIO_InitStruct);
}</pre>
f. 设定LPUART对应唤醒的EXTI参数
<pre style="overflow-x:auto; background-color:#e9e9e9;">void LPUART1_WKUP_Init(void)
{
EXTI_InitTypeDef EXTI_InitStructure;
EXTI_InitStructure.EXTI_Line = EXTI_Line22;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);
}</pre>
g. 中断相应处理函数
<pre style="overflow-x:auto; background-color:#e9e9e9;">void LPUART1_IRQHandler()
{
if(LPUART_GetFlagStatus(LPUART1, LPUART_LPUSTA_START)==SET) {
LPUART_ClearFlagStatus(LPUART1,LPUART_LPUSTA_START);
rxDataBuf[cnt++] = LPUART_ReceiveData(LPUART1);
if(cnt >= 10)
cnt_flag = 1;
}
EXTI_ClearITPendingBit(EXTI_Line22);
}</pre>
<strong>3.2 实现Demo功能的主要函数代码:</strong>
<pre style="overflow-x:auto; background-color:#e9e9e9;">void LPUART_Function_Demo(void)
{
u8 temp, i;
u8 string1[] = "enter low power mode\n";
u8 string2[] = "wakeup from low power mode\n";
LPUART_Interrupt_wStart_Init();
LPUART_ClearITPendingBit( LPUART1, LPUART_LPUIF_RXIF);
LPUART_ITConfig( LPUART1, LPUART_LPUCON_RXIE, ENABLE );
NVIC_LPUART_ConfigInit();
LPUART_Cmd(LPUART1, ENABLE);
LPUartSendGroup(&(string1[0]),sizeof(string1));
LPUART1_WKUP_Init();
__WFI();
LPUartSendGroup(&(string2[0]),sizeof(string2));
while(1) {
temp = Input_Byte(LPUART1);
if(temp != 0) {
Output_Byte(LPUART1, temp);
}
}
}</pre>
配置好初始化LPUART收发的初始化操作后,发送“enter low power mode”;
进入Sleep/DeepSleep模式。
PC Side发送任意数据,LPUART收到PC side的数据后,MCU从Sleep/DeepSleep模式唤醒。
唤醒后继续执行LPUART发送程序,发送“wakeup from low power mode”到PC主机。
<center><img src="http://mcu.eetrend.com/files/2022-01/wen_zhang_/100556998-239544-2.png&…; alt=“使用MM32F0270 LPUART从低功耗模式唤醒"></center>
通过上述的步骤,简单的演示了MM32F0270的LPUART 接收数据,通过数据帧中的Start Bit唤醒MCU的功能。
Demo程序可登录MindMotion的官网下载MM32F0270 lib_Samples:
<a href="https://www.mindmotion.com.cn/products/mm32mcu/mm32f/mm32f_mainstream/M…;
工程路径如下:
~ MM32F0270_Samples\LibSamples\LPUART\
来源:<a href="https://mp.weixin.qq.com/s/EiJSq1Q989wXxx8SrHvP-g">灵动MM32MCU </a>
免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:cathy@eetrend.com)。