📄 uart0.c
字号:
#include "..\src\config.h"
/****************************************************************************
* 名称:uart0_pin_set()
* 功能:串口0 引脚配置
* 返回值:无
****************************************************************************/
void uart0_pin_set()
{
PINSEL0 &= 0xfffffff5; // PINSEL0[3:0] = 0b0101
PINSEL0 |= 0x00000005;
PINSEL0 &= 0xfffff3ff; // UART0CNTL485
IO0DIR |= UART0CNTL485;
IO0CLR = UART0CNTL485;
}
/****************************************************************************
* 名称:uart0_baudrate_set()
* 功能:串口0 波特率设置
* 入口参数:
* BaudRate: 波特率 300,600,1200,2400,4800,9600,
* 19200,38400,43000,56000,57600,115200
* 返回值:无
****************************************************************************/
void uart0_baudrate_set(uint32 BaudRate)
{
switch(BaudRate)
{
case 300 :
case 600 :
case 1200 :
case 2400 :
case 4800 :
case 9600 :
case 19200 :
case 38400 :
case 43000 :
case 56000 :
case 57600 :
case 115200 :
U0LCR |= 0x80; // DLAB = 1
BaudRate = (Fpclk >> 4) / BaudRate;
U0DLM = BaudRate >> 8;
U0DLL = BaudRate & 0xff;
U0LCR &= 0x7f; // DLAB = 0
break;
}
}
/****************************************************************************
* 名称:uart0_bytelen_set()
* 功能:串口0 字符长度设置
* 入口参数:
* ByteLen: 字符长度 5,6,7,8
* 返回值:无
****************************************************************************/
void uart0_bytelen_set(uint8 ByteLen)
{
switch(ByteLen)
{
case 5 :
U0LCR &= 0xfc; // U0LCR[1:0] = 0b00
break;
case 6 :
U0LCR &= 0xfd; // U0LCR[1:0] = 0b01
U0LCR |= 0x01;
break;
case 7 :
U0LCR &= 0xfe; // U0LCR[1:0] = 0b10
U0LCR |= 0x02;
break;
case 8 :
U0LCR |= 0x03; // U0LCR[1:0] = 0b11
break;
}
}
/****************************************************************************
* 名称:uart0_stoplen_set()
* 功能:串口0 停止位设置
* 入口参数:
* StopLen: 停止位个数 1,2
* 返回值:无
****************************************************************************/
void uart0_stoplen_set(uint8 StopLen)
{
switch(StopLen)
{
case 1 :
U0LCR &= 0xfb; // U0LCR[2] = 0b0
break;
case 2 :
U0LCR |= 0x04; // U0LCR[2] = 0b1
break;
}
}
/****************************************************************************
* 名称:uart0_parity_set()
* 功能:串口0 奇偶位设置
* 入口参数:
* Parity : 奇偶位选择 0-奇校验,1-偶校验,2-强制为1,3-强制为0,4-无校验
* 返回值:无
****************************************************************************/
void uart0_parity_set(uint8 Parity)
{
switch(Parity)
{
case ODD :
U0LCR &= 0xcf; // U0LCR[5:3] = 0b001
U0LCR |= 0x08;
break;
case EVEN :
U0LCR &= 0xdf; // U0LCR[5:3] = 0b011
U0LCR |= 0x18;
break;
case ALWAYS1 :
U0LCR &= 0xef; // U0LCR[5:3] = 0b101
U0LCR |= 0x28;
break;
case ALWAYS0 :
U0LCR |= 0x38; // U0LCR[5:3] = 0b111
break;
case NOCHECK :
U0LCR &= 0xf7; // U0LCR[5:3] = 0bxx0
break;
}
}
/****************************************************************************
* 名称:uart0_space_enable()
* 功能:串口0 间隔帧使能
* 入口参数:无
* 返回值:无
****************************************************************************/
void uart0_space_enable()
{
U0LCR |= 0x40; // U0LCR[6] = 0b1
}
/****************************************************************************
* 名称:uart0_space_disable()
* 功能:串口0 间隔帧禁止
* 入口参数:无
* 返回值:无
****************************************************************************/
void uart0_space_disable()
{
U0LCR &= 0xbf; // U0LCR[6] = 0b0
}
/****************************************************************************
* 名称:uart0_fifodepth_set()
* 功能:串口0 FIFO 深度设置
* 入口参数:
* FifoDepth: 1个字符,4个字符,8个字符,14个字符
* 返回值:无
****************************************************************************/
void uart0_fifodepth_set(uint8 FifoDepth)
{
switch(FifoDepth)
{
case 1 :
U0FCR = 0x01; // U0FCR[7:6] = 0b00,U0FCR[0] = 0b1
break;
case 4 :
U0FCR = 0x41; // U0FCR[7:6] = 0b01,U0FCR[0] = 0b1
break;
case 8 :
U0FCR = 0x81; // U0FCR[7:6] = 0b10,U0FCR[0] = 0b1
break;
case 14 :
U0FCR = 0xc1; // U0FCR[7:6] = 0b11,U0FCR[0] = 0b1
break;
}
}
/****************************************************************************
* 名称:uart0_rxfifo_reset()
* 功能:串口0 接收 FIFO 复位
* 入口参数:无
* 返回值:无
****************************************************************************/
void uart0_rxfifo_reset()
{
U0FCR |= 0x02; // U0FCR[1] = 0b1
}
/****************************************************************************
* 名称:uart0_txfifo_reset()
* 功能:串口0 发送 FIFO 复位
* 入口参数:无
* 返回值:无
****************************************************************************/
void uart0_txfifo_reset()
{
U0FCR |= 0x04; // U0FCR[2] = 0b1
}
/****************************************************************************
* 名称:uart0_sendbyte_software()
* 功能:串口0 软件查询方式发送一个字节
* 入口参数:
* SendByte: 待发送字节
* 返回值:无
****************************************************************************/
void uart0_sendbyte_software(uint8 SendByte)
{
U0THR = SendByte;
while( (U0LSR & 0x20) == 0 ); // 等待数据发送
}
/****************************************************************************
* 名称:uart0_sendqueue_software()
* 功能:串口0 软件查询方式发送一个队列
* 16字节收发FIFO
* 入口参数:
* QueueP: 队列指针
* QueueLen: 队列长度
* 返回值:无
****************************************************************************/
/****************************************************************************
*while( (U0LSR & 0x20) == 0 ); -- U0THR(发送保持器)空
*while( (U0LSR&0x40)==0 ); -- U0THR(发送保持器)空 并且 U0TSR(发送寄存器)空
****************************************************************************/
void uart0_sendqueue_software(uint8 *QueueP, uint8 QueueLen)
{
uint8 dcnt;
while(QueueLen>15)
{
for(dcnt = 0; dcnt < 16; dcnt++, QueueLen--)
{
U0THR = *QueueP++;
}
while( (U0LSR & 0x20) == 0 ); // 等待数据发送
}
while(QueueLen--)
{
U0THR = *QueueP++;
}
while( (U0LSR & 0x20) == 0 ); // 等待数据发送
}
/****************************************************************************
* 名称:uart0_receivebyte_software()
* 功能:串口0 软件查询方式接收一个字节
* 入口参数:无
* 返回值:
* RcvByte: 接收字节
****************************************************************************/
uint8 uart0_receivebyte_software()
{
while( (U0LSR & 0x01) == 0 ); // 等待接收数据
return U0RBR;
}
/****************************************************************************
* 名称:uart0_rbrint_enable()
* 功能:串口0 接收中断允许
* 入口参数:无
* 返回值:无
****************************************************************************/
void uart0_rbrint_enable()
{
U0IER |= 0x01;
}
/****************************************************************************
* 名称:uart0_rbrint_disable()
* 功能:串口0 接收中断禁止
* 入口参数:无
* 返回值:无
****************************************************************************/
void uart0_rbrint_disable()
{
U0IER &= 0xfe;
}
/****************************************************************************
* 名称:uart0_threint_enable()
* 功能:串口0 发送中断允许
* 入口参数:无
* 返回值:无
* 可查询寄存器: U0LSR[5]
****************************************************************************/
void uart0_threint_enable()
{
U0IER |= 0x02;
}
/****************************************************************************
* 名称:uart0_threint_disable()
* 功能:串口0 发送中断禁止
* 入口参数:无
* 返回值:无
* 可查询寄存器: U0LSR[5]
****************************************************************************/
void uart0_threint_disable()
{
U0IER &= 0xfd;
}
/****************************************************************************
* 名称:uart0_rxint_enable()
* 功能:串口0 线状态中断允许
* 入口参数:无
* 返回值:无
* 可查询寄存器: U0LSR[4:1]
****************************************************************************/
void uart0_rxint_enable()
{
U0IER |= 0x04;
}
/****************************************************************************
* 名称:uart0_rxint_disable()
* 功能:串口0 线状态中断禁止
* 入口参数:无
* 返回值:无
* 可查询寄存器: U0LSR[4:1]
****************************************************************************/
void uart0_rxint_disable()
{
U0IER &= 0xfb;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -