interrupt_usart.c
来自「详细介绍了arm7-at91r40008,的开发全过程」· C语言 代码 · 共 285 行
C
285 行
//*----------------------------------------------------------------------------
//* ATMEL Microcontroller Software Support - ROUSSET -
//*----------------------------------------------------------------------------
//* The software is delivered "AS IS" without warranty or condition of any
//* kind, either express, implied or statutory. This includes without
//* limitation any warranty or condition with respect to merchantability or
//* fitness for any particular purpose, or against the infringements of
//* intellectual property rights of others.
//*----------------------------------------------------------------------------
//* File Name : interrupt_Usart.c
//* Object : USART Interrupt Management
//*
//* 1.0 03/Jan/03 JPP : Creation
//* 1.1 25/Jun/03 JPP : adding Wait for USART CLOCK ready
//*----------------------------------------------------------------------------
// Include Standard LIB files
#define Usart_GLOBALS
#include "../ucos_ii/includes.h"
//变量定义
INT8U BspUsart0[BSPUSARTSIZE], BspUsart1[BSPUSARTSIZE];
extern void usart0_asm_irq_handler(void);
extern void usart1_asm_irq_handler(void);
//*----------------------------------------------------------------------------
//* Function Name : Usart0_c_irq_handler
//* Object : C handler interrupt function called by the interrupts
//* assembling routine
//* Input Parameters : <USART_pt> usart descriptor
//* Output Parameters : None
//*----------------------------------------------------------------------------
void Usart0_c_irq_handler(UsartDesc *USART_pt)
{
unsigned int status;
unsigned int error;
unsigned int i, num;
//* get Usart status register
status = US0_CSR & US0_IMR;
if ( status & US_ENDRX)
{
for (i=0; i<BSPUSARTSIZE; i++)
{
Usart0.Rxc_Buff[Usart0.Rxc_Wr] = BspUsart0[i];
if(Usart0.Rxc_Wr<(RXC_BUFF_SIZE-1))
Usart0.Rxc_Wr++;
else
Usart0.Rxc_Wr=0;
}
at91_usart_receive_frame(&USART0_DESC, (char*)BspUsart0, BSPUSARTSIZE, 9);
}
if ( status & US_TIMEOUT)
{
num = US0_RCR;
num = BSPUSARTSIZE - num;
for (i=0; i<num; i++)
{
Usart0.Rxc_Buff[Usart0.Rxc_Wr] = BspUsart0[i];
if(Usart0.Rxc_Wr<(RXC_BUFF_SIZE-1))
Usart0.Rxc_Wr++;
else
Usart0.Rxc_Wr=0;
}
at91_usart_receive_frame(&USART0_DESC, (char*)BspUsart0, BSPUSARTSIZE, 9);
//add
}
if ( status & US_RXRDY)
{
Usart0.Rxc_Buff[Usart0.Rxc_Wr]=US0_RHR;
if(Usart0.Rxc_Wr<(RXC_BUFF_SIZE-1))
Usart0.Rxc_Wr++;
else
Usart0.Rxc_Wr=0; //uart has received a character in UDR
}
if(Usart0.Txc_Rd != Usart0.Txc_Wr)
{
if( status & US_TXEMPTY)
{
US0_THR=Usart0.Txc_Buff[Usart0.Txc_Rd];//character transferred to shift register so UDR is now empty
if(Usart0.Txc_Rd<(TXC_BUFF_SIZE-1))
Usart0.Txc_Rd++;
else
Usart0.Txc_Rd=0;
}
}
else
{
US0_IDR |= US_TXEMPTY;
}
if ( status & US_OVRE)
{
error = US0_RHR;
}
if ( status & US_PARE) {
error = US0_RHR;
}
if ( status & US_FRAME) {
error = US0_RHR;
}
US0_CR = US_RSTSTA ;
}
//*----------------------------------------------------------------------------
//* Function Name : Usart1_c_irq_handler
//* Object : C handler interrupt function called by the interrupts
//* assembling routine
//* Input Parameters : <USART_pt> usart descriptor
//* Output Parameters : None
//*----------------------------------------------------------------------------
void Usart1_c_irq_handler(UsartDesc *USART_pt)
{
unsigned int status;
unsigned int error;
unsigned int i, num;
//* get Usart status register
status = US1_CSR & US1_IMR;
if ( status & US_ENDRX)
{
for (i=0; i<BSPUSARTSIZE; i++)
{
Usart1.Rxc_Buff[Usart1.Rxc_Wr] = BspUsart1[i];
if(Usart1.Rxc_Wr<(RXC_BUFF_SIZE-1))
Usart1.Rxc_Wr++;
else
Usart1.Rxc_Wr=0;
}
at91_usart_receive_frame(&USART1_DESC, (char*)BspUsart1, BSPUSARTSIZE, 9);
}
if ( status & US_TIMEOUT)
{
num = US1_RCR;
num = BSPUSARTSIZE - num;
for (i=0; i<num; i++)
{
Usart1.Rxc_Buff[Usart1.Rxc_Wr] = BspUsart1[i];
if(Usart1.Rxc_Wr<(RXC_BUFF_SIZE-1))
Usart1.Rxc_Wr++;
else
Usart1.Rxc_Wr=0;
}
at91_usart_receive_frame(&USART1_DESC, (char*)BspUsart1, BSPUSARTSIZE, 9);
//add
}
if ( status & US_RXRDY)
{
Usart1.Rxc_Buff[Usart1.Rxc_Wr]=US1_RHR;
if(Usart1.Rxc_Wr<(RXC_BUFF_SIZE-1))
Usart1.Rxc_Wr++;
else
Usart1.Rxc_Wr=0;
}
if (Usart1.Txc_Rd != Usart1.Txc_Wr)
{
if( status & US_TXEMPTY)
{
US1_THR=Usart1.Txc_Buff[Usart1.Txc_Rd];//character transferred to shift register so UDR is now empty
if(Usart1.Txc_Rd<(TXC_BUFF_SIZE-1))
Usart1.Txc_Rd++;
else
Usart1.Txc_Rd=0;
}
}
else
{
US1_IDR |= US_TXEMPTY;
}
if ( status & US_OVRE) {
error = US1_RHR;
}
if ( status & US_PARE) {
error = US1_RHR;
}
if ( status & US_FRAME) {
error = US1_RHR;
}
US1_CR = US_RSTSTA ;
}
//*-------------------------- External Function -------------------------------
//*----------------------------------------------------------------------------
//* Function Name : Usart0_init
//* Object : USART0 initialization
//* Input Parameters : SYNC 异步模式 同步模式
//* : PAR 偶校验 奇校验 强制为0 强制为1 无奇偶校验 多机模式
//* : NBSTOP 1位 1.5位 2位 保留
//* : BAUD 波特率
//* : 以上参数参照usart.h中定义
//*----------------------------------------------------------------------------
void Usart0_init (INT32U Mode, INT32U BAUD)
//* Begin
{
US0_CR |= US_RXDIS + US_TXDIS;
at91_usart_open(&USART0_DESC, US_CLKS_MCK | Mode, at91_baud_com( MCK, BAUD), 0) ;
US0_IDR = 0x3ff ;
// Wait for USART CLOCK ready
while ( !(US0_CSR & US_TXRDY ));
at91_irq_open(USART0_DESC.periph_id, USART0_INTERRUPT_LEVEL, AIC_SRCTYPE_INT_LEVEL_SENSITIVE, usart0_asm_irq_handler) ;
// US0_IER = US_RXRDY | US_OVRE | US_PARE | US_FRAME ;
at91_usart_receive_frame(&USART0_DESC, (char*)BspUsart0, BSPUSARTSIZE, 9);
UsartOpen (PORT1);
}
//*----------------------------------------------------------------------------
//* Function Name : Usart1_init
//* Object : USART1 initialization
//* Input Parameters : SYNC 异步模式 同步模式
//* : PAR 偶校验 奇校验 强制为0 强制为1 无奇偶校验 多机模式
//* : NBSTOP 1位 1.5位 2位 保留
//* : BAUD 波特率
//* : 以上参数参照usart.h中定义
//*----------------------------------------------------------------------------
void Usart1_init(INT32U Mode, INT32U BAUD)
{
US1_CR |= US_RXDIS + US_TXDIS;
at91_usart_open(&USART1_DESC, US_CLKS_MCK | Mode, at91_baud_com( MCK, BAUD), 0) ;
US1_IDR = 0x3ff ;
while ( !(US1_CSR & US_TXRDY ));
at91_irq_open(USART1_DESC.periph_id, USART1_INTERRUPT_LEVEL, AIC_SRCTYPE_INT_LEVEL_SENSITIVE, usart1_asm_irq_handler) ;
// US1_IER = US_RXRDY | US_OVRE | US_PARE | US_FRAME ; //20050816
at91_usart_receive_frame(&USART1_DESC, (char*)BspUsart1, BSPUSARTSIZE, 9);
UsartOpen (PORT2);
}
void UsartOpen(INT16U Port)
{
if (Port == PORT1)
{
US0_IER = US_ENDRX | US_OVRE | US_PARE | US_FRAME | US_TIMEOUT;
}
else
{
US1_IER = US_ENDRX | US_OVRE | US_PARE | US_FRAME | US_TIMEOUT;
}
}
void UsartClose(INT16U Port)
{
if (Port == PORT1)
{
US0_IDR = US_ENDRX | US_OVRE | US_PARE | US_FRAME | US_TIMEOUT;
}
else
{
US1_IDR = US_ENDRX | US_OVRE | US_PARE | US_FRAME | US_TIMEOUT;
}
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?