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

 
 
> Правильно отключить прерывания, на время передачи по UART
athlon64
сообщение Jun 11 2010, 12:43
Сообщение #1


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

Группа: Свой
Сообщений: 156
Регистрация: 10-03-10
Из: Уфа
Пользователь №: 55 882



Портирую прошивку с AVR на ARM SAM7X512. В прошивке для AVR во время вывода в порты UART0, UART1 глобально запрещались и разрешались прерывания командами CLI и SEI.
В проекте для SAM7 добавил одноимённые функции:
Код
unsigned char SREG;
////unsigned long int IMR;
/*===============================================
  Процедуры CLI и SEI заменяют соответствующие АВР-овские,
  выключают и включают все прерывания
  ===============================================
*/
void CLI(){                                        //// Отключает все прерывания
AT91C_BASE_AIC->AIC_IDCR=0xFFFFFFFF;
SREG=0x00;
}

void SEI(){                                        //// Включает все прерывания
AT91C_BASE_AIC->AIC_IDCR=0;
SREG=0x80;
}


Процедура отправки очередного байта в ком-порт выглядит так:
Код
void Out2COM(){
char i;

if (AT91C_BASE_US0->US_CSR & AT91C_US_TXEMPTY){             //// регистр к передаче готов
        CLI();
        if(OutBufCOMIdxWR==OutBufCOMIdxRD){                   // буфер пуст
            OutBufCOMIdxWR=OutBufCOMIdxRD=0;
            
            if (AT91C_BASE_US0->US_CSR & AT91C_US_ENDTX){   //// Если передача закончена // Разрешаем прием по COM
                USART_ReadBuffer(AT91C_BASE_US0, &i, 1);
                COM_mode &= ~0x83;      // нет пилотов и нет принятых пакетов и нет Tx
                AT91C_BASE_US0->US_IER = AT91C_US_RXBUFF;   //// разрешаем прерывания приема СОМ
            }
        }
        else{
            AT91C_BASE_US0->US_THR = OutBufCOM[OutBufCOMIdxRD++]; //// выдали в порт
        }

        COMWaitCnt=0;
        SEI();
    }
    else if(COMWaitCnt++>5000){LedErrorOn(); while(1);}  // по WatchDog'у должны сброситься
}


В итоге МК пытаясь при инициализации отправить свой адрес в порт (адрес приходит нормально и МК не виснет, крутится в главном цикле main), в обработчик PIT он так и не попадает. Если убрать из процедуры отправки байта вызов CLI, то PIT работает, но вместо посылки (адреса устройства приходит байт 0x0D), видимо передачу прерывает PIT


--------------------
Руслан
Go to the top of the page
 
+Quote Post



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

 


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


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