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

 
 
 
Reply to this topicStart new topic
> UART для BF 533, обработчик прерывания RX
bychkov_vladimir
сообщение Jul 27 2007, 13:23
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 106
Регистрация: 1-06-05
Из: Подольск
Пользователь №: 5 629



Добрый день всем !
кто может пояснить мне как правильно построить обработчик прерывания по приему данных 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. работаю посимвольно - пытаюсь ввести ряд символов
записать их в массив, а потом выдать обратно.
но с выше описанным подходом ничего не получается.
Буду благодарен за помощь !
Заранее спасибо !
Go to the top of the page
 
+Quote Post
SALOME
сообщение Jul 28 2007, 04:51
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 311
Регистрация: 11-06-07
Из: Российская империя, 1861г.
Пользователь №: 28 349



Прикрепленный файл  UART.rar ( 2.32 килобайт ) Кол-во скачиваний: 167
Цитата(bychkov_vladimir @ Jul 27 2007, 20:23) *
кто может пояснить мне как правильно построить обработчик прерывания по приему данных UART.

Выкладываю обрывки работающей проги для BF537. Может чем поможет. Удачи...


--------------------
Итак увидел я, что нет ничего лучше, чем наслаждаться человеку делами своими (Еккл) .
Go to the top of the page
 
+Quote Post
bychkov_vladimir
сообщение Jul 28 2007, 21:42
Сообщение #3


Частый гость
**

Группа: Участник
Сообщений: 106
Регистрация: 1-06-05
Из: Подольск
Пользователь №: 5 629



Ну наконец - то поборол !
Спасибо 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 уже не надо, думал за меня это контроллер прерываний сделает, а оказалось совсем по другому.
Спасибо за помощь !
Go to the top of the page
 
+Quote Post
fontp
сообщение Jul 29 2007, 16:24
Сообщение #4


Эксперт
*****

Группа: Свой
Сообщений: 1 467
Регистрация: 25-06-04
Пользователь №: 183



Это вообще-то старая ошибка дизайна контроллера UART от AD - задержка между моментом прерывания и загрузкой регистра. Мне почему-то кажется, что в последних релизах чипа эта аномалия была залечена.
Go to the top of the page
 
+Quote Post
asm_lock
сообщение Mar 19 2013, 07:20
Сообщение #5


Частый гость
**

Группа: Участник
Сообщений: 78
Регистрация: 30-01-09
Из: СПб
Пользователь №: 44 178



Цитата
настраиваю прерывания: отображаю прерывание периферии на прерывание ядра :
*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;
Как то так.
ЗЫ:Я конечно могу ошибаться.

Сообщение отредактировал asm_lock - Mar 19 2013, 07:21
Go to the top of the page
 
+Quote Post

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

 


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


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