Пытаюсь настроить USART0 для передачи данных в терминал без использования прерываний.
После чтения документации пришёл к таким настройкам:
Код
#define BOARD_MCK 48000000
#define US0_BAUD 115200
#define BAUDRATE0 (BOARD_MCK / US0_BAUD) / 16;
//настройка usart0
void ConfigureUART(void)
{
//разрешение тактирования uart0
AT91C_BASE_PMC->PMC_PCER = (1<<AT91C_ID_US0);
// сброс и запрет приёмника/передатчика
AT91C_BASE_US0->US_CR = AT91C_US_RSTRX | AT91C_US_RSTTX | AT91C_US_RXDIS | AT91C_US_TXDIS;
//асинхронный режим, 8 бит, 1 стоповый, без чётности, системный клок 48МГц
AT91C_BASE_US0->US_MR = AT91C_US_USMODE_HWHSH | AT91C_US_CLKS_CLOCK | AT91C_US_CHRL_8_BITS | AT91C_US_PAR_NONE
| AT91C_US_NBSTOP_1_BIT | AT91C_US_CHMODE_NORMAL;
//настройка предделителя частоты
AT91C_BASE_US0->US_BRGR = BAUDRATE0;
//очищаем прерывания
AT91C_BASE_US0->US_CSR;
//включаем приём/передачу
AT91C_BASE_US0->US_CR = AT91C_US_RXEN|AT91C_US_TXEN;
}
/******************************************************************/
В PIO настраиваю альтернативные функции - PA5/PA6 RXD/TXD соответственно
Код
/*******************************************/
//линии uart
#define RXD (1<<5) //in
#define TXD (1<<6) //out pu
//настройка альтернативных функций
void PIO_alternat_config(void)
{
//разрешаем альтернативным функциям управлять выводами
AT91C_BASE_PIOA->PIO_PDR = RXD|TXD;
//разрешаем подтягивающий резистор на TXD
AT91C_BASE_PIOA->PIO_PPUER = TXD;
//разрешаем альтернативные функции
AT91C_BASE_PIOA->PIO_ASR = RXD|TXD;
}
/*******************************************/
Для передачи символа определил функцию:
Код
void _putcharSerial0(unsigned char data)
{
//ожидаем завершения передачи
//while(!(AT91C_BASE_US0->US_CSR & AT91C_US_TXRDY));
AT91C_BASE_US0->US_THR = data;
for(int i=1000000; i; i--);
}
Сначала попробовал опрашивать флаг готовности к передаче и потом пихать символ в US_THR.
Программа зависла как только я попытался передать первый-же символ
(вероятно на строчке ожидания готовности к передаче).
Заменил ожидание на задержку перед отправкой следующего символа - в терминале 0, программа после попытки отправить символ пошла исполняться дальше.
Т.е. полагаю что USART0 всёже не включился.
Хотя я подал на него тактирование, настроил регистры управления, предделитель, включил приём/передачу, настроил альтернативные функции в PIO!
Вопрос - что я упустил в настройках?
Заранее спасибо за ответы
Сообщение отредактировал mempfis_ - Mar 31 2010, 08:55