各位大侠,我在用AT91SAM7S64做串口接收中断程序,我只能触发一次中断。我在调试时发现,中断结束后,仍可以返回到主函数调用中断的地方,但是无法再执行中断。
以下是中断初始化,中断处理函数,以及主函数,请各位大虾赐教,小弟不胜感激。
下面是串口程序文件uart.c
#include "..\..\main\main.h"
AT91PS_PIO pPIOA; // 并行I/O控制器
AT91PS_DBGU pDBGU; // 调试单元
AT91PS_UDP pUDP; // USB器件端口(UDP)
AT91PS_USART pCOM0; // 通用同步/异步收发器(USART)
AT91PS_USART pCOM1; // 通用同步/异步收发器(USART)
void uart0_init(void)
{
pCOM0 = AT91C_BASE_US0;
pPIOA = AT91C_BASE_PIOA;
// 1. 分配PIO 为USART 模式(外设A), 并禁止RXD0/TXD0为通用I/O 模式
// Define RXD and TXD as peripheral
// Configure PIO controllers to periph mode
AT91F_PIO_CfgPeriph(AT91C_BASE_PIOA, // PIO controller base address
(USART_RXD0 |USART_TXD0), // Peripheral A
0 ); // Peripheral B
// 2. 使能USART0 时钟控制器输出
AT91F_PMC_EnablePeriphClock ( AT91C_BASE_PMC,1 << AT91C_ID_US0 ) ;
// 3. Usart Configure
AT91F_US_Configure(pCOM0,
Main_Clock>>4,
AT91C_US_ASYNC_MODE,
USART0_Baud,0);
// 5. 使能USART 接收控制寄存器
USART0_RxEN();
USART0_TxEN();
// 6. Enable USART IT error and RXRDY
AT91F_US_EnableIt(pCOM0,
AT91C_US_RXRDY);
// |AT91C_US_TXRDY);
// 7. open Usart 0 interrupt
AT91F_AIC_ConfigureIt (AT91C_BASE_AIC,
AT91C_ID_US0,
AT91C_AIC_PRIOR_HIGHEST,
AT91C_AIC_SRCTYPE_INT_HIGH_LEVEL,
uart0_irq);
AT91F_AIC_EnableIt (AT91C_BASE_AIC, AT91C_ID_US0);
}
void uart0_sendbyte(INT8U dat)
{
USART0_RxDIS(); // 禁止USART 接收控制寄存器
USART0_TxEN(); // 使能USART 发送控制寄存器
AT91C_BASE_US0->US_THR = dat;
while(!(AT91C_BASE_US0->US_CSR& AT91C_US_TXEMPTY));
USART0_TxDIS(); // 禁止USART 发送控制寄存器
USART0_RxEN(); // 使能USART 接收控制寄存器
}
void uart0_irq(void)
{
INT8U data;
//AT91C_BASE_AIC->AIC_IDCR = 0x1 << AT91C_ID_US0 ; 关中断
pCOM0 = AT91C_BASE_US0;
if(pCOM0->US_CSR&AT91C_US_RXRDY) // RXRDY
{
data = AT91F_US_GetChar(pCOM0);
uart0_sendbyte(data);
/*uart0_sendbyte('r');
uart0_sendbyte('e');
uart0_sendbyte('c');
uart0_sendbyte('e');
uart0_sendbyte('i');
uart0_sendbyte('v');
uart0_sendbyte('e');
*/
}
pCOM0->US_CR = AT91C_US_RSTSTA;
//AT91C_BASE_AIC->AIC_IECR = 0x1 << AT91C_ID_US0 ;
*AT91C_AIC_EOICR = 0x00;
//uart0_sendbyte('r');
}
以下是主函数main.c
#include "main.h"
INT32U j;
void delay_nus(INT32U i)
{
while(i--);
}
void delay_nms(INT32U i)
{
INT32U t1;
INT32U t2;
for(t2=0;t2<=i;t2++)
{
for(t1=0;t1<=1000;t1++);
}
}
void system_init(void)
{
uart0_init();
}
int main(void)
{
INT8U data;
////dat = 's';
//INT8U i;
system_init();
uart0_sendbyte('s');
uart0_sendbyte('t');
uart0_sendbyte('a');
uart0_sendbyte('r');
uart0_sendbyte('t');
while(1)
{j++;
}
}