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

📄 coms.c

📁 ads7843+5个串口+1个定时器+at91rm9200测试源程序
💻 C
字号:
//*********************************************************************************************************************
//【  版          权  】Copyright (c) 2007-2008 http://gliethttp.cublog.cn
//
//【  文  件  版  本  】v1.x
//
//【  文  件  名  称  】coms.c
//
//【  创  建  日  期  】2007-12-27
//
//【  功  能  描  述  】
//*********************************************************************************************************************
#include <coms.h>
#include <stdarg.h>
#include <string.h>

_dcoms dcoms;
_dcoms *coms = &dcoms;
void __irq com0_irq_proc(void);
void __irq com1_irq_proc(void);
void __irq com2_irq_proc(void);
void __irq com3_irq_proc(void);
//---------------------------------------------------------------------------------------------------------------------
//【  版          本  】v1.0
//【  函  数  名  称  】void coms_ini(uint8 port)
//【 创建人及创建时间 】葛立新 2005-12-06 17:21
//【 修改人及修改时间 】
//【  修  改  原  因  】
//【  功  能  描  述  】
//---------------------------------------------------------------------------------------------------------------------
void coms_ini(uint8 port)
{
	switch(port)
	{
		case 0:
			{
				AT91F_US0_CfgPIO();
				AT91F_US0_CfgPMC();
				AT91F_US_Configure (
					AT91C_BASE_US0,								// 基址
					GMCLK,            							// GMCLK
					AT91C_US_ASYNC_MODE ,        				// mode Register to be programmed
					115200 ,                   					// baudrate to be programmed
					0);                        					// timeguard to be programmed
				//发送使能
				AT91F_US_EnableTx(AT91C_BASE_US0);
				//接收使能
				AT91F_US_EnableRx(AT91C_BASE_US0);
				//-------------------------------------------------
				AT91F_PDC_Open(AT91C_BASE_PDC_US0);
				AT91F_AIC_ConfigureIt(AT91C_BASE_AIC,
									 AT91C_ID_US0,
									 7,
									 AT91C_AIC_SRCTYPE_INT_LEVEL_SENSITIVE,
									 (void(*)(void))com0_irq_proc);
				AT91F_AIC_EnableIt(AT91C_BASE_AIC, AT91C_ID_US0);
			    
			    AT91C_BASE_US0->US_RTOR = 10;
				AT91C_BASE_US0->US_RPR = (uint32)coms->com0;
				AT91C_BASE_US0->US_RCR = com0_rcvebuf_max;
			    AT91F_US_EnableIt(AT91C_BASE_US0, AT91C_US_ENDRX | AT91C_US_TIMEOUT);
			}
			break;
		case 1:
			{
				AT91F_US1_CfgPIO();
				AT91F_US1_CfgPMC();
				AT91F_US_Configure (
					AT91C_BASE_US1,								// 基址
					GMCLK,            							// GMCLK
					AT91C_US_ASYNC_MODE ,        				// mode Register to be programmed
					115200 ,                   					// baudrate to be programmed
					0);                        					// timeguard to be programmed
				//发送使能
				AT91F_US_EnableTx(AT91C_BASE_US1);
				//接收使能
				AT91F_US_EnableRx(AT91C_BASE_US1);
				//-------------------------------------------------
				AT91F_PDC_Open(AT91C_BASE_PDC_US1);
				AT91F_AIC_ConfigureIt(AT91C_BASE_AIC,
									 AT91C_ID_US1,
									 7,
									 AT91C_AIC_SRCTYPE_INT_LEVEL_SENSITIVE,
									 (void(*)(void))com1_irq_proc);
				AT91F_AIC_EnableIt(AT91C_BASE_AIC, AT91C_ID_US1);
			    
			    AT91C_BASE_US1->US_RTOR = 10;
				AT91C_BASE_US1->US_RPR = (uint32)coms->com1;
				AT91C_BASE_US1->US_RCR = com1_rcvebuf_max;
			    AT91F_US_EnableIt(AT91C_BASE_US1, AT91C_US_ENDRX | AT91C_US_TIMEOUT);
			}
			break;
		case 2:
			{
				AT91F_US2_CfgPIO();
				AT91F_US2_CfgPMC();
				AT91F_US_Configure (
					AT91C_BASE_US2,								// 基址
					GMCLK,            							// GMCLK
					AT91C_US_ASYNC_MODE ,        				// mode Register to be programmed
					38400,
					//115200 ,                   					// baudrate to be programmed
					0);                        					// timeguard to be programmed
				//发送使能
				AT91F_US_EnableTx(AT91C_BASE_US2);
				//接收使能
				AT91F_US_EnableRx(AT91C_BASE_US2);
				//-------------------------------------------------
				AT91F_PDC_Open(AT91C_BASE_PDC_US2);
				AT91F_AIC_ConfigureIt(AT91C_BASE_AIC,
									 AT91C_ID_US2,
									 7,
									 AT91C_AIC_SRCTYPE_INT_LEVEL_SENSITIVE,
									 (void(*)(void))com2_irq_proc);
				AT91F_AIC_EnableIt(AT91C_BASE_AIC, AT91C_ID_US2);
			    
			    AT91C_BASE_US2->US_RTOR = 10;
				AT91C_BASE_US2->US_RPR = (uint32)coms->com2;
				AT91C_BASE_US2->US_RCR = com2_rcvebuf_max;
			    AT91F_US_EnableIt(AT91C_BASE_US2, AT91C_US_ENDRX | AT91C_US_TIMEOUT);
			}
			break;
		case 3:
			{
				AT91F_US3_CfgPIO();
				AT91F_US3_CfgPMC();
				AT91F_US_Configure (
					AT91C_BASE_US3,								// 基址
					GMCLK,            							// GMCLK
					AT91C_US_ASYNC_MODE ,        				// mode Register to be programmed
					115200 ,                   					// baudrate to be programmed
					0);                        					// timeguard to be programmed
				//发送使能
				AT91F_US_EnableTx(AT91C_BASE_US3);
				//接收使能
				AT91F_US_EnableRx(AT91C_BASE_US3);
				//-------------------------------------------------
				AT91F_PDC_Open(AT91C_BASE_PDC_US3);
				AT91F_AIC_ConfigureIt(AT91C_BASE_AIC,
									 AT91C_ID_US3,
									 7,
									 AT91C_AIC_SRCTYPE_INT_LEVEL_SENSITIVE,
									 (void(*)(void))com3_irq_proc);
				AT91F_AIC_EnableIt(AT91C_BASE_AIC, AT91C_ID_US3);
			    
			    AT91C_BASE_US3->US_RTOR = 10;
				AT91C_BASE_US3->US_RPR = (uint32)coms->com3;
				AT91C_BASE_US3->US_RCR = com3_rcvebuf_max;
			    AT91F_US_EnableIt(AT91C_BASE_US3, AT91C_US_ENDRX | AT91C_US_TIMEOUT);
			}
			break;
		default:break;
	}
}
//---------------------------------------------------------------------------------------------------------------------
//【  版          本  】v1.0
//【  函  数  名  称  】void xxxdprintf_coms(uint8 port,void *fmt)
//【 创建人及创建时间 】gliethttp 2007-12-27
//【 修改人及修改时间 】
//【  修  改  原  因  】
//【  功  能  描  述  】
//---------------------------------------------------------------------------------------------------------------------
void xxxdprintfc_coms(uint8 port,void *fmt,uint16 len)
{char *data = fmt;
 AT91PS_USART com;
 	switch(port)
 	{
 		case 0:com = AT91C_BASE_US0;break;
 		case 1:com = AT91C_BASE_US1;break;
 		case 2:com = AT91C_BASE_US2;break;
 		case 3:com = AT91C_BASE_US3;break;
 		default:return;
 	}
 	
 	while( (com->US_CSR & AT91C_US_TXBUFE) == 0 );
	//PDC
	com->US_TPR = (uint32)data;
	com->US_TCR = len;
	//阻塞
	while( (com->US_CSR & AT91C_US_TXBUFE) == 0 );
}
void xxxdprintf_coms(uint8 port,void *fmt)
{
	xxxdprintfc_coms(port,fmt,strlen(fmt));
}

