Cepгeй Бopщ (31.03.2008 11:34, просмотров: 122) ответил Михаил Е. на Я вроде к нему и подключаюсь, тишина... Примерчика нет?
Пожалуйста. Одна тонкость - прерывание должно быть по уровню (особенно если используются другие системные прерывания).
void DBGU_init()
{
AT91C_BASE_DBGU->DBGU_CR = AT91C_US_RXEN | AT91C_US_TXEN | AT91C_US_RSTSTA;
AT91C_BASE_DBGU->DBGU_MR = AT91C_US_USMODE_NORMAL | AT91C_US_PAR_NONE;
AT91C_BASE_DBGU->DBGU_BRGR = (MCK / 16 / UPLINK_BAUDRATE) + 0.5;
AT91C_BASE_PIOA->PIO_PDR = (1UL<<9)|(1UL<<10); // pins are peripherial
AT91C_BASE_DBGU->DBGU_IER = AT91C_US_RXRDY;
// AIC
AT91C_BASE_AIC->AIC_SMR[AT91C_ID_SYS] = AT91C_AIC_SRCTYPE_INT_HIGH_LEVEL | AT91C_AIC_PRIOR_LOWEST;
AT91C_BASE_AIC->AIC_SVR[AT91C_ID_SYS] = (uint32_t)DBGU_Int_Handler;
AT91C_BASE_AIC->AIC_IECR = (1<<AT91C_ID_SYS); // enable ints
}
__arm void DBGU_Int_Handler()
{
uint32_t Flags = AT91C_BASE_DBGU->DBGU_CSR;
Flags &= AT91C_BASE_DBGU->DBGU_IMR;
if(Flags & AT91C_US_RXRDY)
DBGU_RxIntHandler();
if(Flags & AT91C_US_TXRDY)
DBGU_TxIntHandler();
}
#pragma vector = 0x18
__irq __arm void IRQ_Switch()
{
((void(*)())AT91C_BASE_AIC->AIC_IVR)();
AT91C_BASE_AIC->AIC_EOICR = 0; // Reset AIC logic
}