打印
[方案相关]

【分享】华大HC32L130使用LPuart接收唤醒,妥妥的!数据不丢!

[复制链接]
2608|22
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
caizhiwei|  楼主 | 2020-11-15 10:14 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
一开始的疑虑是,接收会不会丢数据,毕竟是从睡眠中唤醒的。
实际实验得出结论,还不错!
1. 初始化Lpuart: 这里有个关键点,选择时钟源很很重要,必须使用内部RCL时钟,不能使用Pclk!
/*
*******************************************************************************************
*        函 数 名: BSP_Lpuart0_init
*        形    参:
*        返 回 值: void
*        说    明: QFN32只有Lpuart0
*******************************************************************************************
*/
void BSP_Lpuart0_init(uint32_t baud)
{
        stc_lpuart_cfg_t  stcCfg;
    stc_gpio_cfg_t stcGpioCfg;
       
    DDL_ZERO_STRUCT(stcCfg);
    DDL_ZERO_STRUCT(stcGpioCfg);
   
    Sysctrl_SetPeripheralGate(SysctrlPeripheralGpio,TRUE);       
    ///<TX
    stcGpioCfg.enDir =  GpioDirOut;
    Gpio_Init(GpioPortB,GpioPin0,&stcGpioCfg);
    Gpio_SetAfMode(GpioPortB,GpioPin0,GpioAf3); //配置PB00为LPUART0_TX
   
    //<RX
    stcGpioCfg.enDir =  GpioDirIn;
    Gpio_Init(GpioPortB,GpioPin11,&stcGpioCfg);
    Gpio_SetAfMode(GpioPortB,GpioPin11,GpioAf3); //配置PB11为LPUART0_RX
       
    ///<外设模块时钟使能
    Sysctrl_SetPeripheralGate(SysctrlPeripheralLpUart0,TRUE);   

    ///<LPUART 初始化

#if 0       
        stcCfg.stcBaud.enSclkSel = LPUartMskPclk;        ///<传输时钟源:Pclk
    stcCfg.stcBaud.u32Sclk = Sysctrl_GetPClkFreq();  ///<PCLK获取
       
#else        /*如果需要低功耗下LPuart中断唤醒,则需要选择RCL时钟*/
       
        Sysctrl_SetRCLTrim(SysctrlRclFreq38400);        ///< 配置RCL时钟为38.4kHz
    Sysctrl_ClkSourceEnable(SysctrlClkRCL, TRUE);   ///< 使能RCL时钟
        stcCfg.stcBaud.enSclkSel = LPUartMskRcl;        ///<传输时钟源:内部低速时钟
    stcCfg.stcBaud.u32Sclk = 38400;               
#endif       
    stcCfg.enStopBit = LPUart1bit;                   ///<1停止位   
    stcCfg.enMmdorCk = LPUartEven;                   ///<偶校验       
    stcCfg.stcBaud.enSclkDiv = LPUartMsk4Or8Div;     ///<采样分频
    stcCfg.stcBaud.u32Baud = baud;                   ///<波特率
    stcCfg.enRunMode = LPUartMskMode1;               ///<工作模式
    LPUart_Init(M0P_LPUART0, &stcCfg);                                 
     
    ///<LPUART 中断使能
    LPUart_ClrStatus(M0P_LPUART0,LPUartRC);          ///<清接收中断请求
    LPUart_ClrStatus(M0P_LPUART0,LPUartTC);          ///<清发送中断请求
    LPUart_EnableIrq(M0P_LPUART0,LPUartRxIrq);      ///<使能接收中断
    //LPUart_EnableIrq(M0P_LPUART0,LPUartTxIrq);       ///<使能发送中断
    EnableNvic(LPUART0_IRQn,IrqLevel3,TRUE);         ///<系统中断使能       
}
2. 中断处理函数:只管接收就好
///<LPUART0 中断服务函数
void LpUart0_IRQHandler(void)
{
        static int i = 0;
        uint8_t rx_dat = 0;
       
        if(LPUart_GetStatus(M0P_LPUART0, LPUartTC))      
    {
        LPUart_ClrStatus(M0P_LPUART0, LPUartTC);      ///<清发送中断请求  
    }

    if(LPUart_GetStatus(M0P_LPUART0, LPUartRC))       ///接收数据中断
    {
        LPUart_ClrStatus(M0P_LPUART0, LPUartRC);      ///<清接收中断请求
               
        rx_dat = LPUart_ReceiveData(M0P_LPUART0);
                FifoPush( &fifo_mbus, rx_dat );///读取数据进入队列                        
    }
}


