реклама на сайте
подробности

 
 
> Прерывания USART
Daermon
сообщение Nov 16 2007, 06:22
Сообщение #1


Участник
*

Группа: Новичок
Сообщений: 36
Регистрация: 26-10-07
Пользователь №: 31 739



AT91rm9200 AS-9200
IAR4.42


Разрешил прерывания RXBUFF и ENDRX.
На шине тишина, а прерывания эти срабатывают! В чем может быть дело?


//== Обработчик прерываний
static __arm __irq void IRQ1_RS232()
{
unsigned int status;
unsigned int status1;
//----------------------------------
AT91C_BASE_AIC->AIC_IVR = 0 ; /* enter interrupt in protected mode */
DBGU.PrintString("\n\rINTERUPT_USART1\n\r");

status = (AT91C_BASE_US1->US_CSR) ;
status1 = (AT91C_BASE_US1->US_IMR);
status &=status1;
//
//* Disable all interrupts
// AT91C_BASE_US1->US_IDR = (0xFFFFFFFF);

if( status & AT91C_US_TXEMPTY ){DBGU.PrintString("\n\rAT91C_US_TXEMPTY\n\r");}
if( status & AT91C_US_RXBUFF )
{
RxBuffer[count++] = AT91F_US_GetChar(AT91C_BASE_US1);
if(count==5)
{
count=0;
for(int i=0;i<10;i++)
RxBuffer[i]=0;
}
DBGU.PrintString("\n\rAT91C_US_RXBUFF\n\r");
}
if( status & AT91C_US_TXBUFE ){DBGU.PrintString("\n\rAT91C_US_TXBUFE\n\r");}
if( status & AT91C_US_TIMEOUT ){DBGU.PrintString("\n\rAT91C_US_TIMEOUT\n\r");}
if( status & AT91C_US_ENDTX ){DBGU.PrintString("\n\rAT91C_US_ENDTX\n\r");}
if( status & AT91C_US_ENDRX )
{
RxBuffer[count++] = AT91F_US_GetChar(AT91C_BASE_US1);
if(count==5)
{
count=0;
for(int i=0;i<10;i++)
RxBuffer[i]=0;
}
}
if( status & AT91C_US_ITERATION ){;}
if( status & AT91C_US_NACK ){;}
if( status & AT91C_US_RIIC ){;}
if( status & AT91C_US_DSRIC ){;}
if( status & AT91C_US_DCDIC ){;}
if( status & AT91C_US_CTSIC ){;}
AT91C_BASE_US1->US_CR = AT91C_US_RSTSTA;
AT91C_BASE_AIC->AIC_EOICR = 0 ; /* unstack one level */
}

status = (AT91C_BASE_US1->US_CSR) ;
Эта операция не чистит статус рег.
можно опять вызвать
status = (AT91C_BASE_US1->US_CSR) ;
и статус снова будет тем же
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Daermon
сообщение Nov 20 2007, 10:10
Сообщение #2


Участник
*

Группа: Новичок
Сообщений: 36
Регистрация: 26-10-07
Пользователь №: 31 739



Опа..шаманство какоето. вчера весь день все нормально запускалось. сегодня добавил пару строчек и все заткнулось..удаление этих строк ни к чему хорошему не привело... может в ИАРе глюк какой есть..файлы не не подтягивает или еще что???

Запускаю USART1
void Usart1::Init()
{
for(int i=0;i<100;i++) Usart1::OutBuf[i] = i+100;
PIO_Init();
AIC_Init();

AT91F_US1_CfgPMC();

AT91F_US_Configure (
AT91C_BASE_US1, // \arg pointer to a USART controller
60000000, // \arg peripheral clock - 60 ÌÃö
AT91C_US_USMODE_NORMAL | // normal mode
AT91C_US_CLKS_CLOCK | // clock is MCK
AT91C_US_CHRL_8_BITS | // 8 databits
AT91C_US_PAR_NONE | // no parity
AT91C_US_NBSTOP_1_BIT | // 1 stopbit
AT91C_US_CHMODE_NORMAL // channel mode - normal
// AT91C_US_CHMODE_LOCAL // channel mode - local
, // \arg mode Register to be programmed
9600 , // \arg baudrate to be programmed
0 ); // \arg timeguard to be programmed


AT91F_US_ResetTx(AT91C_BASE_US1);
AT91F_US_ResetRx(AT91C_BASE_US1);

AT91F_AIC_ConfigureIt(AT91C_BASE_AIC, AT91C_ID_US1,AT91C_AIC_PRIOR_HIGHEST, AT91C_AIC_SRCTYPE_INT_LEVEL_SENSITIVE, (void (*)(void))IRQ1_USART);
AT91C_BASE_AIC->AIC_EOICR = 0 ; /* unstack one level */
AT91C_BASE_AIC->AIC_ICCR = ( 1<<AT91C_ID_US1 );
AT91F_AIC_EnableIt(AT91C_BASE_AIC, AT91C_ID_US1);
__enable_interrupt();
AT91F_US_EnableIt(AT91C_BASE_US1,AT91C_US_ENDRX);

}

а в обработчике инициализирую прием через PDC

static __arm __irq void IRQ1_USART()
{
unsigned int status;
unsigned int status1;

AT91C_BASE_AIC->AIC_IVR = 0 ; /* enter interrupt in protected mode */
//* get Usart status register and active interrupt

status = (AT91C_BASE_US1->US_CSR) ;status &= (AT91C_BASE_US1->US_IMR);
status = (AT91C_BASE_US1->US_CSR) ;
status1 = (AT91C_BASE_US1->US_IMR);
status &=status1;

//* Disable all interrupts
AT91C_BASE_US1->US_IDR = (0xFFFFFFFF);
if( status & AT91C_US_ENDTX )
{

}

if(status & AT91C_US_ENDRX )
{

AT91F_US_ResetRx(AT91C_BASE_US1);
AT91F_US_ReceiveFrame (AT91C_BASE_US1,RxBuffer,Rx_Len,RxBuffer+10,Rx_Len );
AT91F_US_EnableIt(AT91C_BASE_US1,AT91C_US_ENDRX); //AT91C_US_RXRDY);

}

AT91C_BASE_US1->US_CR = AT91C_US_RSTSTA;
AT91C_BASE_AIC->AIC_EOICR = 0 ;

}

Все в теории должно пахать...а на практике работало только вчера smile.gif)) Может сегодня магнитные бури???
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 27th July 2025 - 19:03
Рейтинг@Mail.ru


Страница сгенерированна за 0.01399 секунд с 7
ELECTRONIX ©2004-2016