📄 uart.c
字号:
/*
*Module: Uart.C 串口程序
*Programed by: ZHI-XIONG PENG
*Programed on: Date: 2004-12-22 18:11
*Modified by:
*Modified on: Date:
*Copyright (c) LONGFLY SHAOGUAN Inc. All rights reserved
*/
/*
*********************************************************************************************************
* INCLUDES
*********************************************************************************************************
*/
#define UART_GLOBALS
#define ComMessageMax 500
#include "../SRC/includes.h"
extern void usart0_asm_irq_handler(void);
extern void usart1_asm_irq_handler(void);
char ComMessage[ComMessageMax];
void Usart0_c_irq_handler( AT91PS_USART USART_pt )
{
unsigned int status,i;
//* get Usart status register
status = USART_pt->US_CSR & USART_pt->US_IMR;
if ( status & ( AT91C_US_ENDRX | AT91C_US_TIMEOUT ) )
{
USART_pt->US_CR = AT91C_US_STTTO;
for( i=0; i < (ComMessageMax-USART_pt->US_RCR); i++ )
{
Check_Frame( ComMessage[i] );
}
// AT91F_US_PutChar (USART_pt, 'O');
// Set PDC
// AT91F_US_ReceiveFrame(USART_pt,(char *)ComMessage,ComMessageMax);
USART_pt->US_RPR = (unsigned int)&ComMessage;
USART_pt->US_RCR = ComMessageMax;
}
//* Reset the satus bit
USART_pt->US_CR = AT91C_US_RSTSTA;
}
//*----------------------------------------------------------------------------
//* Function Name : Usart1_c_irq_handler
//* Object : C handler interrupt function called by the interrupts
//* assembling routine
//* Input Parameters : <RTC_pt> time rtc descriptor
//* Output Parameters : increment count_timer0_interrupt
//*----------------------------------------------------------------------------
void Usart1_c_irq_handler(AT91PS_USART USART_pt)
{
unsigned int status;
//* get Usart status register
status = USART_pt->US_CSR & USART_pt->US_IMR;
if ( status & AT91C_US_RXRDY)//接收
{
// #if OSVIEW > 0
// OSView_RxISRHandler();
// #else
// Com1_RxISRHandler();
// #endif
}
if ( status & AT91C_US_TXRDY )
{
// #if OSVIEW > 0
// OSView_TxISRHandler();
// #else
// #endif
}
// if ( status & AT91C_US_OVRE)
// {
//* clear US_RXRDY
//AT91F_US_GetChar(USART_pt);
//AT91F_US_PutChar (USART_pt, 'O');
// }
//* Check error
// if ( status & AT91C_US_PARE)
// {
//AT91F_US_PutChar (USART_pt, 'P');
// }
// if ( status & AT91C_US_FRAME)
// {
//AT91F_US_PutChar (USART_pt, 'F');
// }
// if ( status & AT91C_US_TIMEOUT)
// {
//USART_pt->US_CR = AT91C_US_STTTO;
//AT91F_US_PutChar (USART_pt, 'T');
// }
//* Reset the satus bit
USART_pt->US_CR = AT91C_US_RSTSTA;
}
void Usart_init(void)
{
AT91PS_USART COM0,COM1;
COM0 = AT91C_BASE_US0;
COM1 = AT91C_BASE_US1;
AT91F_PIO_CfgPeriph( AT91C_BASE_PIO, AT91C_P15_RXD0 | AT91C_P14_TXD0, 0 );
// AT91F_PIO_CfgPeriph( AT91C_BASE_PIO, AT91C_P22_RXD1 | AT91C_P21_TXD1, 0 );
AT91F_PS_EnablePeriphClock ( AT91C_BASE_PS, 1<<AT91C_ID_US0 ) ;// First, enable the clock of the PIOB
// AT91F_PS_EnablePeriphClock ( AT91C_BASE_PS, 1<<AT91C_ID_US1 ) ;
AT91F_US_Configure ( COM0, MCK, AT91C_US_ASYNC_MODE, 115200, 0 );// Usart Configure
//#if OSVIEW > 0
// AT91F_US_Configure ( COM1, MCK, AT91C_US_ASYNC_MODE, 115200, 0 );
//#else
// AT91F_US_Configure ( COM1, MCK, AT91C_US_ASYNC_MODE, 9600, 0 );
//#endif
// CalBub( AT91C_BASE_US0, MCK, SysProg[3] );
COM0->US_CR = AT91C_US_RSTRX | AT91C_US_RSTTX | AT91C_US_RSTSTA | AT91C_US_RXEN | AT91C_US_TXEN;// Enable usart
// COM1->US_CR = AT91C_US_RSTRX | AT91C_US_RSTTX | AT91C_US_RSTSTA | AT91C_US_RXEN | AT91C_US_TXEN;
AT91F_US_EnableIt( COM0, AT91C_US_TIMEOUT | AT91C_US_ENDRX );//* Enable USART IT error and RXRDY
// AT91F_US_EnableIt( COM1, AT91C_US_TIMEOUT | AT91C_US_RXRDY );
AT91F_AIC_ConfigureIt ( AT91C_BASE_AIC, AT91C_ID_US0, USART0_INTERRUPT_LEVEL,AT91C_AIC_SRCTYPE_INT_LEVEL_SENSITIVE, usart0_asm_irq_handler);
// open Usart interrupt
// AT91F_AIC_EnableIt ( AT91C_BASE_AIC, AT91C_ID_US0 );
AT91F_AIC_ConfigureIt ( AT91C_BASE_AIC, AT91C_ID_US1, USART1_INTERRUPT_LEVEL,AT91C_AIC_SRCTYPE_INT_LEVEL_SENSITIVE, usart1_asm_irq_handler);
// AT91F_AIC_EnableIt ( AT91C_BASE_AIC, AT91C_ID_US1 );
// Set PDC
// AT91F_US_ReceiveFrame(COM0,(char *)ComMessage,ComMessageMax);
COM0->US_RPR = (unsigned int)&ComMessage;
COM0->US_RCR = ComMessageMax;
//* Arm time out after 50 * 4 bits time
COM0->US_RTOR = 10;
//* Enable usart SSTO
COM0->US_CR = AT91C_US_STTTO;
}
void Check_Frame(uchar c)
{
c = 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -