📄 uart_ini.h
字号:
#include "com_cfg.h"
#include "config.h"
#include "UART_IRQ.h"
#define UARTBAUD 4800 // 未考虑小数分频器,所预期得到的波特率
#define UART0BAUD 38400 // 未考虑小数分频器,所预期得到的波特率
#define FDR 0 // 若该宏为0则不会启用小数分频器
/*********************************************************************************************************
** 函数名称 :ClrRcvFIFO
** 函数功能 :读空接收FIFO
** 入口参数 :无
** 出口参数 :无
*********************************************************************************************************/
void ClrU0RcvFIFO(void)
{
volatile uint32 i, temp = 0;
for (i = 0; i < 8; i++)
{
if ((U0LSR & 0x01) == 0x01)
{
temp = U0RBR; // 读空接收FIFO
}
else
{
break;
}
}
}
void ClrU1RcvFIFO(void)
{
volatile uint32 i, temp = 0;
for (i = 0; i < 8; i++)
{
if ((U1LSR & 0x01) == 0x01)
{
temp = U1RBR; // 读空接收FIFO
}
else
{
break;
}
}
}
void ClrU2RcvFIFO(void)
{
volatile uint32 i, temp = 0;
for (i = 0; i < 8; i++)
{
if ((U2LSR & 0x01) == 0x01)
{
temp = U2RBR; // 读空接收FIFO
}
else
{
break;
}
}
}
void ClrU3RcvFIFO(void)
{
volatile uint32 i, temp = 0;
for (i = 0; i < 8; i++)
{
if ((U3LSR & 0x01) == 0x01)
{
temp = U3RBR; // 读空接收FIFO
}
else
{
break;
}
}
}
/*********************************************************************************************************
** 函数名称:BaudGet
** 函数功能:计算当前的实际波特率
** 入口参数:无
** 出口参数:RealBaud 当前的实际波特率
**********************************************************************************************************/
/*
uint32 BaudGet(void)
{
uint16 dll, dlm;
uint32 Realbaud, div, mul;
// 读取除数锁存器和小数波特率发生器的值
U0LCR = 0x83; // DLAB=1
dlm = U0DLM;
dll = U0DLL;
div = U0FDR & 0x0F;
mul = (U0FDR >> 4) & 0x0F;
U0LCR = 0x03;
// 考虑进小数分频寄存器,计算实际波特率
Realbaud = mul * Fpclk / ( 16 * (256 * dlm + dll) * (mul + div) );
return (Realbaud);
}
*/
/*********************************************************************************************************
** 函数名称:UART0_Ini
** 函数功能:按默认值初始化串口0的引脚和通讯参数。设置为8位数据位,1位停止位,无奇偶校验,波特率。
** 入口参数:无
** 出口参数:无
**********************************************************************************************************/
void UART0_Ini(void)
{
uint32 Fdiv = 0;
// uint32 bak = 0;
/* 在PCONP里启用UART0 */
PCONP |= 1 << 3; // 使能UART0
/* 初始化引脚 */
PINSEL0 |= (0x01 << 4) | (0x01 << 6); // 设置P0.2和P0.3连接到UART0
/* 初始化串口通讯参数 */
U0LCR = 0x83; // 设置为8位数据位,1位停止位,无奇偶校验,DLAB=1, 允许设置波特率
Fdiv = (Fpclk / 16) / UART0BAUD; // 设置波特率
U0DLM = Fdiv / 256;
U0DLL = Fdiv % 256;
U0LCR = 0x03; // 令DLAB位为0
/* 设置FIFO */
U0FCR = 0x05; // 使能FIFO,并设置FIFO触发深度大小为1个字节
/* 清除接收FIFO内的数据 */
ClrU0RcvFIFO();
/* 初始化UART0 VIC 中断接口 */
VICIntEnClr |= 1 << UART0_INT;
VICVectPri6 = 0x05;
VICVectAddr6 = (uint32)IRQ_UART0Recv;
// VICVectAddr6 = (uint32)IRQ_UART0Send;
VICIntEnable |= 1 << UART0_INT;
IRQEnable();
/* 以下语句设置小数分频系数为0.5 */
#if FDR
U0FDR = (1 << 0) | // DIVADDVAL=1
(1 << 4); // MULVAL=1
#endif
}
/*********************************************************************************************************
** 函数名称:UART1_IniDft
** 函数功能:按默认值初始化串口1的引脚和通讯参数。设置为8位数据位,1位停止位,无奇偶校验,波特率。
** 入口参数:无
** 出口参数:无
**********************************************************************************************************/
void UART1_Ini(void)
{
uint32 Fdiv = 0;
PCONP |= (1 << 4); // 打开UART1
/* 初始化相关的I/O口 */
// PINSEL4 = (0x02 << 0) | (0x02 << 2); // 设置P2.0和P2.1管脚连接到UART1
PINSEL0 |= 0x01 << 30; // 设置P0.15和P0.16管脚连接到UART1
PINSEL1 |= 0x01 << 0;
/* 初始化串口通讯参数 */
U1LCR = 0x83; // 设置为8位数据位,1位停止位,无奇偶校验,DLAB=1,允许设置波特率
Fdiv = (Fpclk / 16) / UARTBAUD; // 设置波特率
U1DLM = Fdiv / 256;
U1DLL = Fdiv % 256;
U1LCR = 0x03; // 令DLAB位为0
/* 设置FIFO */
U1FCR = 0x05; // 使能FIFO,并设置FIFO触发深度大小为1个字节
// U1FCR = 0x85; // 使能FIFO,并设置FIFO触发深度大小为8个字节
// U1FCR = 0x04; // 禁能FIFO,
/* 清除接收FIFO内的数据 */
ClrU1RcvFIFO();
/* 初始化UART1 VIC 中断接口 */
VICIntEnClr |= 1 << UART1_INT;
VICVectPri7 = 0x06;
VICVectAddr7 = (uint32)IRQ_UART1Recv;
// VICVectAddr7 = (uint32)IRQ_UART1Send;
VICIntEnable |= 1 << UART1_INT;
IRQEnable();
// U1FCR &= ~0x07; // 禁用FIFO
// U1IER &= ~0x07; // 禁止UART产生中断
/* 以下语句设置小数分频系数为0.5 */
#if FDR
U1FDR = (1 << 0) | // DIVADDVAL=1
(1 << 4); // MULVAL=1
#endif
}
/*********************************************************************************************************
** 函数名称:UART2_IniDft
** 函数功能:按默认值初始化串口2的引脚和通讯参数。设置为8位数据位,1位停止位,无奇偶校验,波特率
** 入口参数:无
** 出口参数:无
**********************************************************************************************************/
void UART2_Ini(void)
{
uint32 Fdiv = 0;
PCONP |= (1 << 24); // 打开UART2
/* 初始化相关的I/O口 */
// PINSEL0 |= (0x01 << 20) | (0x01 << 22); // 设置P0.10和P0.11管脚连接到UART2
PINSEL0 = (PINSEL0 & 0xFF0FFFFF) | (0x05 << 20);
/* 初始化串口通讯参数 */
U2LCR = 0x83; // 设置为8位数据位,1位停止位,无奇偶校验,DLAB=1,允许设置波特率
Fdiv = (Fpclk / 16) / UARTBAUD; // 设置波特率
U2DLM = Fdiv / 256;
U2DLL = Fdiv % 256;
U2LCR = 0x03; // 令DLAB位为0
/* 设置FIFO */
// U2FCR = 0x05; // 使能FIFO,并设置FIFO触发深度大小为1个字节
U2FCR = 0x04; // 使能FIFO,并设置FIFO触发深度大小为1个字节
/* 清除接收FIFO内的数据 */
ClrU2RcvFIFO();
/* 初始化UART1 VIC 中断接口 */
VICIntEnClr |= 1 << UART2_INT;
VICVectPri28 = 0x06;
VICVectAddr28 = (uint32)IRQ_UART2Recv;
// VICVectAddr28 = (uint32)IRQ_UART2Send;
VICIntEnable |= 1 << UART2_INT;
IRQEnable();
// U1FCR &= ~0x07; // 禁用FIFO
// U1IER &= ~0x07; // 禁止UART产生中断
/* 以下语句设置小数分频系数为0.5 */
#if FDR
U2FDR = (1 << 0) | // DIVADDVAL=1
(1 << 4); // MULVAL=1
#endif
}
/*
void UART2_IniDft(void)
{
uint32 Fdiv = 0;
PCONP |= 1 << 24; // 打开UART2
// 初始化相关的I/O口
PINSEL0 = (0x01 << 20) | (0x01 << 22); // 设置P0.10和P0.11管脚连接到UART2
// 初始化串口通讯参数
U2LCR = 0x83; // 设置为8位数据位,1位停止位,无奇偶校验,DLAB=1,允许设置波特率
Fdiv = (Fpclk / 16) / UARTBAUD; // 设置波特率
U2DLM = Fdiv / 256;
U2DLL = Fdiv % 256;
U2LCR = 0x03; // 令DLAB位为0
U2FCR &= ~0x07; // 禁用FIFO
U2IER &= ~0x07; // 禁止UART产生中断
// 以下语句设置小数分频系数为0.5
#if FDR
U2FDR = (1 << 0) | // DIVADDVAL=1
(1 << 4); // MULVAL=1
#endif
}
*/
/*********************************************************************************************************
** 函数名称:UART3_IniDft
** 函数功能:按默认值初始化串口3的引脚和通讯参数。设置为8位数据位,1位停止位,无奇偶校验,波特率
** 入口参数:无
** 出口参数:无
**********************************************************************************************************/
void UART3_Ini(void)
{
uint32 Fdiv = 0;
PCONP |= 1 << 25; // 打开UART3
/* 初始化相关的I/O口 */
// PINSEL0 = (0x02 << 0) | (0x02 << 2); // 设置P0.0和P0.1连接到UART3
PINSEL0 = (PINSEL0 & 0xFFFFFFF0) | (0x0A << 0);
/* 初始化串口通讯参数 */
U3LCR = 0x83; // 设置为8位数据位,1位停止位,无奇偶校验,DLAB=1,允许设置波特率
Fdiv = (Fpclk / 16) / UARTBAUD; // 设置波特率
U3DLM = Fdiv / 256;
U3DLL = Fdiv % 256;
U3LCR = 0x03; // 令DLAB位为0
/* 设置FIFO */
// U3FCR = 0x05; // 使能FIFO,并设置FIFO触发深度大小为1个字节
U3FCR = 0x04; // 使能FIFO,并设置FIFO触发深度大小为1个字节
/* 清除接收FIFO内的数据 */
ClrU3RcvFIFO();
/* 初始化UART1 VIC 中断接口 */
VICIntEnClr |= 1 << UART3_INT;
VICVectPri29 = 0x06;
VICVectAddr29 = (uint32)IRQ_UART3Recv;
// VICVectAddr29 = (uint32)IRQ_UART3Send;
VICIntEnable |= 1 << UART3_INT;
IRQEnable();
// U1FCR &= ~0x07; // 禁用FIFO
// U1IER &= ~0x07; // 禁止UART产生中断
/* 以下语句设置小数分频系数为0.5 */
#if FDR
U3FDR = (1 << 0) | // DIVADDVAL=1
(1 << 4); // MULVAL=1
#endif
}
/*
void UART3_IniDft(void)
{
uint32 Fdiv = 0;
PCONP |= 1 << 25; // 打开UART3
// 初始化相关的IO
//PINSEL9 = (0x03 << 24) | (0x03 << 26); // 设置P4.28和P4.29连接到UART3
PINSEL0 = (0x02 << 0) | (0x02 << 2); // 设置P0.0和P0.1连接到UART3
// 初始化串口通讯参数
U3LCR = 0x83; // 设置为8位数据位,1位停止位,无奇偶校验,DLAB=1,允许设置波特率
Fdiv = (Fpclk / 16) / UARTBAUD; // 设置波特率
U3DLM = Fdiv / 256;
U3DLL = Fdiv % 256;
U3LCR = 0x03; // 令DLAB位为0
U3FCR &= ~0x07; // 禁用FIFO
U3IER &= ~0x07; // 禁止UART产生中断
// 以下语句设置小数分频系数为0.5
#if FDR
U3FDR = (1 << 0) | // DIVADDVAL=1
(1 << 4); // MULVAL=1
#endif
}
*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -