nachinayuschiy 0 4 июля, 2009 Опубликовано 4 июля, 2009 · Жалоба Здравствуйте. У меня возникла следующая проблема. У меня в проекте настроен 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 63 4 июля, 2009 Опубликовано 4 июля, 2009 · Жалоба Чтобы принимать поток 115200, латентность прерывания DBGU должна быть меньше 87мкс. Вы уверены, что она обеспечивается? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
nachinayuschiy 0 4 июля, 2009 Опубликовано 4 июля, 2009 · Жалоба __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 63 4 июля, 2009 Опубликовано 4 июля, 2009 · Жалоба Обеспечивает. Вот такой вот код успешно работает. Если такой код успешно работает, то предыдущий, очевидно, не обеспечивает. Т.е. OSTimeTick() выполняется слишком долго. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
nachinayuschiy 0 4 июля, 2009 Опубликовано 4 июля, 2009 · Жалоба Тогда прямо в этой теме хочу спросить. Если таким образом данные принимать не получиться. Тогда остаеться PDC. Хочу спросить. В общем когда я заношу данные в RCR и RNCR. И допустим счетчик RCR досчитал но нуля, и начал считать RNCR и в это время счетчик RCR снова установить, то по завершению счета RNCR счет возобновиться снова с RCR? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 63 4 июля, 2009 Опубликовано 4 июля, 2009 · Жалоба У DBGU, увы, нет PDC. Когда RCR досчитает до нуля, он будет перезагружен из RNCR, т.е. устанавливать нужно будет каждый раз RNCR. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
nachinayuschiy 0 4 июля, 2009 Опубликовано 4 июля, 2009 · Жалоба Вот только не пойму как его нет... Если я его в своей программе использую :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 63 4 июля, 2009 Опубликовано 4 июля, 2009 · Жалоба Может, я чего упустил? Процессор какой? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
nachinayuschiy 0 4 июля, 2009 Опубликовано 4 июля, 2009 · Жалоба SAM7S256 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 63 4 июля, 2009 Опубликовано 4 июля, 2009 · Жалоба Да, что-то у меня заклинило. Ну, тем лучше для вас. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
nachinayuschiy 0 5 июля, 2009 Опубликовано 5 июля, 2009 · Жалоба В общем если я вас правильно понял, что для того что бы PDC сделать непрерывным, нужно выставить RCR и RNCR, а затем после выполнения прерывания ENDRX постоянно менять RNCR. Правильно я размышляю? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 63 5 июля, 2009 Опубликовано 5 июля, 2009 · Жалоба Да, правильно. К сожалению, у DBGU нет прерывания по таймауту, что несколько усложняет жизнь. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
nachinayuschiy 0 5 июля, 2009 Опубликовано 5 июля, 2009 · Жалоба А какое ещё прерывание по таймеру? В PDC вроде никаких прерываний по таймеру нет :) Что-то я запутался, буду разбираться :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 63 5 июля, 2009 Опубликовано 5 июля, 2009 · Жалоба Прерывание не у PDC, а у UART'а. Если данные кончатся, а приемный буфер будет заполнен не до конца, то в случае DBGU никаких событий сгенерировано не будет. У нормального UART'а при этом можно сгенерировать прерывание по таймауту. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
nachinayuschiy 0 5 июля, 2009 Опубликовано 5 июля, 2009 · Жалоба С этим согласен. DBGU обрезали до безобразия ) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться