⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 uart3.c

📁 在LPC2132的ARM处理器上
💻 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 + -