Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: DBGU 115200 и PIT
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
nachinayuschiy
Здравствуйте. У меня возникла следующая проблема.
У меня в проекте настроен 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 байта. В чем может быть причина данного глюка?
Помогите решить данную проблему. Заранее благодарен.
aaarrr
Чтобы принимать поток 115200, латентность прерывания DBGU должна быть меньше 87мкс. Вы уверены, что она обеспечивается?
nachinayuschiy
Код
__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++;
      }            

  }


Обеспечивает. Вот такой вот код успешно работает.
aaarrr
Цитата(nachinayuschiy @ Jul 5 2009, 03:00) *
Обеспечивает. Вот такой вот код успешно работает.

Если такой код успешно работает, то предыдущий, очевидно, не обеспечивает. Т.е. OSTimeTick() выполняется слишком долго.
nachinayuschiy
Тогда прямо в этой теме хочу спросить. Если таким образом данные принимать не получиться. Тогда остаеться PDC. Хочу спросить.
В общем когда я заношу данные в RCR и RNCR. И допустим счетчик RCR досчитал но нуля, и начал считать RNCR и в это время счетчик RCR снова установить, то по завершению счета RNCR счет возобновиться снова с RCR?
aaarrr
У DBGU, увы, нет PDC. Когда RCR досчитает до нуля, он будет перезагружен из RNCR, т.е. устанавливать нужно будет каждый раз RNCR.
nachinayuschiy
Вот только не пойму как его нет... Если я его в своей программе использую smile.gif
aaarrr
Может, я чего упустил? Процессор какой?
nachinayuschiy
SAM7S256
aaarrr
Да, что-то у меня заклинило. Ну, тем лучше для вас.
nachinayuschiy
В общем если я вас правильно понял, что для того что бы PDC сделать непрерывным, нужно выставить RCR и RNCR, а затем после выполнения прерывания ENDRX постоянно менять RNCR. Правильно я размышляю?
aaarrr
Да, правильно. К сожалению, у DBGU нет прерывания по таймауту, что несколько усложняет жизнь.
nachinayuschiy
А какое ещё прерывание по таймеру? В PDC вроде никаких прерываний по таймеру нет smile.gif Что-то я запутался, буду разбираться smile.gif
aaarrr
Прерывание не у PDC, а у UART'а. Если данные кончатся, а приемный буфер будет заполнен не до конца, то в случае DBGU никаких событий сгенерировано не будет. У нормального UART'а при этом можно сгенерировать прерывание по таймауту.
nachinayuschiy
С этим согласен. DBGU обрезали до безобразия )
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.