灵动微课堂 (第236讲)|基于MM32L0130的LPUART应用(1)
来源:灵动MM32MCU发布时间:2022-11-17654浏览
询问 AILPUART(Low power universal asynchronous receiver transmitter,低功耗通用异步收发器),相比标准的UART,其功耗极低,支持在低功耗模式下运行,并且可以将MCU从低功耗模式唤醒。
本文介绍MM32全新低功耗系列MM32L0130的LPUART外设,实现基本UART收发通信、通过UART中断使MCU从低功耗模式中唤醒。
1
LPUART 简介
1.1 LPUART功能框图

1.2 LPUART功能特征
支持UART帧格式的全双工异步数据收发。
支持输入任意频率的时钟源,可配置为LSE/LSI/PCLK。
支持可编程的波特率数据传输,发送和接收时可采用3、4分频交替,防止累计误差。
可配置奇偶校验位、停止位。
可配置收发数据信号取反。
2
LPUART时钟配置
LPUART时钟源配置寄存器在RCC_CFGR2中的位0和位1,可配置LSE、LSI、PCLK作为时钟源。

3
LPUART中断与唤醒
支持的中断源:
接收缓冲溢出
帧错误
奇偶校验错误
接收器检测到起始位
接收器检测到下降沿
接收器完整接收 1byte 数据
接收器完整接收数据且与预设数据匹配
发送器数据完成发送
发送器缓冲空
支持低功耗模式下的唤醒源:
接收器检测到下降沿唤醒
接收器检测到起始位唤醒
接收器1字节接收完成唤醒
接收器1字节数据接收并匹配唤醒
4
接收和发送时序
由于LPUART工作时钟不是波特率的整数倍,采用固定分频系数的话会引入累计误差,所以在接收和发送的时候采用3、4分频交替进行接收和发送,每个bit采样一次,每个bit采用3分频还是4分频由MCTL寄存器控制,接收和发送时序图如下:

当LPUART工作时钟配置为标准的32.768KHz时,软件可配置BREN为0,然后根据通信波特率调整调制寄存器MCTL,建议配置参数如下表:

5
LPUART寄存器概览

