# Работа с UART (Си) Рассмотрим передачу и приём сообщения по UART подробнее (на Си). Сконфигурировать UART на передачу и приём сообщения на Си также просто как и на ассемблере мультиклеточного процессора. Кроме того на Си для работы с UART доступны полезные функции и макросы, такие как вывод значения типа int, вывод строки, вывод заданного массива памяти данных. В приведённых ниже примерах кода используется библиотека для работы с UART, которую необходимо подключить: #include ## а) Передача по UART ### 1. Настраиваем UART на передачу Первым шагом задаём структуру (все элементы структуры можно посмотреть в файле uart.h). UART_InitTypeDef UART_InitStructure; Затем инициализируем нужные параметры (незаданные параметры по умолчанию инициализируются нулём). UART_InitStructure.BaudRate = 38400; //скорость обмена данными UART_InitStructure.TypeParity = 0x00000000; //тип контроля четности UART_InitStructure.Parity = 0x00000000; //разрешение контроля четности UART_InitStructure.FlowControl = 0x00000000; //разрешение аппаратного контроля UART_InitStructure.Mode = 0x00000002; //разрешение передачи Инициализация для UART0: uart_init(UART0, &UART_InitStructure); Для UART3: uart_init(UART3, &UART_InitStructure); ### 2. Разрешаем альтернативные функции порта Для UART0: GPIOB->BPS = 0x00000F00; Для UART3: GPIOD->BPS = 0x00000F00; ### 3. Проверка буфера передатчика на полноту Для UART0: while(UART_FIFO_TX_FULL(UART0) == 1); Для UART3: while(UART_FIFO_TX_FULL(UART3) == 1); ### 4.Передача байта по UART Для UART0: UART_SEND_BYTE(0xAB, UART0); Для UART3: UART_SEND_BYTE(0xAB, UART3); В результате можно получить простой пример по отправке байта по UART со скоростью 38400 Кбит/с: Для UART0: #include #include void main() { UART_InitTypeDef UART_InitStructure; UART_InitStructure.BaudRate = 38400; //скорость обмена данными UART_InitStructure.TypeParity = 0x00000000; //тип контроля четности UART_InitStructure.Parity = 0x00000000; //разрешение контроля четности UART_InitStructure.FlowControl = 0x00000000; //разрешение аппаратного контроля UART_InitStructure.Mode = 0x00000002; //разрешение передачи uart_init(UART0, &UART_InitStructure); GPIOB->BPS = 0x00000F00; while(UART_FIFO_TX_FULL(UART0) == 1); UART_SEND_BYTE(0xAB, UART0); } Для UART3 пример можно составить аналогично, только лишь заменив порт B на D и UART0 на UART3. Переданный байт данных можно получить с помощью программы - монитора COM-порта настроенного на данные с 1 стоп-битом, скоростью передачи 38400 кбит/с, размером данных - 8 бит и отключённым контролем чётности. ## б) Приём по UART Для приёма по UART необходимо: ### 1. Выполнить пункты 1,2 под а) ### 2. Проверить буфер приемника на наличие новых данных Для UART0: while(UART_NEW_DATA(UART0) == 0); Для UART3: while(UART_NEW_DATA(UART3) == 0); ### 3. Прочитать данные Для UART0: rbyte = UART_GET_BYTE(UART0); Для UART3: rbyte = UART_GET_BYTE(UART3); Пример приёма байта данных составить довольно просто по аналогии с передачей байта. Следует заметить, что помимо анализа буфера приемника на наличие новых данных, необходимо проверять буфер приёма на полноту. ## API функции UART: Кроме полезных макросов имеются функции для вывода данных по UART. Разберём подробнее каждую функцию, которая объявлена в uart.h `void uart_init(UART_TypeDef *UART, UART_InitTypeDef* UART_InitStruct) Функция _uart_init()_ выполняет инициализацию заданного номера UART. UART - может принимать значения: UART0, UART1, UART2, UART3 UART_InitStruct - структура, содержащая элементы конфигурации UART `void DM2UART(UART_TypeDef *UART, int start_address, int size_block) Функция _DM2UART ()_ выводит область памяти данных по UART младшим байтом вперёд. UART - может принимать значения: UART0, UART1, UART2, UART3 start_address - начальный адрес памяти данных size_block - размер области данных `void uart_send_str(char *str, UART_TypeDef *UART) Функция _uart_send_str()_ выводит строку по UART. UART - может принимать значения: UART0, UART1, UART2, UART3 str - строка символов `void uart_send_int(int str, UART_TypeDef *UART) Функция _uart_send_int()_ выводит переменную типа int по UART. UART - может принимать значения: UART0, UART1, UART2, UART3 str - переменная типа int ### Замечание: В версиях библиотеки до 01.04.13 необходимо перед вызовом функций DM2UART (), uart_send_int() применять конструкцию: `while(UART_FIFO_TX_EMPTY(UART0) == 0); В версиях библиотеки после 01.04.13 функции могут использоваться самостоятельно.