📄 uart.c
字号:
// ----------------------------------------------------------------------------
// ATMEL Microcontroller Software Support - ROUSSET -
// ----------------------------------------------------------------------------
// DISCLAIMER: THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR
// IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE
// DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, INDIRECT,
// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
// OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
// EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
// ----------------------------------------------------------------------------
// File Name : interrupt_Usart.c
// Object : USART Interrupt Management
// Creation : JPP 08-Sep-2005
// ----------------------------------------------------------------------------
// Include Standard LIB files
#include "board.h"
static const char uart0_header[]=
{
"\n\r *** uart0_header ***\n\r"
"\n\r ********************\n\r"
};
static const char uart1_header[]=
{
"\n\r *** uart1_header ***\n\r"
"\n\r ********************\n\r"
};
//* \fn AT91F_US_Baudrate
//* \brief Calculate the baudrate
//* Standard Asynchronous Mode : 8 bits , 1 stop , no parity
#define AT91C_US_ASYNC_MODE ( AT91C_US_USMODE_NORMAL + \
AT91C_US_NBSTOP_1_BIT + \
AT91C_US_PAR_NONE + \
AT91C_US_CHRL_8_BITS + \
AT91C_US_CLKS_CLOCK )
//*------------------------- Internal Function --------------------------------
//*----------------------------------------------------------------------------
//* Function Name : Usart_c_irq_handler
//* Object : C handler interrupt function calAT91B_LED by the interrupts
//* assembling routine
//* Input Parameters : <RTC_pt> time rtc descriptor
//* Output Parameters : increment count_timer0_interrupt
//*----------------------------------------------------------------------------
void Usart0_c_irq_handler(void)
{
AT91PS_USART USART_pt = AT91C_BASE_US0;
unsigned int status;
AT91C_BASE_AIC->AIC_IVR = 0; /* Debug variant of vector read (protect mode is used) */
//AIC_IVR 读,当前中断对应的AIC_SVR。
AT91C_BASE_AIC->AIC_ICCR = AT91C_ID_US0; /* Clear uart0 interrupt */
AT91C_BASE_AIC->AIC_EOICR = 0; /* Signal end of interrupt */
//* get Usart status register
status = USART_pt->US_CSR;
if ( status & AT91C_US_RXRDY){
//* Get byte and send
AT91F_US_PutChar (USART_pt, AT91F_US_GetChar(USART_pt));
}
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 Usart1_c_irq_handler(void)
{
AT91PS_USART USART_pt = AT91C_BASE_US1;
unsigned int status;
AT91C_BASE_AIC->AIC_IVR = 0; /* Debug variant of vector read (protect mode is used) */
//AIC_IVR 读,当前中断对应的AIC_SVR。
AT91C_BASE_AIC->AIC_ICCR = AT91C_ID_US1; /* Clear uart1 interrupt */
AT91C_BASE_AIC->AIC_EOICR = 0; /* Signal end of interrupt */
//* get Usart status register
status = USART_pt->US_CSR;
if ( status & AT91C_US_RXRDY){
//* Get byte and send
AT91F_US_PutChar (USART_pt, AT91F_US_GetChar(USART_pt));
}
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;
}
//*-------------------------- External Function -------------------------------
//*----------------------------------------------------------------------------
//* Function Name : Usart_init
//* Object : USART initialization
//* Input Parameters : none
//* Output Parameters : TRUE
//*----------------------------------------------------------------------------
void Usart0_init ( void )
//* Begin
{
AT91PS_USART COM0 = AT91C_BASE_US0;
// First, enable the clock of the USART
AT91F_PMC_EnablePeriphClock ( AT91C_BASE_PMC, 1 << AT91C_ID_US0 ) ;
//* Configure PIO controllers to periph mode
AT91F_PIO_CfgPeriph( AT91C_BASE_PIOA,
((unsigned int) AT91C_PA0_RXD0 ) |
((unsigned int) AT91C_PA1_TXD0 ) |
((unsigned int) AT91C_PA3_RTS0 ) |
((unsigned int) AT91C_PA4_CTS0 ), // Peripheral A
0); // Peripheral B
// Usart Configure
AT91F_US_Configure (COM0, AT91B_MCK, AT91C_US_ASYNC_MODE, UART0_BAUD_RATE, 0);
// Enable usart
COM0->US_CR = AT91C_US_RXEN | AT91C_US_TXEN;
//* Enable USART IT error and RXRDY
AT91F_US_EnableIt(COM0,AT91C_US_TIMEOUT | AT91C_US_FRAME | AT91C_US_OVRE |AT91C_US_RXRDY);
//* open Usart 0 interrupt
AT91F_AIC_ConfigureIt ( AT91C_BASE_AIC, AT91C_ID_US0, USART0_INTERRUPT_LEVEL,AT91C_AIC_SRCTYPE_INT_HIGH_LEVEL, Usart0_c_irq_handler);
AT91F_AIC_EnableIt (AT91C_BASE_AIC, AT91C_ID_US0);
//AT91F_US_PutChar (COM0,'X');
AT91F_US_SendFrame(COM0,(char *)uart0_header,sizeof(uart0_header),0,0);
//* End
}
void Usart1_init ( void )
//* Begin
{
AT91PS_USART COM1 = AT91C_BASE_US1;
// First, enable the clock of the USART
AT91F_PMC_EnablePeriphClock ( AT91C_BASE_PMC, 1 << AT91C_ID_US1 ) ;
//* Configure PIO controllers to periph mode
AT91F_PIO_CfgPeriph( AT91C_BASE_PIOA,
((unsigned int) AT91C_PA5_RXD1 ) |
((unsigned int) AT91C_PA6_TXD1 ) |
((unsigned int) AT91C_PA8_RTS1 ) |
((unsigned int) AT91C_PA9_CTS1 ), // Peripheral A
0); // Peripheral B
// Usart Configure
AT91F_US_Configure (COM1, AT91B_MCK, AT91C_US_ASYNC_MODE, UART1_BAUD_RATE, 0);
// Enable usart
COM1->US_CR = AT91C_US_RXEN | AT91C_US_TXEN;
//* Enable USART IT error and RXRDY
AT91F_US_EnableIt(COM1,AT91C_US_TIMEOUT | AT91C_US_FRAME | AT91C_US_OVRE |AT91C_US_RXRDY);
//* open Usart 1 interrupt
AT91F_AIC_ConfigureIt ( AT91C_BASE_AIC, AT91C_ID_US1, USART1_INTERRUPT_LEVEL,AT91C_AIC_SRCTYPE_INT_HIGH_LEVEL, Usart1_c_irq_handler);
AT91F_AIC_EnableIt (AT91C_BASE_AIC, AT91C_ID_US1);
//AT91F_US_PutChar (COM1,'Y');
AT91F_US_SendFrame(COM1,(char *)uart1_header,sizeof(uart1_header),0,0);
//* End
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -