Доброе время суток!
Случилась у меня следующая проблемка:
Как известно существует несколько вариантов настройки AIC, среди которых есть режим чувствительности к уровню входного сигнала и режим чувствительности к фронту. При использовании первого случая в обработчике прерывания должен присутствовать код, который сбросит источник прерывания, во втором случае это делать не обязательно.
Ниже приведен код, задачей которого является выводить в УАРТ (в данном случае ДБГУ, но и с обычным проблема не исчезает) символы по прерыванию:
CODE
void USART_DBGU_irq_handler(void)
{
unsigned int status;
status = USART_pt_d->US_CSR;
if ( status & AT91C_US_RXRDY)
{
rx_buffer[ptr_rx_wr]=(char)AT91F_US_GetChar(USART_pt_d);
if(++ptr_rx_wr>=TX_BUFFER_SIZE) ptr_rx_wr=0;
bUART_DBGU_RX=1;
}
if ( status & AT91C_US_TXRDY)
{
if(ptr_tx_rd!=ptr_tx_wr)
{
AT91F_US_PutChar(USART_pt_d, tx_buffer[ptr_tx_rd]);
if(++ptr_tx_rd>=TX_BUFFER_SIZE) ptr_tx_rd=0;
}
else
{
AT91F_US_DisableIt (USART_pt_d,AT91C_US_TXRDY);
}
}
}
CODE
int putchar(int out)
{
AT91F_US_DisableIt(USART_pt_d,AT91C_US_RXRDY|AT91C_US_TXRDY);
tx_buffer[ptr_tx_wr++]=(char)out;
if(ptr_tx_wr>=TX_BUFFER_SIZE) ptr_tx_wr=0;
AT91F_US_EnableIt(USART_pt_d,AT91C_US_RXRDY|AT91C_US_TXRDY);
return out;
}
В общем этот код работает только при настройке AIC в режиме чувствительности к фронту. А мне край дела нужно чтобы он работал в режиме чувствительности к уровню. "Неработа" проявляется тогда кода выводится большое колличество символов подряд и процессор зависает.