搜索

[方案相关] 【分享】华大HC32L130使用LPuart接收唤醒,妥妥的!数据不丢!

[复制链接]
123|1
 楼主 | 2020-11-15 10:14 | 显示全部楼层 |阅读模式
一开始的疑虑是,接收会不会丢数据,毕竟是从睡眠中唤醒的。
实际实验得出结论,还不错!
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.         }
复制代码


周末愉快!


使用特权

评论回复

评论

smartpower 2020-11-15 13:01 回复TA
nb 
扫描二维码,随时随地手机跟帖
您需要登录后才可以回帖 登录 | 注册

本版积分规则

我要发帖 我要提问 投诉建议 申请版主

快速回复

您需要登录后才可以回帖
登录 | 注册
高级模式

论坛热帖

在线客服 快速回复 返回顶部 返回列表