|
路线栈欢迎您!
您需要 登录 才可以下载或查看,没有帐号?立即注册
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 低功耗串口设置
|
|