void __irq com0_irq_proc(void)
{
	{
		AT91C_BASE_US0->US_CR = AT91C_US_RSTRX;
		
		xxxdprintfc_coms(0,coms->com0,com0_rcvebuf_max-AT91C_BASE_US0->US_RCR);
		
		AT91C_BASE_US0->US_RPR = (uint32)coms->com0;
		AT91C_BASE_US0->US_RCR = com0_rcvebuf_max;
		AT91C_BASE_US0->US_CR = AT91C_US_RXEN;
		
		//进入底半处理
		//OSSemPost(SEM_Printer_Rcve);
	}AT91C_BASE_AIC->AIC_EOICR = 0;
}
void __irq com1_irq_proc(void)
{
	{
		AT91C_BASE_US1->US_CR = AT91C_US_RSTRX;
		
		xxxdprintfc_coms(1,coms->com1,com1_rcvebuf_max-AT91C_BASE_US1->US_RCR);
		
		AT91C_BASE_US1->US_RPR = (uint32)coms->com1;
		AT91C_BASE_US1->US_RCR = com1_rcvebuf_max;
		AT91C_BASE_US1->US_CR = AT91C_US_RXEN;
		
		//进入底半处理
		//OSSemPost(SEM_Printer_Rcve);
	}AT91C_BASE_AIC->AIC_EOICR = 0;
}
void __irq com2_irq_proc(void)
{
	{
		AT91C_BASE_US2->US_CR = AT91C_US_RSTRX;
		
		xxxdprintfc_coms(2,coms->com2,com2_rcvebuf_max-AT91C_BASE_US2->US_RCR);
		
		AT91C_BASE_US2->US_RPR = (uint32)coms->com2;
		AT91C_BASE_US2->US_RCR = com2_rcvebuf_max;
		AT91C_BASE_US2->US_CR = AT91C_US_RXEN;
		
		//进入底半处理
		//OSSemPost(SEM_Printer_Rcve);
	}AT91C_BASE_AIC->AIC_EOICR = 0;
}
void __irq com3_irq_proc(void)
{
	{
		AT91C_BASE_US3->US_CR = AT91C_US_RSTRX;
		
		xxxdprintfc_coms(3,coms->com3,com3_rcvebuf_max-AT91C_BASE_US3->US_RCR);
		
		AT91C_BASE_US3->US_RPR = (uint32)coms->com3;
		AT91C_BASE_US3->US_RCR = com3_rcvebuf_max;
		AT91C_BASE_US3->US_CR = AT91C_US_RXEN;
		
		//进入底半处理
		//OSSemPost(SEM_Printer_Rcve);
	}AT91C_BASE_AIC->AIC_EOICR = 0;
}
//⊙⊙⊙
//⊙⊙⊙完了⊙⊙⊙
//⊙⊙⊙over⊙⊙⊙⊙⊙⊙⊙⊙⊙⊙⊙⊙⊙⊙⊙⊙⊙⊙⊙⊙⊙⊙⊙⊙⊙⊙⊙⊙⊙⊙⊙⊙⊙⊙⊙⊙⊙⊙⊙⊙⊙⊙⊙⊙⊙⊙⊙⊙⊙⊙⊙⊙⊙⊙

⌨️ 快捷键说明

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