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

 
 
> Time-out в USART, аппаратное отлавливание
athlon64
сообщение Jun 1 2010, 13:14
Сообщение #1


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

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



Процессор At91SAM7X512, IDE IAR 5.4, uCOS 2.89
Тайм-аут мне нужен чтобы определять окончание пакета.
С отдельным таймером для отсчитывания тайм-аута всё работает. Интересно использовать именно заложенную в USART аппаратную функцию. Прочитал раздел даташита про USART несколько раз, но всё равно чтото гдето забыл sad.gif
Процессор получает пакет и даже успевает его пульнуть обратно, но по истечении таймаута процессор виснет.


Инициализация USART0:

Код
void ConfigureUsart(unsigned char usart_num)
{
      unsigned int mode = AT91C_US_USMODE_NORMAL
                        | AT91C_US_CLKS_CLOCK
                        | AT91C_US_CHRL_8_BITS
                        | AT91C_US_PAR_NONE
                        | AT91C_US_NBSTOP_1_BIT
                        | AT91C_US_CHMODE_NORMAL;

      PIO_Configure(USART0_pins, PIO_LISTSIZE(USART0_pins));
      // Enable the peripheral clock in the PMC
      PMC_EnablePeripheral(AT91C_ID_US0);
      PMC_EnablePeripheral(AT91C_ID_US0);

      // Configure the USART in the desired mode @9600 bauds
      USART_Configure(AT91C_BASE_US0, mode, 9600, 48000000);

      // Configure the USART interrupt
      IRQ_ConfigureIT(AT91C_ID_US0, 0, USART0_IrqHandler);
      IRQ_EnableIT(AT91C_ID_US0);

      // Enable receiver & transmitter
      USART_SetTransmitterEnabled(AT91C_BASE_US0, 1);
      USART_SetReceiverEnabled(AT91C_BASE_US0, 1);

      // Start receiving data and start timer
      USART_ReadBuffer(AT91C_BASE_US0, &pBuffer, 1);
      AT91C_BASE_US0->US_IER = AT91C_US_RXBUFF | AT91C_US_TIMEOUT;

//------------------------------------------------------------------------------
      // Устанавливаем тайм-аут
      AT91C_BASE_US0->US_RTOR=70u;
    }



Обработчик прерывания:

Код
void USART0_IrqHandler(void)
{
  if ((AT91C_BASE_US0->US_CSR & AT91C_US_TIMEOUT) > 0)  // если прерывание произошло по таймауту
  BSP_LED_Toggle(1);

else  if ((AT91C_BASE_US0->US_CSR & AT91C_US_RXRDY) == 1) { // если прерывание произошло по заполнению буфера

  USART_ReadBuffer(AT91C_BASE_US0, &pBuffer, 1);
  USART_Write(AT91C_BASE_US0,pBuffer,0);
  AT91C_BASE_US0->US_CR =AT91C_BASE_US0->US_CR | AT91C_US_STTTO; //Начинаем отсчёт тайм-аута
}
}


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



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

 


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


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