|
以下为arm的dbgu初始化程序和中断程序:
void AT91F_DBGU_Init(void)
{
AT91F_DBGU_CfgPIO();
( ( AT91PS_USART ) AT91C_BASE_DBGU )->US_CR = ( AT91C_US_RSTTX |AT91C_US_RSTRX );
AT91F_US_Configure (
( AT91PS_USART ) AT91C_BASE_DBGU,
MCK,
AT91C_US_ASYNC_MODE ,
AT91C_DBGU_BAUD ,
0 );
( ( AT91PS_USART )AT91C_BASE_DBGU )->US_CR = ( AT91C_US_RXEN | AT91C_US_TXEN );
AT91F_US_EnableIt((AT91PS_USART) AT91C_BASE_DBGU,AT91C_US_RXRDY | AT91C_US_ENDTX);
AT91F_AIC_ConfigureIt ( AT91C_BASE_AIC, AT91C_ID_SYS,
USART_SYS_LEVEL,
AT91C_AIC_SRCTYPE_INT_LEVEL_SENSITIVE,
DBGU_irq_handler );
AT91F_AIC_EnableIt (AT91C_BASE_AIC, AT91C_ID_SYS);
}
void DBGU_irq_handler(void)
{
unsigned char re_data_ud, re_status_dbgu = 0;
re_status_dbgu = (*AT91C_DBGU_CSR & 0x11);
if (re_status_dbgu) {
re_data_ud = ( *AT91C_DBGU_RHR & 0x1FF ); /*接收中断处理*/
if ('X' == re_data_ud ) { /*起始*/
re_local_index = 0;
re_head_ud = 1;
re_local_index++;
return;
}
if ( 'M' == re_data_ud ) { /*结束*/
if( 15 < re_local_index ) {
re_head_ud = 0;
re_local_index = 0;
return;
}
re_local_is_ok = 1; /*一包数据传递完毕,设置标志位*/
re_head_ud = 0;
re_local_index = 0;
/*
AT91F_PIO_ClearOutput( AT91C_BASE_PIOA, STATUS );
*/
return;
}
if ( 15 < re_local_index ) {
re_head_ud = 0;
re_local_index = 0;
return;
}
else {
if ( 1 != re_head_ud ) {
re_local_index = 0;
re_head_ud = 0;
return;
}
strRxBuff[re_local_index] = re_data_ud; /*正文数据*/
re_local_index++;
if ( 16 < re_local_index ) {
re_head_ud = 0;
re_local_index = 0;
}
}
}
if((re_status_dbgu & 0x10) >> 4)
{
if((local_tx_buff[tx_local_index] == '/0') || (tx_local_index > 15))
{
tx_local_index = 1;
return;
}
*AT91C_DBGU_THR = local_tx_buff[tx_local_index++];
}
}
在开始运行后不久就进入了中断,但是并未接受到或者需要发送人和数据。一开始re_status_dbgu数据为0,当运行完if((re_status_dbgu & 0x10) >> 4)判断之后,跳入了该if判断成功后的语句if((local_tx_buff[tx_local_index] == '/0') || (tx_local_index > 15)),并且此时re_status_dbgu值为0x000000CD。并且在其后的时间不断重复该循环,但是我们至今没有找到问题所在。我想请问一下是哪里有出错的地方。 |
阿莫论坛20周年了!感谢大家的支持与爱护!!
知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)
|