STM32.USART Инициализация модуля

Мы уже рассмотрели регистры приемопередатчика, а теперь попробуем соединить все это воедино, и выполнить инициализацию модуля применительно к конкретной задаче. Итак, необходимо настроить USART1 для связи с ПК. Скорость обмена 9600, длина слова 8 бит, 2 стоп бита, без контроля паритета, частота тактового сигнала 24 MHz.

Для начала включим тактирование:

RCC->APB2ENR |= RCC_APB2ENR_IOPAEN;   //Тактирование GPIO

RCC->APB2ENR |= RCC_APB2ENR_AFIOEN;   //Тактирование альтернативных функций GPIO

RCC->APB2ENR |= RCC_APB2ENR_USART1EN; //Тактирование модуля USART1

Затем зададим скорость обмена.

USARTDIV = fck / (16*baud) = 24000000/(16 * 9600) = 156,25

DIV_Mantissa = 0d156 = 0x9c;

DIV_Fraction = 0.25 * 16 = 4;

Запишем значение скорости в регистр:

USART1->BRR = 0x09с4;                //скорость обмена 9600

Задаем количество стоп-битов:

USART1->CR2 |= USART_CR2_STOP_0;     //2 стоп-бита

Разрешаем работу приемника, передатчика и модуля в целом:

USART1->CR1 = USART_CR1_RE | USART_CR1_TE | USART_CR1_UE;

Вот, собственно, и все. Инициализация выполнена.

Для передачи данных на ПК необходимо записать передаваемый байт в DR:

USART1->DR = data;                      //передать байт data

Прежде чем передавать следующий байт, необходимо дождаться окончание передачи предыдущей посылки:

while((USART1->SR & USART_SR_TC)==0) {} //ждем конец передачи

USART1->SR &= ~USART_SR_TC;             //очистить флаг окончания передачи

А так принимаем байт от ПК:

while((USART1->SR & USART_SR_RXNE)==0) {}//ожидание приема

tmp = USART1->DR;                        //прочитать принятый байт

Флаг окончания приема сброситься автоматически после чтения регистра данных.

О первоисточнике можете узнать тут