Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: UART для BF 533
Форум разработчиков электроники ELECTRONIX.ru > Цифровая обработка сигналов - ЦОС (DSP) > Алгоритмы ЦОС (DSP)
bychkov_vladimir
Добрый день всем !
кто может пояснить мне как правильно построить обработчик прерывания по приему данных UART.
Обработчик должен срабатывать по флагу DR регистра UART_LSR.
путь действий следующий. настраиваюсь на нужную скорость - передача данных из процессора идет, идет запись в файл и т.д. с этим все превосходно.
настраиваю прерывания: отображаю прерывание периферии на прерывание ядра :
*pSIC_IAR1 = 0xf3ffffff ;
снимаю маски :
*pSIC_IMASK = 0x00004000;
включаю обработчик
register_handler(ik_ivg10, UARTRx_ISR);
разрешаю прерывание:
*pUART_IER =0x1;//Enable interrupts for receive

и собственно сам обработчик:

EX_INTERRUPT_HANDLER(UARTRx_ISR)
{

REC_Data = *pUART_RBR;
ssync();
do {;}
while (!(*pUART_LSR & TEMT)) ; //
*pUART_THR = REC_Data ;
ssync();

}

пробывал буфферизировать входные данные не помогает.
тестирую следующим образом - в HypTerminal. работаю посимвольно - пытаюсь ввести ряд символов
записать их в массив, а потом выдать обратно.
но с выше описанным подходом ничего не получается.
Буду благодарен за помощь !
Заранее спасибо !
SALOME
Нажмите для просмотра прикрепленного файла
Цитата(bychkov_vladimir @ Jul 27 2007, 20:23) *
кто может пояснить мне как правильно построить обработчик прерывания по приему данных UART.

Выкладываю обрывки работающей проги для BF537. Может чем поможет. Удачи...
bychkov_vladimir
Ну наконец - то поборол !
Спасибо SALOME натолкнули на хорошую мысль.:
заработало следующим образом , в обработчик прерывания добавил всего пару строк.

EX_INTERRUPT_HANDLER(UARTRx_ISR)
{
static int count ;
do {;}
while (!(*pUART_LSR & DR)) ;
REC_Data[count] = *pUART_RBR;
count ++ ;
ssync();
ssync();
if (count == N )
{
UART_putRECData();
}


}

и все заработало как хотел.
честно говоря думал, что отслеживать DR уже не надо, думал за меня это контроллер прерываний сделает, а оказалось совсем по другому.
Спасибо за помощь !
fontp
Это вообще-то старая ошибка дизайна контроллера UART от AD - задержка между моментом прерывания и загрузкой регистра. Мне почему-то кажется, что в последних релизах чипа эта аномалия была залечена.
asm_lock
Цитата
настраиваю прерывания: отображаю прерывание периферии на прерывание ядра :
*pSIC_IAR1 = 0xf3ffffff ;
снимаю маски :
*pSIC_IMASK = 0x00004000;
включаю обработчик
register_handler(ik_ivg10, UARTRx_ISR);
разрешаю прерывание:
*pUART_IER =0x1;//Enable interrupts for receive




Может я чего то не понимаю, но если нужно что бы срабатывало прерывание от приемника UART1 RX, то:
*pSIC_IAR1 = 0xff3fffff ;
*pSIC_IMASK = 0x00002000;
Как то так.
ЗЫ:Я конечно могу ошибаться.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.