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

📄 uart2.c

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