完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
在许多的工业与消费类应用中,越来越多的需要使用低功耗功能,使用外部串口数据通信发送命令来唤醒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的功能框图 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使能相关的功能。 相关的寄存器与控制状态位的控制与查询,可以参考用户手册。 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); } 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 moden"; u8 string2[] = "wakeup from low power moden"; 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_SamplesLibSamplesLPUART |
|
相关推荐
|
|
只有小组成员才能发言,加入小组>>
2253个成员聚集在这个小组
加入小组灵动微电子MM32全系列MCU产品应用手册,库函数和例程和选型表
11843 浏览 3 评论
【MM32 eMiniBoard试用连载】+基于OLED12864的GUI---U8G2
5980 浏览 1 评论
【MM32 eMiniBoard试用连载】移植RT-Thread至MM32L373PS
11127 浏览 0 评论
【MM32 eMiniBoard测评报告】+ 开箱 + 初探
4598 浏览 1 评论
灵动微课堂(第106讲) | MM32 USB功能学习笔记 —— WinUSB设备
4333 浏览 1 评论
[MM32软件] MM32F002使用内部flash存储数据怎么操作?
1340浏览 1评论
859浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-27 13:44 , Processed in 0.616053 second(s), Total 64, Slave 49 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号