完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
来源 灵动MM32 最近有客户提到在UART不工作的情况下,能不能让MM32L0系列MCU进入低功耗状态,有数据通信时通过UART唤醒MM32L0系列MCU,然后开始进行数据通信,以此循环,这种方法能够有效降低整机功耗,本文将为大家介绍在MM32L0系列MCU上实现UART唤醒MCU的编程方法。 从DS_ MM32L0xx _Ver1.9手册中查表知,MM32L0系列MCU在STOP模式下功耗为190uA ,以内部8MHz做为时钟,将MCU从STOP模式唤醒耗时为6.3us ,任一外部中断引线被设置为事件模式或中断模式都可以唤醒MCU,因此可以采用I/O中断在STOP模式下唤醒MCU的方式。 串口通信是从一个下降沿开始数据传输,如图所示。那么有没有可能利用RXD引脚的下降沿中断唤醒MCU,然后马上切换到串口,并在串口中断中读出正确的数据呢? 以上方式是可行的,利用UART的RX引脚的下降沿中断唤醒MCU,在 MCU 进入 STOP 状态后,不能直接通过 UART 等中断外设唤醒,只能通过 EXti 外部中断方式唤醒。但是我们可以在 MCU 进入 STOP 前将 RX脚设为 EXTI 模式,并使能对应的中断来实现,相关代码在MiniBoard上测试可以实现该功能。 从STOP模式唤醒后串口进行正常通信,判断一段时间后无数据则再一次进入STOP模式,然后再一次等待被唤醒。MM32在STOP模式下通过UART唤醒MCU的程序配置流程: 1,配置所有引脚为模拟输入 2,配置串口接收引脚为外部中断 3,进入stop mode 4,初始化串口等外设 UART配置代码: void uart_nvic_init(u32 bound) { GPIO_InitTypeDef GPIO_InitStructure; UART_InitTypeDef UART_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_UART1, ENABLE);//使能UART1时钟 RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);//使能GPIOA时钟 NVIC_InitStructure.NVIC_IRQChannel = UART1_IRQn;//UART1中断控制器配置 NVIC_InitStructure.NVIC_IRQChannelPriority = 3;//子优先级3 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//IRQ通道使能 NVIC_Init(&NVIC_InitStructure); GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_1);//GPIO复用功能配置 GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_1); UART_InitStructure.UART_BaudRate = bound;//串口波特率 UART_InitStructure.UART_WordLength = UART_WordLength_8b;//数据格式 UART_InitStructure.UART_StopBits = UART_StopBits_1;//停止位 UART_InitStructure.UART_Parity = UART_Parity_No;//无奇偶校UART_InitStructure.UART_HardwareFlowControl = UART_HardwareFlowControl_None;//无硬件流控 UART_InitStructure.UART_Mode = UART_Mode_Rx | UART_Mode_Tx;//收发模式 UART_Init(UART1, &UART_InitStructure); UART_ITConfig(UART1, UART_IT_RXIEN, ENABLE);//中断接收使能 UART_Cmd(UART1, ENABLE); //使能UART1 //UART1_TX GPIOA.9 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //PA.9 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;//复用推挽输出 GPIO_Init(GPIOA, &GPIO_InitStructure); //UART1_RX GPIOA.10 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;//PA10 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入 GPIO_Init(GPIOA, &GPIO_InitStructure); } 唤醒引脚外部中断配置: void WKUP_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; EXTI_InitTypeDef EXTI_InitStructure; RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE); RCC_APB2PeriphClockCmd( RCC_APB2Periph_SYSCFG, ENABLE); SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA, EXTI_PinSource10);//使能外部中断线 EXTI_InitStructure.EXTI_Line = EXTI_Line10;//设置中断线10 EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;//外部中断模式 EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;//下降沿触发 EXTI_InitStructure.EXTI_LineCmd = ENABLE;//使能外部中断线通道 EXTI_Init(&EXTI_InitStructure); NVIC_InitStructure.NVIC_IRQChannel = EXTI4_15_IRQn; NVIC_InitStructure.NVIC_IRQChannelPriority = 2; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); PWR_WakeUpPinCmd(ENABLE);//唤醒引脚使能 } 进入STOP模式: void Sys_Stop(void) { PWR_EnterSTOPMode(0, PWR_STOPEntry_WFI); //进入STOP模式 } 系统时钟切换到HSI: void HSI_SYSCLK(void) { RCC_HSICmd(ENABLE); while(RCC_GetFlagStatus(RCC_FLAG_HSIRDY)==RESET); RCC->CFGR &=~ 0xf; while((RCC->CFGR&0xf) != 0x0); } 外部中断服务函数: void EXTI4_15_IRQHandler(void) { EXTI_ClearITPendingBit(EXTI_Line10);//清中断 } 实验结果: |
|
相关推荐
|
|
只有小组成员才能发言,加入小组>>
2249个成员聚集在这个小组
加入小组灵动微电子MM32全系列MCU产品应用手册,库函数和例程和选型表
11696 浏览 3 评论
【MM32 eMiniBoard试用连载】+基于OLED12864的GUI---U8G2
5928 浏览 1 评论
【MM32 eMiniBoard试用连载】移植RT-Thread至MM32L373PS
10963 浏览 0 评论
【MM32 eMiniBoard测评报告】+ 开箱 + 初探
4576 浏览 1 评论
灵动微课堂(第106讲) | MM32 USB功能学习笔记 —— WinUSB设备
4302 浏览 1 评论
[MM32软件] MM32F002使用内部flash存储数据怎么操作?
974浏览 1评论
801浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-27 00:08 , Processed in 0.636316 second(s), Total 49, Slave 38 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号