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-低功耗同步异步收发器例程的主要内容,如果未能解决你的问题,请参考以下文章