summaryrefslogtreecommitdiff
path: root/_PROGRAMs/C++/C UART.md
diff options
context:
space:
mode:
authorvlapa <vlapa@ya.ru>2026-06-13 20:33:26 +0300
committervlapa <vlapa@ya.ru>2026-06-13 20:33:26 +0300
commite5abc1fe99340b979b18864d978179f71fe8f5c5 (patch)
tree98fd0ad7c6d0744894d6e74e446daacd9e6dd1b5 /_PROGRAMs/C++/C UART.md
First
Diffstat (limited to '_PROGRAMs/C++/C UART.md')
-rw-r--r--_PROGRAMs/C++/C UART.md165
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