[MM32软件]

使用MM32F0270 LPUART从低功耗模式唤醒

[复制链接]
1343|19
手机看帖
扫描二维码
随时随地手机跟帖
两只袜子|  楼主 | 2022-1-18 15:39 | 显示全部楼层 |阅读模式
在许多的工业与消费类应用中,越来越多的需要使用低功耗功能,使用外部串口数据通信发送命令来唤醒MCU。灵动微电子推出的MM32F0270系列,支持多种灵活的低功耗模式,支持LPUART的外设。
本文介绍了如何使用 MM32F0270的LPUART来实现通过接收外部UART的信号,触发MCU从Sleep/DeepSleep低功耗模式中唤醒。

1
MM32F0270 LPUART的简要介绍
LPUART 为低功耗通用异步收发器,相比标准的UART,其功耗极低,并支持在Sleep,DeepSleep模式运行以及唤醒芯片

LPUART 工作时钟为32768Hz。通过配置LPUART 数据收发的最高支持波特率为9600。MM32F0270的LPUART 的时钟源仅支持LSE 32.768KHz,结合LSE的特性,LPUART 能够在所有电源模式(待机模式除外)下保持运行状态。

LPUART 可以支持MCU结合LPUART的接收特性,触发MCU从低功耗SLEEP/DeepSleep模式唤醒,实现非通信时的低功耗运行。

图1 LPUART的功能框图
pYYBAGHk_TGAdDgCAAEHWK1nW_A062.png

使用特权

评论回复
两只袜子|  楼主 | 2022-1-18 15:40 | 显示全部楼层
2
LPUART 的功能特性
2.1 MM32的LPUART具有以下特性:
支持UART 帧格式的异步数据收发
支持DMA 请求(RUN 或LPRUN 模式下支持DMA,Sleep/DeepSleep 模式下不支持DMA)
全双工异步操作
工作时钟为32768Hz LSE 时钟或40KHz LSI 时钟,经过分频后波特率范围为300~9600
内置独立的1 字节发送和1 字节接收缓冲
发送和接收数据低位在前
一个起始位开始,后面接数据位,输出的数据长度可为7 位、8 位,最后为停止位。另外可选择是否有加奇偶校验位,奇偶校验位在数据位之后停止位之前。
支持硬件奇数或者偶数校验产生和侦测
支持信号接收和发送取反
支持Sleep/DeepSleep 模式进行数据收发

2.2  MM32F0270 LPUART中断
LPUART支持下面中断源:
接收缓冲溢出
帧错误
奇偶校验错误
接收器检测到起始位
接收器检测到下降沿
接收器完整接收 1byte数据
接收器完整接收数据且与预设数据匹配
发送器数据完成发送
发送器缓冲空

2.3  MM32F0270 LPUART支持唤醒源
LPUART支持 Sleep/DeepSleep模式以下唤醒源:
接收器检测到下降沿唤醒
接收器检测到起始位唤醒
接收器 1字节接收完成唤醒
接收器 1字节数据接收并匹配唤醒

需要使用唤醒时,需要使能相应的中断外,还需配置EXti 22使能相关的功能。

相关的寄存器与控制状态位的控制与查询,可以参考用户手册。

使用特权

评论回复
两只袜子|  楼主 | 2022-1-18 15:41 | 显示全部楼层
3
LPUART 从Sleep/DeepSleep模式
唤醒的软硬件设计
LPUART是如何控制配置实现接收UART数据,利用对方UART发送一个Byte中的START起始位,唤醒Sleep/DeepSleep模式的呢?
3.1在库函数版本的样例中可以通过如下顺序初始化LPUART
a.  使能SYSCFG ,PWR,BKP,LSE时钟,待LSE稳定,使能LPUART时钟;
    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);

b.  配置LPUART的LPUART_InitTypeDef结构体中指定的参数;
选择时钟源为LSE 32.768KHz;
选择波特率为9600Bps,8个数据位,1个停止位,无校验位;
对应9600Bps的MDU匹配值为0x952;    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);

