diff options
| author | vlapa <vlapa@ya.ru> | 2026-06-13 20:33:26 +0300 |
|---|---|---|
| committer | vlapa <vlapa@ya.ru> | 2026-06-13 20:33:26 +0300 |
| commit | e5abc1fe99340b979b18864d978179f71fe8f5c5 (patch) | |
| tree | 98fd0ad7c6d0744894d6e74e446daacd9e6dd1b5 /_PROGRAMs/C++/C UART.md | |
First
Diffstat (limited to '_PROGRAMs/C++/C UART.md')
| -rw-r--r-- | _PROGRAMs/C++/C UART.md | 165 |
1 files changed, 165 insertions, 0 deletions
diff --git a/_PROGRAMs/C++/C UART.md b/_PROGRAMs/C++/C UART.md new file mode 100644 index 0000000..f58dd7c --- /dev/null +++ b/_PROGRAMs/C++/C UART.md @@ -0,0 +1,165 @@ +# Работа с UART (Си) + +Рассмотрим передачу и приём сообщения по UART подробнее (на Си). + +Сконфигурировать UART на передачу и приём сообщения на Си также просто как и на ассемблере мультиклеточного процессора. +Кроме того на Си для работы с UART доступны полезные функции и макросы, такие как вывод значения типа int, вывод строки, +вывод заданного массива памяти данных. + +В приведённых ниже примерах кода используется библиотека для работы с UART, которую необходимо подключить: + +#include <uart.h> + +## а) Передача по 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 <HDL51001_ccf.h> +#include <uart.h> + +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 функции могут использоваться самостоятельно.
\ No newline at end of file |
