📄 uart3.c
字号:
/********************************************************************************************************/
#define IN_UART3
#include "config.h"
static int UART3SendBuf[(UART3_SEND_QUEUE_LENGTH + sizeof(int) - 1) / sizeof(int)];
OS_EVENT *Uart3Sem;
/*********************************************************************************************************/
uint8 Uart3WriteFull(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 UART3Init(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(IER1, 0x80); // 设置串口复位
CH432T_SPI_Write(LCR1, 0x80); // 设置DLAB 为1
CH432T_SPI_Write(DLL1, low_byte); // 设置波特率除数寄存器-低位
CH432T_SPI_Write(DLM1, high_byte); // 设置波特率除数寄存器-高位
CH432T_SPI_Write(FCR1, 0x87); // 设置FIFO控制寄存器
CH432T_SPI_Write(LCR1, 0x03); // 设置线路控制寄存器
CH432T_SPI_Write(IER1, 0x01); // 设置中断使能寄存器
CH432T_SPI_Write(MCR1, 0x08); // 允许中断请求输出
if (QueueCreate((void *)UART3SendBuf,
sizeof(UART3SendBuf),
NULL,
(uint8 (*)())Uart3WriteFull)
== NOT_OK)
{
return FALSE;
}
Uart3Sem = OSSemCreate(0); // 用于中断返回收到的数据
return SUCCESS;
}
/*********************************************************************************************************/
void UART3Putch(uint8 Data)
{
uint8 uart_data;
OS_ENTER_CRITICAL();
uart_data = CH432T_SPI_Read(LSR1);
while ((uart_data & 0x20) == 0)
uart_data = CH432T_SPI_Read(LSR1);
CH432T_SPI_Write(THR1, Data);
OS_EXIT_CRITICAL();
}
/*********************************************************************************************************/
void UART3Write(uint8 *Data, uint16 NByte)
{
OS_ENTER_CRITICAL();
while (NByte-- > 0)
{
UART3Putch(*Data++);
}
OS_EXIT_CRITICAL();
}
/*********************************************************************************************************/
uint8 UART3Getch(void)
{
uint8 data, err;
OS_ENTER_CRITICAL();
data = CH432T_SPI_Read(LSR1);
while ((data & 0x01) == 0) /* 没有收到数据 */
{
OSSemPend(Uart3Sem, 0, &err); /* 等待接收数据 */
data = CH432T_SPI_Read(LSR1);
}
data = CH432T_SPI_Read(RBR1); /* 读取收到的数据 */
OS_EXIT_CRITICAL();
return data;
}
/*********************************************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -