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

📄 w90p710_aic.c

📁 基于中断的串口驱动~~~~~~~~~~~~~~~~~~
💻 C
字号:
/****************************************************************************
 *				北京科银京成技术有限公司 版权所有
 *
 * 		Copyright (C) 2000-2006 CoreTek Systems Inc. All Rights Reserved.
 ***************************************************************************/

/*
 * 修改记录:
 *
 *
 */

/**
 * @file 	W90p710_aic.c
 * @brief
 *	<li>功能:实现各功能函数。 </li>
 * @date
 */

/**************************** 引用部分 *****************************************/
#include "W90P710_BSP.H"
#include "W90P710_REG.H"
#include "W90p710_aic.h"
#include "driver_buffer.h"

/*************************** 前向声明部分 ****************************************/


/*************************** 串口中断声明部分 ****************************************/
//中断状态定义
#define RLS  0x6
#define RDA  0x4
#define TOUT 0xC
#define THRE 0x2

//UART0_ISR
#define UART0_FIFO_SIZE 16		//串口硬件提供的FIFO大小
extern DBuffer Uart0_RXDBuf;	//接收缓冲区
extern DBuffer Uart0_TXDBuf;	//发送缓冲区

//UART1_ISR
#define UART1_FIFO_SIZE 16
extern DBuffer Uart1_RXDBuf;
extern DBuffer Uart1_TXDBuf;

/*************************** 键盘中断声明部分 ****************************************/
extern DBuffer Keypad_DBuf;		//键盘缓冲区

/**************************** 定义部分 *****************************************/
typedef void (*PFNCT)(void);

//用于设备中断处理的函数指针数组
PFNCT ISR[31]={
		W90P710_WDT_INT_ISR,
		W90P710_nIRQ0_INT_ISR,
		W90P710_nIRQ1_INT_ISR,
		W90P710_nIRQ2_INT_ISR,
		W90P710_nIRQ3_INT_ISR,
		W90P710_AC97_INT_ISR,
		W90P710_LCD_INT_ISR,
		W90P710_RTC_INT_ISR,
		W90P710_UART0_INT_ISR,
		W90P710_UART1_INT_ISR,
		W90P710_UART2_INT_ISR,
		W90P710_UART3_INT_ISR,
		W90P710_T0_INT_ISR,
		W90P710_T1_INT_ISR,
		W90P710_USBH0_INT_ISR,
		W90P710_USBH1_INT_ISR,
		W90P710_EMCTX_INT_ISR,
		W90P710_EMCRX_INT_ISR,
		W90P710_GDMA0_INT_ISR,
		W90P710_GDMA1_INT_ISR,
		W90P710_SD_INT_ISR,
		W90P710_USBD_INT_ISR,
		W90P710_SC0_INT_ISR,
		W90P710_SC1_INT_ISR,
		W90P710_I2C0_INT_ISR,
		W90P710_I2C1_INT_ISR,
		W90P710_SSP_INT_ISR,
		W90P710_PWM_INT_ISR,
		W90P710_KPI_INT_ISR,
		W90P710_PS2_INT_ISR,
		W90P710_IRQ45_INT_ISR
	};


/**************************** 实现部分 *****************************************/


//开启某中断
void  W90P710_AIC_EnableInt(int vector)
{
	//定义掩码局部变量
	unsigned int mask;

	//判断中断号是否越界
    if((vector < INTERRUPT_VECTOR_BEGIN )||(vector > INTERRUPT_VECTOR_END))
    {
		return ;
	}
	
	//用掩码暂存中断号
    mask = 1 << vector;

	//关闭所有中断 
//	REG_UINT32_VALUE(REG_AIC_MDCR) = 0xFFFFFFFE;

    //打开中断号对应的中断通道
	REG_UINT32_VALUE(REG_AIC_MECR) = ( mask | REG_UINT32_VALUE(REG_AIC_IMR));
} 


//关闭某中断
void W90P710_AIC_DisableInt(int vector)			
{
	//定义掩码局部变量
	unsigned int mask;
	
	//判断中断号是否越界
    if((vector < INTERRUPT_VECTOR_BEGIN )||(vector > INTERRUPT_VECTOR_END))
    {
		return ;
	}

	//用掩码暂存中断号
    mask = 1 << vector;
    
    //关闭所有中断 
	REG_UINT32_VALUE(REG_AIC_MDCR) = 0xFFFFFFFE;
    
	//开启其他中断
	REG_UINT32_VALUE(REG_AIC_MDCR) = ( ~mask & REG_UINT32_VALUE(REG_AIC_IMR) );
}



//中断处理函数 第二级:根据中断号跳转至相应的设备处理函数
void W90P710_CPU_ISR_Handler()				
{
	int vector;	

	//读取中断号
	vector = REG_UINT32_VALUE(REG_AIC_IPER);

	//对中断号右移处理,因在寄存器中中断号存储在[6:0]						
	vector >>= 2;
	
	//跳转至相应的中断处理函数,减一是为了对齐数组下标
	if(0 != vector)
	{
		if(REG_UINT32_VALUE(REG_AIC_ISNR) == vector)
		{
			(*ISR[vector-1])();
			//向AIC_EOSCR中写入任意值,表明中断处理完成,
			REG_UINT32_VALUE(REG_AIC_EOSCR) = 1;
		}
	}
}


//中断设备处理函数定义
void	W90P710_WDT_INT_ISR(){return;}
void	W90P710_nIRQ0_INT_ISR(){return;}
void	W90P710_nIRQ1_INT_ISR(){return;}
void	W90P710_nIRQ2_INT_ISR(){return;}
void	W90P710_nIRQ3_INT_ISR(){return;}
void	W90P710_AC97_INT_ISR(){return;}
void	W90P710_LCD_INT_ISR(){return;}
void	W90P710_RTC_INT_ISR(){return;}

void	W90P710_UART0_INT_ISR()
{
	unsigned int IIRvalue;
	unsigned char myChar,irqType,rftls,i,j;
	
	//读IIR寄存器
	REG_READ_UINT32(REG_UART0_IIR,IIRvalue);
	
	i=(unsigned char)(IIRvalue&(BIT5|BIT6));	//获取IIR寄存器中RFTLS的设置
	//根据RFTLS的设置给rftls变量赋值
	switch(i)
	{
		case 0: rftls=1;break;
		case 1: rftls=4;break;
		case 2: rftls=8;break;
		case 3: rftls=14;break;
		default: rftls=1;break;
	}	
	irqType=(unsigned char)(IIRvalue&0x0F);	//判断中断类型
	
	switch(irqType)
	{
		//RDA、TOUT中断处理:接收数据
		case RDA:
		case TOUT:
			while(Uart0_RXDBuf.length < Uart0_RXDBuf.size && rftls>0)   //接收缓冲区未满则接收rftls个数据
			{
				myChar=REG_UINT32_VALUE(REG_UART0_RBR)&0xFF;
				rftls--;
				DBuffer_Write(&Uart0_RXDBuf,myChar);
			}
			if(Uart0_RXDBuf.length == Uart0_RXDBuf.size)
				REG_UINT32_VALUE(REG_UART0_IER)&=~BIT0;	//缓冲区满则关接收中断	
			break;
			
		//THRE中断处理:发送数据	
		case THRE:
			if(Uart0_TXDBuf.length >= UART0_FIFO_SIZE)	//若发送缓冲区数据数多于硬件FIFO长度,则一次先发送FIFO长度个数据
			{
				for(i=0;i<UART0_FIFO_SIZE;i++)
				{
					DBuffer_Read(&Uart0_TXDBuf,&myChar);
					REG_WRITE_UINT32(REG_UART0_THR,(REG_UINT32_VALUE(REG_UART0_THR)&0xFFFFFF00)|myChar);
				}
			}
			else if(Uart0_TXDBuf.length > 0)	//若发送缓冲区数据数小于硬件FIFO长度,则将发送缓冲区的数据一次发送
			{
				j=Uart0_TXDBuf.length;
				for(i=0;i < j;i++)
				{
					DBuffer_Read(&Uart0_TXDBuf,&myChar);
					REG_WRITE_UINT32(REG_UART0_THR,(REG_UINT32_VALUE(REG_UART0_THR)&0xFFFFFF00)|myChar);
				}
			}
			if(Uart0_TXDBuf.length == 0)	//发送缓冲区空则关THRE中断
				REG_UINT32_VALUE(REG_UART0_IER)&=~BIT1;	
			break;
			
		//RLS及其他:清除错误	
		case RLS:
		default:
			REG_READ_UINT32(REG_UART0_LSR,irqType);		//读LSR清除错误
			break;
	}
	return;
}

void	W90P710_UART1_INT_ISR()
{
	unsigned int IIRvalue;
	unsigned char myChar,irqType,rftls,i,j;
	
	REG_READ_UINT32(REG_UART1_IIR,IIRvalue);
	i=(unsigned char)(IIRvalue&(BIT5|BIT6));
	switch(i)
	{
		case 0: rftls=1;break;
		case 1: rftls=4;break;
		case 2: rftls=8;break;
		case 3: rftls=14;break;
		default: rftls=1;break;
	}	
	irqType=(unsigned char)(IIRvalue&0x0F);
	
	switch(irqType)
	{
		case RDA:
		case TOUT:
			while(Uart1_RXDBuf.length < Uart1_RXDBuf.size && rftls>0) 
			{
				myChar=REG_UINT32_VALUE(REG_UART1_RBR)&0xFF;
				rftls--;
				DBuffer_Write(&Uart1_RXDBuf,myChar);
			}
			if(Uart1_RXDBuf.length == Uart1_RXDBuf.size)
				REG_UINT32_VALUE(REG_UART1_IER)&=~BIT0;	//缓冲区满则关接收中断	
			break;
			
		case THRE:
			if(Uart1_TXDBuf.length >= UART1_FIFO_SIZE)
			{
				for(i=0;i< UART1_FIFO_SIZE;i++)
				{
					DBuffer_Read(&Uart1_TXDBuf,&myChar);
					REG_WRITE_UINT32(REG_UART1_THR,(REG_UINT32_VALUE(REG_UART1_THR)&0xFFFFFF00)|myChar);
				}
			}
			else if(Uart1_TXDBuf.length > 0)
			{
				j = Uart1_TXDBuf.length;
				for(i=0;i < j;i++)
				{
					DBuffer_Read(&Uart1_TXDBuf,&myChar);
					REG_WRITE_UINT32(REG_UART1_THR,(REG_UINT32_VALUE(REG_UART1_THR)&0xFFFFFF00)|myChar);
				}
			}
			if(Uart1_TXDBuf.length == 0)
				REG_UINT32_VALUE(REG_UART1_IER)&=~BIT1;	
			break;
			
		case RLS:
		default:
			REG_READ_UINT32(REG_UART1_LSR,irqType);
			break;
	}
	return;
}
void	W90P710_UART2_INT_ISR(){return;}
void	W90P710_UART3_INT_ISR(){return;}
void	W90P710_T0_INT_ISR()
{
/*	static volatile int i=0;
	i++;
	printf("Timer0 Interrupted\t%d\ttimes!\n\r",i);
	REG_UINT32_VALUE(REG_TISR) |= BIT1;*/
	return;
}
void	W90P710_T1_INT_ISR()
{
/*	static volatile int i=0;
	i++;
	printf("Timer1 Interrupted\t%d\ttimes!\n\r",i);
	REG_UINT32_VALUE(REG_TISR) |= BIT2;*/
	return;
}
void	W90P710_USBH0_INT_ISR(){return;}
void	W90P710_USBH1_INT_ISR(){return;}
void	W90P710_EMCTX_INT_ISR(){return;}
void	W90P710_EMCRX_INT_ISR(){return;}
void	W90P710_GDMA0_INT_ISR(){return;}
void	W90P710_GDMA1_INT_ISR(){return;}
void	W90P710_SD_INT_ISR(){return;}
void	W90P710_USBD_INT_ISR(){return;}
void	W90P710_SC0_INT_ISR(){return;}
void	W90P710_SC1_INT_ISR(){return;}
void	W90P710_I2C0_INT_ISR(){return;}
void	W90P710_I2C1_INT_ISR(){return;}
void	W90P710_SSP_INT_ISR(){return;}
void	W90P710_PWM_INT_ISR(){return;}
void	W90P710_KPI_INT_ISR()
{
	unsigned int  status;
	unsigned char myChar;
	
	REG_READ_UINT32(REG_KPISTATUS,status);
	myChar=(unsigned char)(status&0x7F);
	DBuffer_Write(&Keypad_DBuf,myChar);	
	return;
}
void	W90P710_PS2_INT_ISR(){return;}
void	W90P710_IRQ45_INT_ISR(){return;}



⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -