1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
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 функции могут использоваться самостоятельно.
|