Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Не могу "выйти" из прерывания USART. помогите.
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > ARM, 32bit
Budek
Господа, помогите, пожалуйста. Начал изучать AT91SAM7X256.
В основном цикле тупо мигаю 1-м светодиодом, в обработчике прерывания USART0 делаю вспышку 2-м.
Так вот что не пойму (бьюсь третий день): при отправке символа с компа в обработчик захожу (2-й светодиод вспыхивает 1 раз, как и положено). Но вот в основную программу не выхожу (вернее из обработчика вроде выхожу, но вот куда, неясно) - "висит", 1-й светодиод не мигает.
инициализирую USART вроде верно:
Код
void init_serial (void)
{
AT91C_BASE_PIOA->PIO_PDR=(1<<0)|(1<<1);
AT91C_BASE_PIOA->PIO_ASR=(1<<0)|(1<<1);
AT91C_BASE_PIOA->PIO_BSR=0;
AT91C_BASE_PMC->PMC_PCER=1<<AT91C_ID_US0;
AT91C_BASE_US0->US_MR=AT91C_US_USMODE_NORMAL|AT91C_US_CLKS_CLOCK|AT91C_US_CHRL_8_BITS|
                                          AT91C_US_NBSTOP_1_BIT;
AT91C_BASE_US0->US_BRGR=MCK/(16*115200);
AT91C_BASE_US0->US_TTGR=0;
AT91C_BASE_US0->US_CR=AT91C_US_RXEN|AT91C_US_TXEN;
AT91F_AIC_ConfigureIt (AT91C_BASE_AIC, AT91C_ID_US0, 1,
                           AT91C_AIC_SRCTYPE_INT_HIGH_LEVEL, Usart_c_irq_handler);
AT91C_BASE_US0->US_IER=(1<<0);
AT91F_AIC_EnableIt (AT91C_BASE_AIC, AT91C_ID_US0);
}

такое ощущение, что микроконтроллер "не знает", по какому адресу идти, выходя из обработчика. помогает только ресет.
Спасибо заранее всем.
Spoofing
А признак конца прерывания? (верно для s256, для х вроде те же регистры)
Код
//AIC_ICCR- регистр команды сброса пр-й = 0xFFFFF128
p_pAic->AIC_ICCR =NU1;//запись любого зн-я

//AIC_EOICR- регистр команды конца пр-я = 0xFFFFF130
p_pAic->AIC_EOICR=NU1;//запись любого зн-я


NU=0xFFFFFFFF через дефайн
aaarrr
Цитата(Budek @ Jun 22 2009, 19:04) *
Но вот в основную программу не выхожу (вернее из обработчика вроде выхожу, но вот куда, неясно) - "висит", 1-й светодиод не мигает.

В прерывании что делаете? Источник снимаете? В случае TXRDY нужно или отправить следующий символ/break, или же запретить прерывание/сам передатчик.

Цитата(Spoofing @ Jun 22 2009, 20:55) *
Код
//AIC_ICCR- регистр команды сброса пр-й = 0xFFFFF128
p_pAic->AIC_ICCR =NU1;//запись любого зн-я

Во-первых, в данном случае не нужно; во-вторых, "любое" значение в этот регистр писать нельзя.
Budek
Спасибо.
Не помогает.
aaarrr
Да пожалуйста. Вы бы код своего прерывания выложили, вместе с тем, что в стартапе написано. Телепаты уже в отпуске smile.gif
Budek
Цитата(aaarrr @ Jun 22 2009, 23:21) *
Да пожалуйста. Вы бы код своего прерывания выложили, вместе с тем, что в стартапе написано. Телепаты уже в отпуске smile.gif


обработчик:

Код
void Usart_c_irq_handler(void)
{
unsigned int status;
status = AT91C_BASE_US0 -> US_CSR;
status &= AT91C_BASE_US0 -> US_IMR;
if (status & AT91C_US_RXRDY)   BlincLed(GetCharUsart0()-0x60);
AT91C_BASE_AIC->AIC_ICCR=0xFFFFFFFF;
AT91C_BASE_AIC->AIC_EOICR=0xFFFFFFFF;
}


а вот со стартапом "полный бардак". сейчас один хороший человек пытается его "выправить".
спасибо.
aaarrr
Цитата(Budek @ Jun 22 2009, 21:55) *
обработчик:

AT91C_BASE_AIC->AIC_ICCR=0xFFFFFFFF; - не нужно, т.е. вредно.

Цитата(Budek @ Jun 22 2009, 21:55) *
а вот со стартапом "полный бардак". сейчас один хороший человек пытается его "выправить".
спасибо.

Ну, удачи ему.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.