CMT2380F32模块开发13-低功耗同步异步收发器例程

Posted andylauren

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CMT2380F32模块开发13-低功耗同步异步收发器例程相关的知识,希望对你有一定的参考价值。

本产品带有1个LPUART模块,该模块支持半双工和全双工传输;支持 8bit、9bit 数据格式;支持 Mode0/1/2/3两种不同传输模式;波特率即可由外部 TIMER2 产生,也可以由模块内部逻辑产生;支持多机通讯模式;支持自动地址识别;支持给定地址和广播地址。

例程提供了正常模式下的普通串口应用,和低功耗模式下的唤醒应用,没有提供多机通讯的例程,需要使用的可以参考uart例程。

lpuart_nomal

本样例主要涉及LPUART正常工作模式的数据收发功能

    Clk_SetPeripheralGate(ClkPeripheralLpUart, TRUE);  //使能LPUART时钟
    Clk_SetPeripheralGate(ClkPeripheralBt, TRUE);

    //通道端口配置
    Gpio_InitIOExt(3, 3, GpioDirOut, TRUE, FALSE, FALSE, FALSE);
    Gpio_InitIOExt(3, 4, GpioDirOut, TRUE, FALSE, FALSE, FALSE);

    Gpio_SetFunc_UART2RX_P33();
    Gpio_SetFunc_UART2TX_P34();

    Gpio_InitIOExt(T1_PORT, T1_PIN, GpioDirIn, TRUE, FALSE, FALSE, TRUE);

    stcLpuart_clk.enSclk_sel = LPUart_Pclk;  // LPUart_Rcl;

    stcLpuart_clk.enSclk_Prs = LPUartDiv1;
    stcConfig.pstcLpuart_clk = &stcLpuart_clk;

    stcRunMode.enLpMode = LPUartNoLPMode;  //正常工作模式或低功耗工作模式配置
    stcRunMode.enMode = LPUartMode3;
    stcConfig.pstcRunMode = &stcRunMode;

    stcLPUartIrqCb.pfnRxIrqCb = RxIntCallback;
    stcLPUartIrqCb.pfnTxIrqCb = NULL;
    stcLPUartIrqCb.pfnRxErrIrqCb = ErrIntCallback;
    stcConfig.pstcIrqCb = &stcLPUartIrqCb;
    stcConfig.bTouchNvic = TRUE;

    stcMulti.enMulti_mode = LPUartNormal;  //只有模式2/3才有多主机模式

    stcConfig.pstcMultiMode = &stcMulti;

    LPUart_EnableIrq(LPUartRxIrq);

    LPUart_Init(&stcConfig);

    if (LPUart_Pclk == stcLpuart_clk.enSclk_sel)
        u32sclk = Clk_GetPClkFreq();
    else if (LPUart_Rcl == stcLpuart_clk.enSclk_sel)
        u32sclk = 38400;  //此处建议用户使用内部38.4K时钟,如果用户使用32.768K时钟的,此处更新成32768
    else
        u32sclk = 32768;

    stcBaud.u32Baud = 2400;
    stcBaud.bDbaud = 0;
    stcBaud.u8LpMode = LPUartNoLPMode;
    stcBaud.u8Mode = LPUartMode3;
    u16timer = LPUart_SetBaudRate(u32sclk, stcLpuart_clk.enSclk_Prs, &stcBaud);
    stcBtConfig.enMD = BtMode2;
    stcBtConfig.enCT = BtTimer;
    stcBtConfig.enTog = BtTogEnable;
    Bt_Init(TIM2, &stcBtConfig);  //调用basetimer2设置函数产生波特率
    Bt_ARRSet(TIM2, u16timer);
    Bt_Cnt16Set(TIM2, u16timer);
    Bt_Run(TIM2);

    LPUart_EnableFunc(LPUartRx);
    while (1) 
        CheckFlg = 0;
        if (u8RxFlg) 
            u8RxFlg = 0;
            if (LPUart_CheckEvenOrOdd(Even, u8RxData[1]) != Ok) 
                CheckFlg = 1;  //奇偶校验出错
             else 
                LPUart_SetTb8(Even, u8RxData[0]);
                LPUart_SendData(u8RxData[0]);
                LPUart_SetTb8(Even, u8RxData[1]);
                LPUart_SendData(u8RxData[1]);
            
        
    

在中断回调中填充返回的数据

void RxIntCallback(void)

    u8RxData[1] = M0P_LPUART->SBUF;
    u8RxFlg = 1;

用串口线连接PC机与P33/P34,设定串口调试工具2400bps、偶校验、1stop。
PC端口发送MCU 1字节数据,串口终端收到相应的'U'+1字节数据。

lpuart_lpmode

本样例主要涉及LPUART进出深度休眠模式的数据接收功能

与上一个例程不同的地方,按下按键1会进入低功耗,接收到数据后在while中进行数据比较。


    while (1 == Gpio_GetIO(T1_PORT, T1_PIN))
        ;  //注意:此处用户不能屏蔽,否则进入深度休眠模式导致SWD连接不上
    Gpio_SetIO(1, 4, 0);
    Lpm_Config(&stcLpmCfg);
    Lpm_GotoLpmMode();
    Gpio_SetIO(1, 4, 1);

    while (1) 
        if ((u8RxData[0] == 0x55) && (u8RxData[1] == 0x44) && (u8RxData[2] == 0x33) && (u8RxData[3] == 0x22) &&
            (u8RxData[4] == 0x11)) 
            u8RxCnt = 0;
            Gpio_SetIO(2, 3, 0);
        
    

用串口线发送端连P33、接收端连P34。按键P02端口拉低进入低功耗,LED2点亮。
设定串口调试工具9600bps、偶校验、1stop。
PC串口连续发送字节0x55 0x44 0x33 0x22 0x11 之后LED1,LED3点亮,LED2熄灭,如果数据不符,LED3点亮,LED2熄灭。

以上是关于CMT2380F32模块开发13-低功耗同步异步收发器例程的主要内容,如果未能解决你的问题,请参考以下文章

CMT2380F32模块开发4-UART例程

CMT2380F32模块开发4-UART例程

CMT2380F32模块开发7-reset例程

CMT2380F32模块开发7-reset例程

CMT2380F32模块开发10-高级定时器例程

CMT2380F32模块开发10-高级定时器例程