0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

基于MM32L0130的LPUART应用(1)

灵动MM32MCU 来源:灵动MM32MCU 作者:灵动MM32MCU 2022-11-18 10:35 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

LPUART(Low power universal asynchronous receiver transmitter,低功耗通用异步收发器),相比标准的UART,其功耗极低,支持在低功耗模式下运行,并且可以将MCU从低功耗模式唤醒。

本文介绍MM32全新低功耗系列MM32L0130的LPUART外设,实现基本UART收发通信、通过UART中断使MCU从低功耗模式中唤醒。

1LPUART 简介

1.1 LPUART功能框图

c8b7b75e-665f-11ed-8abf-dac502259ad0.jpg    

1.2 LPUART功能特征

支持UART帧格式的全双工异步数据收发。

支持输入任意频率的时钟源,可配置为LSE/LSI/PCLK。

支持可编程的波特率数据传输,发送和接收时可采用3、4分频交替,防止累计误差。

可配置奇偶校验位、停止位。

可配置收发数据信号取反。

2LPUART时钟配置

LPUART时钟源配置寄存器在RCC_CFGR2中的位0和位1,可配置LSE、LSI、PCLK作为时钟源。

c8d54abc-665f-11ed-8abf-dac502259ad0.png

3LPUART中断与唤醒

支持的中断源:

接收缓冲溢出

帧错误

奇偶校验错误

接收器检测到起始位

接收器检测到下降沿

接收器完整接收 1byte 数据

接收器完整接收数据且与预设数据匹配

发送器数据完成发送

发送器缓冲空

支持低功耗模式下的唤醒源:

接收器检测到下降沿唤醒

接收器检测到起始位唤醒

接收器1字节接收完成唤醒

接收器1字节数据接收并匹配唤醒

4接收和发送时序

由于LPUART工作时钟不是波特率的整数倍,采用固定分频系数的话会引入累计误差,所以在接收和发送的时候采用3、4分频交替进行接收和发送,每个bit采样一次,每个bit采用3分频还是4分频由MCTL寄存器控制,接收和发送时序图如下:

c8eb5032-665f-11ed-8abf-dac502259ad0.png

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

c900eaaa-665f-11ed-8abf-dac502259ad0.png

5LPUART寄存器概览

c91b0278-665f-11ed-8abf-dac502259ad0.png

6LPUART实现普通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标志位自动清零。

8LPUART功能实现代码

首先编写基础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!
";

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函数,可得到如下实验结果:

cad0236e-665f-11ed-8abf-dac502259ad0.png

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!
";
charstring2[]="mcustop!
";
charstring3[]="mcuwakeup!
";

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,可以的到如下结果:

cae8d170-665f-11ed-8abf-dac502259ad0.png

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • mcu
    mcu
    +关注

    关注

    147

    文章

    18615

    浏览量

    387241
  • 寄存器
    +关注

    关注

    31

    文章

    5590

    浏览量

    129077
  • uart
    +关注

    关注

    22

    文章

    1304

    浏览量

    106120
  • 异步收发器
    +关注

    关注

    0

    文章

    37

    浏览量

    11096
  • MM32
    +关注

    关注

    1

    文章

    108

    浏览量

    1318

原文标题:灵动微课堂 (第236讲)|基于MM32L0130的LPUART应用(1)

