1.结构介绍
1、数据帧格式
5744P的UART功能集成在LIN模块中,所以在LIN模块中介绍UART模式的使用。UART模式下的数据帧格式有8位、9位、16位和17位,其中8位和16位数据帧格式最后一位可为数据位也可为Parity位,9位和17位数据帧格式最后一位为Parity位。UART模式下用通过配置UARTCR寄存器中的WL1和WL0组成WL[1:0]来进行数据帧格式的选择。
2、缓存器格式
UART模式下,2个32位数据寄存器被分为8个8位的数据缓存器,其中高4个用于发送,低4个用于接收。当数据帧位格式为16位时,低八位为BDR0,高八位在BDR1,可用的收发数据缓存器各被分为2个。此外,UART模式可以通过配置UARTCR寄存器中TDFLTFC来选择进行数据收发的缓存器的个数。
3、波特率计算
LIN模块波特率的计算公式如下:
其中LFDIV由LINIBRR中的DIV_M和LINFBRR中的DIV_F共同决定。其中的关系如下:
LFDIV=DIV_M+DIV_F,若计算所得的波特率不是9600、19200等数或不是整数则取最接近的计算值即可。这里要特别注意的是进行波特率配置的LIN_CLK固定为系统时钟的一半,不需要配置,不是LIN模块使用的外设桥的时钟。
2.配置流程及示例
1、配置流程
UART模块主要需要配置波特率和帧数据格式,进行FIFO与缓存器收发方式的选择以及收发功能的使能等。在配置过程中除了模块模式的转换与中断等的设置,其余均有UART模式专用的寄存器。配置流程如下:
1)管脚复用;
2)运行模式的选择;
3)请求进入初始化模式并等待进入初始化模式;
4)配置波特率(波特率的时钟为系统时钟的一半,不是外设桥的时钟);
5)选择UART模式(在进行下面配置之前,需先选择UART模式);
6)数据格式的选择以及收发使能;
7)请求退出初始化模式并等待退出完成;
2、示例代码
void UART_UART0_Init()
{
//管脚复用
SIUL2.MSCR[18].B.OBE=1; //PB2 LIN0_UART TX
SIUL2.MSCR[18].B.SSS=1;
SIUL2.MSCR[19].B.IBE=1; //PB3 LIN0_UART RX
SIUL2.IMCR[165].B.SSS=1;
//运行模式的选择
MC_ME.PCTL204.B.RUN_CFG=0;
//UART配置
LINFlexD_0.LINCR1.B.SLEEP=0; //退出睡眠模式
LINFlexD_0.LINCR1.B.INIT=1;
while(LINFlexD_0.LINSR.B.LINS != 1); //请求进入初始化模式并等待进入初始化模式
LINFlexD_0.LINIBRR.B.IBR=48; //配置波特率为115200,IBRR=48,FBRR=13
LINFlexD_0.LINFBRR.B.FBR=13; //配置波特率为19200 ,IBRR=292,FBRR=15
LINFlexD_0.UARTCR.B.UART=1; //选择UART模式
LINFlexD_0.UARTCR.B.RFBM=0; //缓存器功能
LINFlexD_0.UARTCR.B.WL1=0;
LINFlexD_0.UARTCR.B.WL0=1;
LINFlexD_0.UARTCR.B.PCE=0; //数据格式:8数据位,无校验位
LINFlexD_0.UARTCR.B.RxEn=1; //允许接收
LINFlexD_0.UARTCR.B.TxEn=1; //允许发送
LINFlexD_0.LINIER.B.DRIE=1;
INTC_0.PSR[376].R=0x800E; //使能接收中断并设置中断优先级
LINFlexD_0.UARTSR.B.DTFTFF = 1; //清空接收发送标准位
LINFlexD_0.UARTSR.B.DRFRFE = 1;
LINFlexD_0.LINCR1.B.INIT=0;
while(LINFlexD_0.LINSR.B.LINS == 1); //请求退出初始化模式并等待退出初始化模式
}
3、收发过程
1.发送过程
UART的发送与SPI发送类似,将要发送的数据写入发送缓存器即可,数据发送完会置位UARTSR寄存器中的DTFTFF标志位,该位 写1清0,示例代码如下
void UART_UART0_Send(const uint8_t * p_info,const uint32_t info_num)
{
uint32_t index=0;
for(index=0;index<info_num;index++)
{
LINFlexD_0.BDRL.B.DATA0=p_info[index]; //发送数据
while(!LINFlexD_0.UARTSR.B.DTFTFF);
LINFlexD_0.UARTSR.B.DTFTFF=1; //等待数据发送完成并清除发送标准位
}
}
2、接收过程
UART模式接收可为中断结束和查询接收,本例以中断接收为例。UART模式下通过设置LINIER寄存器的DRIE位使能接收中断(需配置中断优先级方可生效),然后设计相应的中断函数即可。当数据接收完毕后会将数据存放到接收缓冲器并置位UARTSR寄存器中的DRFRFE位,该位需要软件清零。示例代码如下:
void UART_UART0_Init()
{
.
.
.
LINFlexD_0.LINIER.B.DRIE=1;
INTC_0.PSR[376].R=0x800E; //使能接收中断并设置中断优先级
.
.
.
}
void UART_UART0_RX_Isr(void)
{
.
.
.
GL_Rx_Data=LINFlexD_0.BDRM.R; //读取接收的数据
LINFlexD_0.UARTSR.B.DRFRFE=1; //清零接收标志位
.
.
.
}