3. 低功耗处理:低功耗也非常简单,并不需要初始化什么的,一个接口函数搞定,注意参数必须是False
  低功耗放在while(1)中即可;
 while(1)
        {
                mbus_cmd_parse();
//delay1ms(200);
                GdGetVolumeData();               
                mbus_ack_process();
                //LowpowerMode_BeforeEnter_todo();         //功耗调试测试可以在这里进行
                //Lpm_GotoDeepSleep(FALSE); /*demo board, test 0.3uA */
        }


周末愉快!


使用特权

评论回复
评论
smartpower 2020-11-15 13:01 回复TA
nb 
沙发
晓伍| | 2020-12-4 13:14 | 只看该作者
如果大大的提高速度 会不会导致丢数呢

使用特权

评论回复
板凳
磨砂| | 2020-12-4 13:21 | 只看该作者
为什么不能选择pclk呢

使用特权

评论回复
地板
fuqinyyy| | 2020-12-14 07:39 | 只看该作者
学习了,感谢楼主分享。

使用特权

评论回复
5
麻花油条| | 2020-12-14 15:13 | 只看该作者
选择时钟源很很重要,必须使用内部RCL时钟,不能使用Pclk,小白白学习了

使用特权

评论回复
6
aoo| | 2020-12-16 10:14 | 只看该作者
千人QQ群:206032332

使用特权

评论回复
7
han0097| | 2023-3-28 16:46 | 只看该作者
FifoPush( &fifo_mbus, rx_dat );你是怎么处理的?

使用特权

评论回复
8
eefas| | 2023-4-7 09:34 | 只看该作者
低功耗通用异步收发器(LPUART)是一种低功耗、全双工、异步串行通信接口

使用特权

评论回复
9
jimmhu| | 2023-4-7 10:16 | 只看该作者
串口可以直接唤醒的吗》              

使用特权

评论回复
10
timfordlare| | 2023-4-7 18:13 | 只看该作者
RTC唤醒+LPUART(DMA方式)唤醒?

使用特权

评论回复
11
chenci2013| | 2023-4-7 18:22 | 只看该作者
主要是这个功耗太低了。              

使用特权

评论回复
12
juliestephen| | 2023-4-7 23:14 | 只看该作者
LPuart这么稳定的吗?              

使用特权

评论回复
13
gygp| | 2023-4-7 23:23 | 只看该作者
LPuart接收唤醒使用的是中断触发的吗

使用特权

评论回复
14
kmzuaz| | 2023-4-7 23:53 | 只看该作者
这个是数据上传有问题的吗              

使用特权

评论回复
15
jackcat| | 2023-4-8 13:38 | 只看该作者
这个比较高端了。              

使用特权

评论回复
16
yang377156216| | 2023-4-10 10:53 | 只看该作者
要把初始化为多少波特率一起放上来,不然容易引发误解。

使用特权

评论回复
17
foreng5908| | 2023-4-24 13:36 | 只看该作者
LPuart采用内部时钟,最高波特率能到9600吗?

使用特权

评论回复
18
woai32lala| | 2023-4-25 10:16 | 只看该作者
学习

使用特权

评论回复
19
pltczw666| | 2023-5-6 00:07 | 只看该作者
foreng5908 发表于 2023-4-24 13:36
LPuart采用内部时钟,最高波特率能到9600吗?

如果使用RCL(38400Hz)时钟,最高波特率就是9600

使用特权

评论回复
20
csy1123| | 2023-5-11 15:18 | 只看该作者
学习

使用特权

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

本版积分规则

100

主题

857

帖子

14

粉丝