文章出处:【微信号:MindMotion-MMCU,微信公众号:灵动MM32MCU】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    ‌TE Connectivity L1/L5微型Splatch GNSS芯片天线技术解析

    TE Connectivity(TE)/Linx Technologies L1/L5 Splatch GNSS芯片天线支持L1/E1/B1
    的头像 发表于 11-04 11:34 333次阅读
    ‌TE Connectivity <b class='flag-5'>L1</b>/<b class='flag-5'>L</b>5微型Splatch GNSS芯片天线技术解析

    基于VL53L4CD的高精度ToF接近传感器扩展板:X-NUCLEO-53L4A1 技术解析

    、学习和开发应用。VL53L4CD专门设计用于接近和短程测量,提供非常精确的距离测量(1mm至1300mm)。具有18° FoV的新一代激光发射器提高了环境光下的性能,测距速度高达100Hz。
    的头像 发表于 10-29 11:36 326次阅读
    基于VL53<b class='flag-5'>L</b>4CD的高精度ToF接近传感器扩展板:X-NUCLEO-53<b class='flag-5'>L4A1</b> 技术解析

    ST VL53L7CX飞行时间传感器与X-NUCLEO-53L7A1扩展板技术解析

    。 STMicroelectronics 推出的这款评估套件,旨在帮助用户了解、评测和开发基于VL53L7CX飞行时间8x8多区90° 视场角测距传感器的应用程序。该款扩展板配有盖玻片托架,在盖玻片下方可适配0.25mm 、 0.5m
    的头像 发表于 10-28 11:34 345次阅读
    ST VL53<b class='flag-5'>L</b>7CX飞行时间传感器与X-NUCLEO-53<b class='flag-5'>L7A1</b>扩展板技术解析

    RT Studio 创建 STM32G4xx的板子,LPUART1的初始化存在错误怎么解决?

    我是一个新手,刚开始探索RT-Thread+STM32 在用RT Studio创建工程后顺利把板子跑起来了,不是开发板,是自己的板子;但是发现LPUART1不能使用,后面有折腾了下Studio链接
    发表于 10-11 08:34

    rtt串口驱动对低功耗串口lpuart1不兼容怎么解决?

    记录一下开启低功耗串口lpuart1的问题点和临时解决办法,希望官方早日修复 问题现象: 使用rtt studio基于芯片创建了stm32h750的基础工程,log串口选用的LPUART1(tx
    发表于 09-28 08:51

    H743的LPUART1接收数据有时候出错怎么解决?

    MODBUS协议,从机回复的都是正确的。LPUART1接收到就有时不正确。 波特率9600,时钟用的是内部CSI。 同一块儿板子有时出现,有时正常。有的板子出现,有的板子不出现。
    发表于 09-22 06:58

    RA4L1_SENSOR-V1原理图

    RA4L1_SENSOR-V1开发板原理图
    发表于 04-30 09:41 11次下载

    为什么无法使用Lpuart_Uart_Ip_ 发送任何数据回调中的AsyncSend?

    我已经实现了基于 LPUART 的 DMA ,我可以发送使用 Lpuart_Uart_Ip_ 接收的数据同步发送 in lpuart_6_callback , 但是,我无法
    发表于 04-11 07:51

    k32l2b31写入LPUART1-&gt;STAT |= (1&lt;&lt;25)会导致semihost_hardfault是为什么?

    我想在 k32l2b31 上激活 LIN Break 检测 必须在状态寄存器中设置位 LKDE i try LPUART1->STAT |= (1<<25) 但在调试时显示为 “semihost_hardfau
    发表于 04-08 06:36

    FRDM-MCXA156 LPUART1不工作是哪里出了问题?

    我正在使用 FRDM-MCXA156并且MCUXpresso IDE 版本 24.12 我无法让LPUART1工作。 我导入了使用 LPUART0 的示例
    发表于 04-07 06:23

    LPUART12 eDMA 在RT1176 CM7上不起作用的原因?

    很好地测试了 lpuart1 的 eDMA。 LPUART12 RX 中断和 TX 被确认工作正常。 但是、lpuart12也需要 eDMA、因此我通过参考示例对其进行测试、但我遇到了困难。 Q
    发表于 03-31 06:44

    使用S32K322上的LPUART进行UART通信,接收超过14个字符时遇到问题,求解决

    我正在使用 S32K322 上的 LPUART 进行 UART 通信,并在接收超过 14 个字符时遇到问题。具体来说,在调用 Lpuart_Uart_Ip_GetReceiveStatus我收到错误
    发表于 03-28 07:00

    S32K344将LPUART6添加到Uart_example产生硬故障怎么解决?

    我尝试添加一个串行端口 (LPUART_6),以便能够通过 S32K3x4EVB-T172评估板上的串行转 USB 适配器输出消息。 我正在使用:S32DS 3.6.0、S32Kxx 开发
    发表于 03-20 07:25

    NA150-220S36L1 NA150-220S36L1

    电子发烧友网为你提供AIPULNION(AIPULNION)NA150-220S36L1相关产品参数、数据手册,更有NA150-220S36L1的引脚图、接线图、封装手册、中文资料、英文资料,NA150-220S36L1真值表,
    发表于 03-19 18:30
    NA150-220S36<b class='flag-5'>L1</b> NA150-220S36<b class='flag-5'>L1</b>

    手册描述LPUart1可以工作在APB clock domain,请问用HAL库如何设置?

    你好,看到手册描述LPUart1可以工作在APB clock domain,请问用HAL库如何设置,谢谢! 下面代码应该为independent clock设置,对吧? void
    发表于 03-11 06:12