📄 coms.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 + -