| 
 | 
 
路线栈欢迎您!
您需要 登录 才可以下载或查看,没有帐号?立即注册 
 
 
 
x
 
开始的疑虑是,接收会不会丢数据,毕竟是从睡眠中唤醒的。实际实验得出结论,还不错! 
 
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 */
 
 -         }
 
  复制代码 
相关文章:HC32L30E8PA 低功耗串口设置 
 
 |   
 
 
 
 |