6
LPUART实现普通UART功能配置步骤
1
开启LPUART所选时钟源
2
配置RCC_CFGR2寄存器选择LPUART时钟
3
配置 LPUBAUD 寄存器决定波特率
4
根据波特率选择合适的调制参数,配置 MCTL 寄存器
5
配置 LPUCON 寄存器,选择帧格式、极性、中断参数等
6
配置 LPUEN 寄存器打开发送、接收使能
7
发送和接收数据
发送数据:
将待发送的数据写入LPUTXD,当发送完成时,LPUSTA的TXE标志位会被硬件置起,表示数据已传入移位寄存器,发送 buffer为空。此时可往LPUTXD写入下一个数据。软件向发送buffer写数据时TXE标志位自动清零。
接收数据:
当接收一个完整帧时,LPUSTA的RXF标志位置起,表示已完整接收数据,此时软件可读取LPURXD读出接收到的数据。软件读LPUDATA寄存器时,RXF标志位自动清零。
8
LPUART功能实现代码
首先编写基础UART的代码,通过轮询的方式发送和接收数据。然后添加中断代码,实现通过LPUART将MCU从低功耗模式唤醒。
8.1 基于LSE时钟的基础UART功能实现代码
a.
开启BKP、LSE时钟,待LSE时钟稳定,使能LPUART时钟:
RCC_APB1PeriphClockCmd(RCC_APB1ENR_BKP,ENABLE);
PWR_BackupAccessCmd(ENABLE);
RCC_LSEConfig(RCC_LSE_ON);
DELAY_Ms(100);
while(RCC_GetFlagStatus(RCC_FLAG_LSERDY)==RESET){;}
RCC_APB2PeriphClockCmd(RCC_APB2ENR_LPUART1,ENABLE);
b.
配置LPUART的LPUART_InitTypeDef结构体参数:
LPUART_InitTypeDefinit_struct;
init_struct.LPUART_Clock_Source=0;//时钟源选择
init_struct.LPUART_BaudRate=LPUART_Baudrate_9600;//波特率选择9600
init_struct.LPUART_WordLength=LPUART_WordLength_8b;//8位数据位
init_struct.LPUART_StopBits=LPUART_StopBits_1;//1位停止位
init_struct.LPUART_Parity=LPUART_Parity_No;//没有校验位
init_struct.LPUART_MDU_Value=0x952;//波特率调制控制寄存器
init_struct.LPUART_NEDET_Source=LPUART_NegativeDectect_Source2;//下降沿采样使能
init_struct.LPUART_RecvEventCfg=LPUART_RecvEvent_Start_Bit;//中断检测模式
LPUART_Init(LPUART1,init_struct);
LPUART_Cmd(LPUART1,ENABLE);
c.
设置LPUART引脚复用,例程复用到PA4、PA5:
GPIO_InitTypeDefGPIO_InitStruct;
RCC_GPIO_ClockCmd(GPIOA,ENABLE);
GPIO_PinAFConfig(GPIOA,GPIO_PinSource4,GPIO_AF_3);
GPIO_PinAFConfig(GPIOA,GPIO_PinSource5,GPIO_AF_3);
//LPUART1_TXGPIOA.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_RXGPIOA.5
GPIO_InitStruct.GPIO_Pin=GPIO_Pin_5;
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IPU;
GPIO_Init(GPIOA,GPIO_InitStruct);
d.
编写发送函数:
voidOutput_Byte(LPUART_TypeDef*lpuart,uint8_tdat)
{
LPUART_SendData(lpuart,dat);
while(!LPUART_GetFlagStatus(lpuart,LPUART_LPUSTA_TXE));
}
e.
编写轮询接收函数:
uint8_tInput_Byte(LPUART_TypeDef*lpuart)
{
uint8_ttemp;
while(1){
if(LPUART_GetFlagStatus(lpuart,LPUART_LPUSTA_RXF)){
//readLPUART_LPUSTA_RXFbitandclear
temp=(uint8_t)LPUART_ReceiveData(lpuart);
break;
}
}
if(temp==0xd){
return0;
}
returntemp;
}
f.
编写实验样例:
voidLPUART_TxRx_Test(void)
{
uint8_ttemp,i;
charstring[]="LPUARTpollingtest!\r\n";
for(i=0;i<strlen(string);i++)
{
Output_Byte(LPUART1,string[i]);
}
while(1)
{
temp=Input_Byte(LPUART1);
if(temp!=0)
{
Output_Byte(LPUART1,temp);
}
}
}
g.
在main函数中配置好LPUART后,调用LPUART_TxRx_Test函数,可得到如下实验结果:

8.2 在上述基本LPUART配置的基础上增加中断配置代码,实现唤醒低功耗模式中的MCU
a.
开启SYSCFG、PWR时钟:
RCC_APB2PeriphClockCmd(RCC_APB2ENR_SYSCFG,ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1ENR_PWR,ENABLE);
b.
EXTI模块可以产生中断请求,用来唤醒低功耗模式中的MCU,LPUART连接到EXTI22,使能EXTI22:
EXTI_InitTypeDefEXTI_InitStruct;
EXTI_StructInit(EXTI_InitStruct);
EXTI_InitStruct.EXTI_Line=EXTI_Line22;
EXTI_InitStruct.EXTI_Mode=EXTI_Mode_Interrupt;
EXTI_InitStruct.EXTI_Trigger=EXTI_Trigger_Rising;
EXTI_InitStruct.EXTI_LineCmd=ENABLE;
EXTI_Init(EXTI_InitStruct);
c.
配置NVIC:
NVIC_InitTypeDefNVIC_InitStruct;
NVIC_InitStruct.NVIC_IRQChannel=LPUART1_IRQn;
NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE;
NVIC_InitStruct.NVIC_IRQChannelPriority=1;
NVIC_Init(NVIC_InitStruct);
d.
清除接收标志并打开接收中断:
LPUART_ClearITPendingBit(LPUART1,LPUART_LPUIF_RXIF);
LPUART_ITConfig(LPUART1,LPUART_LPUCON_RXIE,ENABLE);
e.
定义RX缓存,然后编写中断服务函数:
charrxDataBuf[10],cnt=0;
uint8_tcnt_flag=0;
voidLPUART1_IRQHandler()
{
if(LPUART_GetFlagStatus(LPUART1,LPUART_LPUSTA_START))
{
LPUART_ClearFlagStatus(LPUART1,LPUART_LPUSTA_START);
}
if(LPUART_GetITStatus(LPUART1,LPUART_LPUIF_RXIF)==SET)
{
LPUART_ClearITPendingBit(LPUART1,LPUART_LPUIF_RXIF);
rxDataBuf[cnt]=LPUART_ReceiveData(LPUART1);
if(++cnt>=10)
{
cnt_flag=1;
cnt=0;
}
}
}
f.
编写实验样例:
voidLPUART_Wakeup_Test(void)
{
uint8_ttemp,i;
charstring1[]="LPUARTwakeupmcutest!\r\n";
charstring2[]="mcustop!\r\n";
charstring3[]="mcuwakeup!\r\n";
for(i=0;i<strlen(string1);i++)
{
Output_Byte(LPUART1,string1[i]);
}
DELAY_Ms(20);
for(i=0;i<strlen(string2);i++)
{
Output_Byte(LPUART1,string2[i]);
}
PWR_EnterSTOPMode(PWR_Regulator_LowPower,PWR_STOPEntry_WFI);//休眠
for(i=0;i<strlen(string3);i++)
{
Output_Byte(LPUART1,string3[i]);
}
while(1)
{
}
}
g.
在main函数中配置好LPUART后,调用实验函数LPUART_Wakeup_Test,可以的到如下结果:

