• 注册 / 登录
  • 切换到窄版
  • 查看: 1855|回复: 0

    小华HC32L130使用LPuart接收唤醒,妥妥的不丢数据!

    [复制链接]

    676

    主题

    690

    帖子

    6810

    积分

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    6810
    发表于 2023-4-24 16:46:12 | 显示全部楼层 |阅读模式

    路线栈欢迎您!

    您需要 登录 才可以下载或查看,没有帐号?立即注册

    x
    开始的疑虑是,接收会不会丢数据,毕竟是从睡眠中唤醒的。实际实验得出结论,还不错!

    1. 初始化Lpuart: 这里有个关键点,选择时钟源很很重要,必须使用内部RCL时钟,不能使用Pclk!

    1. /*
    2. *******************************************************************************************
    3. *        函 数 名: BSP_Lpuart0_init
    4. *        形    参:
    5. *        返 回 值: void
    6. *        说    明: QFN32只有Lpuart0
    7. *******************************************************************************************
    8. */
    9. void BSP_Lpuart0_init(uint32_t baud)
    10. {
    11.         stc_lpuart_cfg_t  stcCfg;
    12.     stc_gpio_cfg_t stcGpioCfg;
    13.         
    14.     DDL_ZERO_STRUCT(stcCfg);
    15.     DDL_ZERO_STRUCT(stcGpioCfg);
    16.    
    17.     Sysctrl_SetPeripheralGate(SysctrlPeripheralGpio,TRUE);        
    18.     ///<TX
    19.     stcGpioCfg.enDir =  GpioDirOut;
    20.     Gpio_Init(GpioPortB,GpioPin0,&stcGpioCfg);
    21.     Gpio_SetAfMode(GpioPortB,GpioPin0,GpioAf3); //配置PB00为LPUART0_TX
    22.    
    23.     //<RX
    24.     stcGpioCfg.enDir =  GpioDirIn;
    25.     Gpio_Init(GpioPortB,GpioPin11,&stcGpioCfg);
    26.     Gpio_SetAfMode(GpioPortB,GpioPin11,GpioAf3); //配置PB11为LPUART0_RX
    27.         
    28.     ///<外设模块时钟使能
    29.     Sysctrl_SetPeripheralGate(SysctrlPeripheralLpUart0,TRUE);   

    30.     ///<LPUART 初始化

    31. #if 0        
    32.         stcCfg.stcBaud.enSclkSel = LPUartMskPclk;        ///<传输时钟源:Pclk
    33.     stcCfg.stcBaud.u32Sclk = Sysctrl_GetPClkFreq();  ///<PCLK获取
    34.         
    35. #else        /*如果需要低功耗下LPuart中断唤醒,则需要选择RCL时钟*/
    36.          
    37.         Sysctrl_SetRCLTrim(SysctrlRclFreq38400);        ///< 配置RCL时钟为38.4kHz
    38.     Sysctrl_ClkSourceEnable(SysctrlClkRCL, TRUE);   ///< 使能RCL时钟
    39.         stcCfg.stcBaud.enSclkSel = LPUartMskRcl;        ///<传输时钟源:内部低速时钟
    40.     stcCfg.stcBaud.u32Sclk = 38400;               
    41. #endif        
    42.     stcCfg.enStopBit = LPUart1bit;                   ///<1停止位   
    43.     stcCfg.enMmdorCk = LPUartEven;                   ///<偶校验        
    44.     stcCfg.stcBaud.enSclkDiv = LPUartMsk4Or8Div;     ///<采样分频
    45.     stcCfg.stcBaud.u32Baud = baud;                   ///<波特率
    46.     stcCfg.enRunMode = LPUartMskMode1;               ///<工作模式
    47.     LPUart_Init(M0P_LPUART0, &stcCfg);                                 
    48.      
    49.     ///<LPUART 中断使能
    50.     LPUart_ClrStatus(M0P_LPUART0,LPUartRC);          ///<清接收中断请求
    51.     LPUart_ClrStatus(M0P_LPUART0,LPUartTC);          ///<清发送中断请求
    52.     LPUart_EnableIrq(M0P_LPUART0,LPUartRxIrq);      ///<使能接收中断
    53.     //LPUart_EnableIrq(M0P_LPUART0,LPUartTxIrq);       ///<使能发送中断
    54.     EnableNvic(LPUART0_IRQn,IrqLevel3,TRUE);         ///<系统中断使能        
    55. }
    复制代码

    2. 中断处理函数:只管接收就好

    1. ///<LPUART0 中断服务函数
    2. void LpUart0_IRQHandler(void)
    3. {
    4.         static int i = 0;
    5.         uint8_t rx_dat = 0;
    6.         
    7.         if(LPUart_GetStatus(M0P_LPUART0, LPUartTC))      
    8.     {
    9.         LPUart_ClrStatus(M0P_LPUART0, LPUartTC);      ///<清发送中断请求  
    10.     }

    11.     if(LPUart_GetStatus(M0P_LPUART0, LPUartRC))       ///接收数据中断
    12.     {
    13.         LPUart_ClrStatus(M0P_LPUART0, LPUartRC);      ///<清接收中断请求
    14.                
    15.         rx_dat = LPUart_ReceiveData(M0P_LPUART0);
    16.                 FifoPush( &fifo_mbus, rx_dat );///读取数据进入队列                        
    17.     }
    18. }
    复制代码

    3. 低功耗处理:低功耗也非常简单,并不需要初始化什么的,一个接口函数搞定,注意参数必须是False 低功耗放在while(1)中即可;

    1. while(1)
    2.         {
    3.                 mbus_cmd_parse();
    4. //delay1ms(200);
    5.                 GdGetVolumeData();               
    6.                 mbus_ack_process();
    7.                 //LowpowerMode_BeforeEnter_todo();         //功耗调试测试可以在这里进行
    8.                 //Lpm_GotoDeepSleep(FALSE); /*demo board, test 0.3uA */
    9.         }
    复制代码

    相关文章:HC32L30E8PA 低功耗串口设置

    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    小黑屋|路丝栈 ( 粤ICP备2021053448号 )

    GMT+8, 2024-12-22 20:15 , Processed in 0.043590 second(s), 18 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表