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

Как поменять baudrate UART SAM7S

Всем добрый день.

 

Есть плата с AT91SAM7S к UART которой подключена микросхема для которой необходимо после настройки работы поменять скорость работы UART.

Стартует она с 9600 а после настройки пытаюсь поставить 115200.

 

Привожу процедуру инициализации UART:

#define OVER0 0 //без oversampling
#define BAUD0_9600 (BOARD_MCK / (9600*8*(2-OVER0)))
#define BAUD0_115200 (BOARD_MCK / (115200*8*(2-OVER0)))

//настройка usart0
void ConfigureUART0(unsigned int baud)
{  
 //разрешение тактирования uart0
 AT91C_BASE_PMC->PMC_PCER = (1<<AT91C_ID_US0);

 // Reset and disable receiver & transmitter
 AT91C_BASE_US0->US_CR = AT91C_US_RSTRX | AT91C_US_RSTTX | AT91C_US_RXDIS | AT91C_US_TXDIS;

 // Configures USART in hardware handshaking mode, asynchronous, 8 bits, 1 stop
 // bit, no parity, 115200 bauds and enables its transmitter and receiver.
 #if(OVER0 != 0)
 //режим с oversampling
 AT91C_BASE_US0->US_MR = 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
                       | AT91C_US_OVER;
 #else
 //режим без с oversampling
 AT91C_BASE_US0->US_MR = 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;
 #endif


 //настройка предделителя частоты
 AT91C_BASE_US0->US_BRGR = baud; 

 //инсталяция прерываний в AIC
 IRQ_DisableIT(AT91C_ID_US0);
 IRQ_ConfigureIT(AT91C_ID_US0, 1, USART0_ISR);
 IRQ_EnableIT(AT91C_ID_US0);

 //очищаем прерывания
 AT91C_BASE_US0->US_CSR;

 //разрешение прерывания по готовности приёмника
 AT91C_BASE_US0->US_IER = AT91C_US_RXRDY;

 //включаем приём/передачу
 AT91C_BASE_US0->US_CR = AT91C_US_RXEN|AT91C_US_TXEN;

}
/******************************************************************/

 

UART настраивается и работает если поставить скорость 9600 или 115200. Но если попытаться перенастроить его с одной скорости на другую то UART глохнет.

 

Написал процедуру реконфигурирования UART - с ней тоже не перестраивается.

 

/******************************************************************/
//настройка usart0
void reConfigureUART0(unsigned int baud)
{  
 //запрещаем прерывания в AIC
 IRQ_DisableIT(AT91C_ID_US0);

 // Reset and disable receiver & transmitter
 AT91C_BASE_US0->US_CR = AT91C_US_RSTRX | AT91C_US_RSTTX | AT91C_US_RXDIS | AT91C_US_TXDIS;

 //настройка предделителя частоты
 AT91C_BASE_US0->US_BRGR = baud; 

 //разрешаем прерывание  в AIC
 IRQ_EnableIT(AT91C_ID_US0);

 //очищаем прерывания
 AT91C_BASE_US0->US_CSR;

 //разрешение прерывания по готовности приёмника
 AT91C_BASE_US0->US_IER = AT91C_US_RXRDY;

 //включаем приём/передачу
 AT91C_BASE_US0->US_CR = AT91C_US_RXEN|AT91C_US_TXEN;

}
/******************************************************************/

 

Подскажите как пожалуйста как перенастроить UART.

Заранее благодарен за любые подсказки.

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


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

Оставить только

  //настройка предделителя частоты
  AT91C_BASE_US0->US_BRGR = baud;

 

Разнести настройку режимов работы от настройки скорости.

Изменено пользователем rezident
Ненужное цитирование.

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


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

Оставить только

  //настройка предделителя частоты
  AT91C_BASE_US0->US_BRGR = baud;

 

Спасибо за подсказку. Скорость действительно меняется если изменить AT91C_BASE_US0->US_BRGR не трогая остального кода настройки уарта.

 

Покопался в коде и заметил что после занесения команды на смену скорости микросхемы в фифо уарта сразу переключал скорость у уарта.

В итоге команда даже не успевала отправляться.

Ввёл таймаут на отправку данных - всё работает как положено.

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


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

Ввёл таймаут на отправку данных - всё работает как положено.

 

Правильнее будет - дождаться окончания передачи всего что ждёт (должны быть флаги соответствующие у UART), а не таймаутом.

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


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

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

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

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

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

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

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

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

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

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