往期精彩
第232讲 | 使用MM32L0130 SLCD驱动LCD显示
第229讲 | 基于MM32F0140的UDS Bootloader学习笔记
第224讲 | MM32F0140 FlexCAN一致性测试 (2)
第223讲 | MM32F0140 FlexCAN一致性测试 (1)
第222讲 | MM32F0140学习笔记——独立看门狗(IWDG)
第221讲 | 使用MM32F3270基于Azure RTOS抢占任务的应用
第220讲 | 使用MM32F3270基于Azure RTOS事件标志组的应用
第219讲 | 使用MM32F3270基于Azure RTOS消息队列的应用
第218讲 | 使用MM32F3270基于Azure RTOS (ThreadX)的多任务调度
第217讲 | 使用MM32F3270基于Azure RTOS (ThreadX) 的移植
第215讲 | MM32F0140学习笔记——窗口看门狗(WWDG)
第213讲 | MM32F0140学习笔记——FlexCAN 控制器局域网
第212讲 | 工程师笔记——MM32F0040使用总结 (2)
第211讲 | 工程师笔记——MM32F0040使用总结 (1)
第207讲 | MM32F0140学习笔记——时钟系统RCC
第200讲 | 使用MM32F0270 定时器DMA方式输出PWM
关于灵动
上海灵动微电子股份有限公司成立于 2011 年,是中国本土领先的通用 32 位 MCU 产品及解决方案供应商。公司基于 Arm Cortex-M 系列内核开发的 MM32 MCU 产品拥有 F/L/A/SPIN/W 五大系列,目前已量产 200多款型号,累计交付超3亿颗,每年都有近亿台配备了灵动 MM32MCU 的优秀产品交付到客户手中,在本土通用 32 位 MCU 公司中位居前列。

灵动客户涵盖智能工业、汽车电子、通信基建、医疗健康、智慧家电、物联网、个人设备、手机和电脑等应用领域。灵动是中国为数不多的同时获得了 Arm-KEIL、IAR、SEGGER 官方支持的本土 MCU 公司,并建立了独立、完整的通用 MCU 生态体系。灵动始终秉承着“诚信、承诺、创新、合作”的精神,为客户提供从硬件芯片到软件算法、从参考方案到系统设计的全方位支持。

灵动股份
微信号:MindMotion-MMCU


长按识别二维码关注我们

MORE
官网:www.mm32mcu.com
微信公众号:灵动MM32MCU
灵动MM32MCU技术论坛:
bbs.21ic.com/iclist-696-1.html
新闻来源:灵动MM32MCU,文中所述为作者独立观点,不代表icspec立场。更多精彩资讯请下载icspec App。如对本稿件有异议,请联系微信客服specltkj。


