Цитата(Daermon @ Nov 13 2007, 19:37)

Почему не могу вызвать прерывания?
Передача осуществляется, а ни каких прерываний не происходит...пытался средствами IAR отловить переход на вектор прерывания.
void Usart1::AIC_Init(void)
{
AT91F_AIC_CfgPMC();
}
//------------------------------------------------------------------------
void Usart1::UART1_Init(void)
{
__enable_interrupt( ) ;
AT91F_AIC_EnableIt(AT91C_BASE_AIC, AT91C_ID_US1);
AT91F_US_EnableIt(AT91C_BASE_US1,AT91C_US_RXRDY|AT91C_US_TXRDY|AT91C_US_ENDRX| AT91C_US_ENDTX|AT91C_US_TXEMPTY|AT91C_US_TXBUFE|AT91C_US_RXBUFF); Разрешаю все прерывания USART
char buf[1];
buf[0] = 65;
AT91F_US_SendFrame(AT91C_BASE_US1, buf,sizeof(buf[0]),0,0);
}
1 Как я понял, есть дебагер. Ставь бряк на вектор IRQ (не помню, там в дизассемблере что-то типа LDR PS,PS, -0xсколько-то, расположено почи сразу после 0-го вектора - 4 или 5-е слово памяти). Мониторь состояние усарта. Если есть один вход в прерывание, а второго и последующего - нет, значит, не пишешь AIC->AIC_EOICR = чему_угодно. Хотя вроде, если память не спит с другим, яр сам генреит это в эпилоге. не уверен.
2 А AIC_Init(void) точно вызывается?
3 А не проще ли вместо
Цитата
char buf[1];
buf[0] = 65;
AT91F_US_SendFrame(AT91C_BASE_US1, buf,sizeof(buf[0]),0,0);
писать
Цитата
char buf;
buf = 65;
AT91F_US_SendFrame(AT91C_BASE_US1, &buf,sizeof(buf),0,0);
4 Если есть AT91F_AIC_EnableIt(AT91C_BASE_AIC, AT91C_ID_US1); то зачем __enable_interrupt( ) ;?
5 Если попробовать разрешить AT91F_US_EnableIt(AT91C_BASE_US1,0xFFFFFFFF)