一开始的疑虑是,接收会不会丢数据,毕竟是从睡眠中唤醒的。
实际实验得出结论,还不错!
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 */
}
周末愉快!
|
nb