?? 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 + -