Перейти к содержанию
    

DBGU 115200 и PIT

Здравствуйте. У меня возникла следующая проблема.

У меня в проекте настроен PIT для целей RTOS (период - 1 мс)

Так же мне нужно сконфигурировать DBGU на частоту 115200.

 

__arm void Handler(void) {
    
    unsigned long status;
    unsigned long status_dbgu;    
    
      status = AT91C_BASE_PITC->PITC_PISR;
      status_dbgu = AT91C_BASE_DBGU->DBGU_CSR;

      
      if (status_dbgu & AT91C_US_RXRDY) {
        AT91C_BASE_DBGU->DBGU_RHR;
        zzz_cnt++;
      }
            
      if(status & AT91C_PITC_PITS)
      {  
        AT91C_BASE_AIC->AIC_IVR  = 0;                              
    
        status                   = AT91C_BASE_PITC->PITC_PIVR;
        (void)status;                                              
        
        OSTimeTick();       
      }   
  }

 

В общем если DBGU настроить на 9600, то при отправке в порт 2800 байт, переменная zzz_cnt становиться равна как и должна 2800.

Но вот если я конфигурирую на 115200, то после отправки 2800 байт, переменная равна 179-182 байта. В чем может быть причина данного глюка?

Помогите решить данную проблему. Заранее благодарен.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Чтобы принимать поток 115200, латентность прерывания DBGU должна быть меньше 87мкс. Вы уверены, что она обеспечивается?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

__arm void Handler(void) {
    
    unsigned long status;
    unsigned long status_dbgu;    
    
      status = AT91C_BASE_PITC->PITC_PISR;
      status_dbgu = AT91C_BASE_DBGU->DBGU_CSR;

      
      if (status_dbgu & AT91C_US_RXRDY) {
        AT91C_BASE_DBGU->DBGU_RHR;
        zzz_cnt++;
      }            

  }

 

Обеспечивает. Вот такой вот код успешно работает.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Обеспечивает. Вот такой вот код успешно работает.

Если такой код успешно работает, то предыдущий, очевидно, не обеспечивает. Т.е. OSTimeTick() выполняется слишком долго.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Тогда прямо в этой теме хочу спросить. Если таким образом данные принимать не получиться. Тогда остаеться PDC. Хочу спросить.

В общем когда я заношу данные в RCR и RNCR. И допустим счетчик RCR досчитал но нуля, и начал считать RNCR и в это время счетчик RCR снова установить, то по завершению счета RNCR счет возобновиться снова с RCR?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

У DBGU, увы, нет PDC. Когда RCR досчитает до нуля, он будет перезагружен из RNCR, т.е. устанавливать нужно будет каждый раз RNCR.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В общем если я вас правильно понял, что для того что бы PDC сделать непрерывным, нужно выставить RCR и RNCR, а затем после выполнения прерывания ENDRX постоянно менять RNCR. Правильно я размышляю?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Да, правильно. К сожалению, у DBGU нет прерывания по таймауту, что несколько усложняет жизнь.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А какое ещё прерывание по таймеру? В PDC вроде никаких прерываний по таймеру нет :) Что-то я запутался, буду разбираться :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Прерывание не у PDC, а у UART'а. Если данные кончатся, а приемный буфер будет заполнен не до конца, то в случае DBGU никаких событий сгенерировано не будет. У нормального UART'а при этом можно сгенерировать прерывание по таймауту.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...