c.  使能LPUART接收中断
    LPUART_ClearITPendingBit(  LPUART1, LPUART_LPUIF_RXIF);
    LPUART_ITConfig( LPUART1, LPUART_LPUCON_RXIE, ENABLE );

d.  设置LPUART中断向量
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);
}

e.  设置LPUART1复用的GPIO,复用到PA4&PA5;
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);
}

f.    设定LPUART对应唤醒的EXTI参数
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);                        
}

使用特权

评论回复
两只袜子|  楼主 | 2022-1-18 15:41 | 显示全部楼层
g.    中断相应处理函数
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);
}

3.2 实现Demo功能的主要函数代码:
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);
        }
    }

}

配置好初始化LPUART收发的初始化操作后,发送“enter low power mode”;

进入Sleep/DeepSleep模式。

PC Side发送任意数据,LPUART收到PC side的数据后,MCU从Sleep/DeepSleep模式唤醒。

唤醒后继续执行LPUART发送程序,发送“wakeup from low power mode”到PC主机。
通过上述的步骤,简单的演示了MM32F0270的LPUART 接收数据,通过数据帧中的Start Bit唤醒MCU的功能。

Demo程序可登录MindMotion的官网下载MM32F0270 lib_Samples:
https://www.mindmotion.com.cn/pr ... instream/MM32F0270/
工程路径如下:
~ MM32F0270_Samples\LibSamples\LPUART\

使用特权

评论回复
tpgf| | 2022-2-4 17:08 | 显示全部楼层
不同低功耗模式唤醒的方式不同

使用特权

评论回复
paotangsan| | 2022-2-4 17:12 | 显示全部楼层
那就是互相匹配的问题了

使用特权

评论回复
renzheshengui| | 2022-2-4 17:18 | 显示全部楼层
这个发送的内容是自定义的吧

使用特权

评论回复
wakayi| | 2022-2-4 17:25 | 显示全部楼层
呵呵呵 需要自己定义通讯协议

使用特权

评论回复
wowu| | 2022-2-4 17:33 | 显示全部楼层
弄一个标志位多简单啊

使用特权

评论回复
xiaoqizi| | 2022-2-4 17:42 | 显示全部楼层
一共能有多少种低功耗模式啊

使用特权

评论回复
B1lanche| | 2022-5-16 17:50 | 显示全部楼层
低功耗操作属实很有意义,可以使用电池供电了

使用特权

评论回复
Candic12e| | 2022-5-16 18:06 | 显示全部楼层
这种低功耗串口操作是不是现在越来越多了

使用特权

评论回复
Charlene沙| | 2022-5-16 18:30 | 显示全部楼层
话说开启这个低功耗串口,会多增加多少功耗呢?

使用特权

评论回复
Emily999| | 2022-5-16 19:15 | 显示全部楼层
正常可以用外部触发,实现唤醒MCU ,然后用串口接收数据,这样也行的

使用特权

评论回复
Allison8859| | 2022-5-16 19:40 | 显示全部楼层
你这个LPUART还没用过,但是我觉得应该比较好用

使用特权

评论回复
Betty1299| | 2022-5-17 10:06 | 显示全部楼层
功耗低真就挺好,而且你这个可以用在Sleep,DeepSleep模式运行以及唤醒芯片

使用特权

评论回复
Carina卡| | 2022-5-21 10:12 | 显示全部楼层
这种LPUART与正常的串口相比除了低功耗之外,还有别的优势么?

使用特权

评论回复
Estelle1999| | 2022-5-21 11:07 | 显示全部楼层
这种优先级需要设置高一些么?

使用特权

评论回复
alxd| | 2022-5-21 11:45 | 显示全部楼层
这个波特率最大是9600么?

使用特权

评论回复
Charlotte夏| | 2022-5-21 13:30 | 显示全部楼层
话说带有LPUART的功能的MCU,灵动的是L系列的吗

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1881

主题

6425

帖子

7

粉丝