📄 uart2.c
字号:
/********************************************************************************************************/
#define IN_UART2
#include "config.h"
static int UART2SendBuf[(UART2_SEND_QUEUE_LENGTH + sizeof(int) - 1) / sizeof(int)];
static OS_EVENT *Uart2Sem;
extern OS_EVENT *Uart3Sem;
/*********************************************************************************************************/
uint8 Uart2WriteFull(DataQueue *Buf, QUEUE_DATA_TYPE Data, uint8 Mod)
{
uint16 temp;
Mod = Mod;
temp = QueueSize((void *)Buf);
while (temp <= QueueNData((void *)Buf)) /* 等待数据队列不满 */
{
OSTimeDly(OS_TICKS_PER_SEC / 200);
}
return QueueWrite((void *)Buf, Data); /* 数据重新入队 */
}
/*********************************************************************************************************/
uint8 UART2Init(uint32 bps)
{
uint8 high_byte, low_byte;
uint16 Fdiv;
Fdiv = (SYS_CLOCK / 16) / bps; // 设置波特率
high_byte = Fdiv / 256;
low_byte = Fdiv % 256;
CH432T_SPI_Write(IER0, 0x80); // 设置串口复位
CH432T_SPI_Write(LCR0, 0x80); // 设置DLAB 为1
CH432T_SPI_Write(DLL0, low_byte); // 设置波特率除数寄存器-低位
CH432T_SPI_Write(DLM0, high_byte); // 设置波特率除数寄存器-高位
CH432T_SPI_Write(FCR0, 0x87); // 设置FIFO控制寄存器
CH432T_SPI_Write(LCR0, 0x03); // 设置线路控制寄存器
CH432T_SPI_Write(IER0, 0x01); // 设置中断使能寄存器
CH432T_SPI_Write(MCR0, 0x08); // 允许中断请求输出
if (QueueCreate((void *)UART2SendBuf,
sizeof(UART2SendBuf),
NULL,
(uint8 (*)())Uart2WriteFull)
== NOT_OK)
{
return FALSE;
}
Uart2Sem = OSSemCreate(0); // 用于中断返回收到的数据
return SUCCESS;
}
/*********************************************************************************************************/
void UART2Putch(uint8 Data)
{
uint8 uart_data;
OS_ENTER_CRITICAL();
uart_data = CH432T_SPI_Read(LSR0);
while ((uart_data & 0x20) == 0)
uart_data = CH432T_SPI_Read(LSR0);
CH432T_SPI_Write(THR0, Data);
OS_EXIT_CRITICAL();
}
/*********************************************************************************************************/
void UART2Write(uint8 *Data, uint16 NByte)
{
OS_ENTER_CRITICAL();
while (NByte-- > 0)
{
UART2Putch(*Data++);
}
OS_EXIT_CRITICAL();
}
/*********************************************************************************************************/
uint8 UART2Getch(void)
{
uint8 data, err;
OS_ENTER_CRITICAL();
data = CH432T_SPI_Read(LSR0);
while ((data & 0x01) == 0) /* 没有收到数据 */
{
OSSemPend(Uart2Sem, 0, &err); /* 等待接收数据 */
data = CH432T_SPI_Read(LSR0);
}
data = CH432T_SPI_Read(RBR0); /* 读取收到的数据 */
OS_EXIT_CRITICAL();
return data;
}
/*********************************************************************************************************/
void UART23_Exception(void)
{
uint8 data;
OS_ENTER_CRITICAL();
data = CH432T_SPI_Read(IIR0);
switch (data & 0x0f)
{
case 0x04: // 收到8个数据,均在FIFO中
OSSemPost(Uart2Sem);
break;
case 0x0c: // 收到小于8个数据,均在FIFO中
OSSemPost(Uart2Sem);
break;
case 0x06:
CH432T_SPI_Read(LSR0);
break;
case 0x02:
CH432T_SPI_Read(IIR0);
break;
default:
CH432T_SPI_Read(IIR0);
break;
}
data = CH432T_SPI_Read(IIR1);
switch (data & 0x0f)
{
case 0x04: // 收到8个数据,均在FIFO中
OSSemPost(Uart3Sem);
break;
case 0x0c: // 收到小于8个数据,均在FIFO中
OSSemPost(Uart3Sem);
break;
case 0x06:
CH432T_SPI_Read(LSR1);
break;
case 0x02:
CH432T_SPI_Read(IIR1);
break;
default:
CH432T_SPI_Read(IIR1);
break;
}
EXTINT |= 0x01; //清除EINT2中断标志
VICVectAddr = 0; // 通知中断控制器中断结束
OS_EXIT_CRITICAL();
}
/*********************************************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -