Простейшая форма связи USART основана на опросе состояния устройства USART. Каждый модуль USM STM32 имеет 6 регистров, 4 из которых используются для настройки с помощью процедур инициализации, предоставляемых библиотекой драйверов. Остальные 2 регистра — это «регистр данных» и «регистр состояния». Хотя регистр данных занимает одно слово памяти, на самом деле это два отдельных местоположения; когда регистр данных записывается, записанный символ передается USART. Когда считывается регистр данных, возвращается символ, последний раз полученный USART. Регистр состояния содержит несколько флагов для определения текущего состояния USART. Наиболее важными из них являются:
USART_FLAG_TXE -- Transmit data register empty USART_FLAG_RXNE -- Receive data register not empty
Другие флаги предоставляют информацию об ошибках, включая ошибки четности, кадрирования и переполнения, которые следует проверять в надежной реализации.
Чтобы передать символ, прикладная программа должна дождаться, пока регистр передаваемых данных будет пустым, и затем записать символ, который будет передан в этот регистр. Состояние регистра передаваемых данных определяется путем проверки флага USART_FLAG_TXE регистра состояния USART. Следующий код реализует базовую процедуру putchar с использованием USART1.
int putchar(int c){
while (USART_GetFlagStatus(USART1 , USART_FLAG_TXE) == RESET);
USART1 ->DR = (c & 0xff);
return 0;
}
С одним регистром передаваемых данных эта реализация является такой же быстрой, как базовая скорость передачи, и должна ждать («опрашивая» состояние флага) между символами. Для простых программ это может быть приемлемо, но в целом предпочтительна неблокированная реализация. Двойным putchar является getchar.
int getchar(void){
while (USART_GetFlagStatus(USART1 , USART_FLAG_RXNE) == RESET);
return USART1 ->DR & 0xff;
}
Обратите внимание на использование флага состояния USART_IT_RXNE, чтобы определить, когда есть символ для получения («получить данные, не пустые»). Также обратите внимание на использование маски для выбора младших 8 битов, возвращаемых USART_ReceiveData — эта библиотечная процедура возвращает 9 битов по умолчанию, поскольку конфигурация USART допускает 9-битные данные. Например, 9-й бит может содержать информацию о четности, которая может использоваться для проверки достоверности полученного символа.
В то время как реализация опроса putchar имеет недостаток медленной реализации, реализация опроса getchar имеет фатальный недостаток — если код приложения не получает символы по мере их поступления, но хост продолжает отправлять символы, произойдет «переполнение», что приводит к потере данных. STM32 имеет только один буфер принимаемых данных, тогда как многие микроконтроллеры имеют 8 или 16 символьных буферов. Это обеспечивает очень мало места для изменения времени в коде приложения, который отвечает за мониторинг приемника USART.
В дальнейшем мы обсудим использование кода, управляемого прерываниями, для устранения этого недостатка.