📄 interrupt_usart.c
字号:
//* File Name : interrupt_Usart.c
#include "Board.h"
#include "cdc_enumerate.h"
#define USART_INTERRUPT_LEVEL 1
AT91PS_USART COM0;
#define USART_BAUD_RATE 115200
extern struct _AT91S_CDC pCDC;
static char buff_rx[100];
static char buff_rx1[100];
unsigned int first =0;
/*******************************************************************************
* 说明:Trace_Toggel_LED函数,点亮或熄灭LED
* 参数:unsigned int Led
* 返回值:无
*******************************************************************************/
void Trace_Toggel_LED (unsigned int Led) {
if ( (AT91F_PIO_GetInput(AT91C_BASE_PIOA) & Led ) == Led ) {
AT91F_PIO_ClearOutput( AT91C_BASE_PIOA, Led );
}
else {
AT91F_PIO_SetOutput( AT91C_BASE_PIOA, Led );
}
}
/*******************************************************************************
* 说明:Usart_c_irq_handler函数,中断句柄
* 参数:无
* 返回值:无
*******************************************************************************/
void Usart_c_irq_handler(void) {
AT91PS_USART USART_pt = COM0;
unsigned int status;
status = USART_pt->US_CSR ; // 读取UART状态寄存器,激活中断
status &= USART_pt->US_IMR;
if ( status & AT91C_US_RXBUFF) {
Trace_Toggel_LED( LED3) ; // 点亮或熄灭LED
if ( first == 0){ // 将字符串送到UART
COM0->US_RPR = (unsigned int) buff_rx1;
COM0->US_RCR = 100;
pCDC.Write(&pCDC, buff_rx,100);
first =1;
}else{
COM0->US_RPR = (unsigned int) buff_rx;
COM0->US_RCR = 100;
pCDC.Write(&pCDC, buff_rx1,100);
first=0;
}
}
if ( status & AT91C_US_TIMEOUT){ // 检测错误
Trace_Toggel_LED( LED4) ;
status = 100 - COM0->US_RCR;
if (status !=0){
if ( first == 0){
COM0->US_RPR = (unsigned int) buff_rx1;
COM0->US_RCR = 100;
pCDC.Write(&pCDC, buff_rx,status);
first =1;
}else{
COM0->US_RPR = (unsigned int) buff_rx;
COM0->US_RCR = 100;
pCDC.Write(&pCDC, buff_rx1,status);
first=0;
}
COM0->US_CR = AT91C_US_STTTO;
}
}
USART_pt->US_CR = AT91C_US_RSTSTA; // 复位状态位
}
/*******************************************************************************
* 说明:AT91F_US_Printk函数,通过UART发送一个字符串
* 参数:char *buffer(参数为指向以\0结束的字符串)
* 返回值:无
*******************************************************************************/
void AT91F_US_Put( char *buffer) {
while(*buffer != '\0') {
while (!AT91F_US_TxReady(COM0));
AT91F_US_PutChar(COM0, *buffer++);
}
}
/*******************************************************************************
* 说明:Usart_init函数,UART0初始化
* 参数:无
* 返回值:无
*******************************************************************************/
void Usart_init ( void ) {
COM0= AT91C_BASE_US0;
AT91F_PIO_CfgPeriph( // 配置PIO控制器,定义RXD,TXD引脚
AT91C_BASE_PIOA, // PIO 控制器基地址
((unsigned int) AT91C_PA5_RXD0 ) | // PA5->RXD0
((unsigned int) AT91C_PA6_TXD0 ) , // PA6->TXD0
0 );
AT91F_PMC_EnablePeriphClock ( AT91C_BASE_PMC, 1<<AT91C_ID_US0 ) ; // 允许PIOA时钟频率
AT91F_US_Configure (COM0, MCK,AT91C_US_ASYNC_MODE,USART_BAUD_RATE , 0); // 配置UART
COM0->US_CR = AT91C_US_RXEN | AT91C_US_TXEN; // 允许UART
AT91F_AIC_ConfigureIt (AT91C_BASE_AIC, AT91C_ID_US0, USART_INTERRUPT_LEVEL, // UART0 开中断
AT91C_AIC_SRCTYPE_INT_HIGH_LEVEL, Usart_c_irq_handler);
AT91F_AIC_EnableIt (AT91C_BASE_AIC, AT91C_ID_US0);
AT91F_PDC_Open (AT91C_BASE_PDC_US0); // 设置PDC
COM0->US_RPR = (unsigned int) buff_rx;
COM0->US_RCR = 100;
first = 0;
COM0->US_RTOR = 10;
AT91F_US_EnableIt(COM0,AT91C_US_RXBUFF | AT91C_US_TIMEOUT );
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -