Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: UART3 & ep9307
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
Andrei....
Какие то запутки с прерыванием INT_UART3. Постояно вызывается с флагом TIS в UART3IntIDIntClr регистре, видимо чего то не сбрасываю...чего?
aaarrr
Цитата(Andrei.... @ Dec 11 2006, 17:34) *
Какие то запутки с прерыванием INT_UART3. Постояно вызывается с флагом TIS в UART3IntIDIntClr регистре, видимо чего то не сбрасываю...чего?

Если бит TIE в UART1Ctrl установлен, то прерывание будет вызываться постоянно, пока в TX FIFO есть свободное место.
В документации это совершенно прозрачно описано.
Andrei....
Да, понятно. Но почему прерывание не вызывается если и RIE выставлен в UART3Ctrl? Байты в UART3Data приходят - перывания нет.
Andrei....
recive interrupt заработал, недозаполнялся FIFO.
А почему не возникает прерывание recive timeout (бит RTIE в UART3Ctrl регистре), если в порт ничего не приходит?
aaarrr
Цитата
А почему не возникает прерывание recive timeout (бит RTIE в UART3Ctrl регистре), если в порт ничего не приходит?

Оно возникает только если FIFO не пуст. Работает нормально.
Andrei....
Цитата(aaarrr @ Dec 12 2006, 18:07) *
Цитата
А почему не возникает прерывание recive timeout (бит RTIE в UART3Ctrl регистре), если в порт ничего не приходит?

Оно возникает только если FIFO не пуст. Работает нормально.


Выходит если мне надо определить момент когда в течении какого то времени не пришли байты (нет ответа от устройства) то оно мне не поможет. Такую ситуацию не разрулить в одном INT_UART3.

И второй вопрос: не вызывается таймерное прерывание, что не так настроил?

ldr r0, =1000//500ms
ldr r1, =0x80810000 //Timer1Load
str r0, [r1]
ldr r0, =(1<<7/*ENABLE*/)|(1<<6/*MODE*/)|(0<<3/*CLKSRL*/)
ldr r1, =0x80810008 //Timer1Control
str r0, [r1]
...
VIC1IntEnable = (1<<VIC1_AACINTR)|(1<<VIC1_TC1OI); // Enable AC97 interrupt, TC1OI interrupt.
...
VIC1VectCntl1=0x20|VIC1_TC1OI; // Enable vector interrupt.
VIC1VectAddr1=(unsigned long)InterruptHandler;//interrupt handler
...
__ARMLIB_enableIRQ();

void irq_handler(void) __attribute__ ((interrupt ("IRQ")))
{
unsigned long vector1=VIC1VectAddr,vector2=VIC2VectAddr;
if(vector1)
{
(*((void(*)(void))vector1))();// Call vectored interrupt function.
VIC1VectAddr=0; // Clear interrupt in VIC.
}
if(vector2)
{
(*((void(*)(void))vector2))();// Call vectored interrupt function.
VIC2VectAddr=0; // Clear interrupt in VIC.
}
}
void InterruptHandler(void)
{
...
Timer1Clear=0; //???
}

и нужно сбрасывать прерывание (Timer1Clear=0)
Andrei....
С таймером вопрос снят.
aaarrr
Цитата(Andrei.... @ Dec 12 2006, 18:24) *
Выходит если мне надо определить момент когда в течении какого то времени не пришли байты (нет ответа от устройства) то оно мне не поможет. Такую ситуацию не разрулить в одном INT_UART3.

Придется использовать внешний таймер. И на время паузы между пакетами накладывается ограничение - оно не может быть меньше времени передачи 4-х байт.

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