Project

General

Profile

Работа с UART (Си) » History » Version 26

krufter_multiclet, 04/18/2013 07:11 PM

1 1 krufter_multiclet
h1. Работа с UART (Си)
2 3 krufter_multiclet
3 3 krufter_multiclet
Рассмотрим передачу и приём сообщения по UART подробнее (на Си).
4 3 krufter_multiclet
5 4 krufter_multiclet
Сконфигурировать UART на передачу и приём сообщения на Си также просто как и на ассемблере мультиклеточного процессора. 
6 4 krufter_multiclet
Кроме того на Си для работы с UART доступны полезные функции и макросы, такие как вывод значения типа int, вывод строки,
7 4 krufter_multiclet
вывод заданного массива памяти данных.
8 5 krufter_multiclet
9 5 krufter_multiclet
В приведённых ниже примерах кода используется библиотека для работы с UART, которую необходимо подключить:
10 5 krufter_multiclet
<pre>
11 5 krufter_multiclet
#include <uart.h>
12 5 krufter_multiclet
</pre>
13 6 krufter_multiclet
14 16 krufter_multiclet
h2. а) Передача по UART
15 8 krufter_multiclet
16 6 krufter_multiclet
h3. 1. Настраиваем UART на передачу
17 6 krufter_multiclet
18 6 krufter_multiclet
Первым шагом задаём структуру (все элементы структуры можно посмотреть в файле uart.h).
19 6 krufter_multiclet
<pre>
20 6 krufter_multiclet
UART_InitTypeDef UART_InitStructure;
21 6 krufter_multiclet
</pre>
22 6 krufter_multiclet
23 7 krufter_multiclet
Затем инициализируем нужные параметры (незаданные параметры по умолчанию инициализируются нулём).
24 7 krufter_multiclet
<pre>
25 12 krufter_multiclet
    UART_InitStructure.BaudRate = 38400; //скорость обмена данными
26 7 krufter_multiclet
    UART_InitStructure.TypeParity = 0x00000000; //тип контроля четности
27 7 krufter_multiclet
    UART_InitStructure.Parity = 0x00000000; //разрешение контроля четности
28 7 krufter_multiclet
    UART_InitStructure.FlowControl = 0x00000000; //разрешение аппаратного контроля
29 7 krufter_multiclet
    UART_InitStructure.Mode = 0x00000002; //разрешение передачи  
30 7 krufter_multiclet
</pre>
31 18 krufter_multiclet
Инициализация для UART0:
32 18 krufter_multiclet
<pre>
33 18 krufter_multiclet
uart_init(UART0, &UART_InitStructure);
34 18 krufter_multiclet
</pre>
35 18 krufter_multiclet
Для UART3:
36 18 krufter_multiclet
<pre>
37 18 krufter_multiclet
uart_init(UART3, &UART_InitStructure);
38 18 krufter_multiclet
</pre>
39 9 krufter_multiclet
40 9 krufter_multiclet
h3. 2. Разрешаем альтернативные функции порта
41 9 krufter_multiclet
42 9 krufter_multiclet
Для UART0:
43 9 krufter_multiclet
<pre>
44 9 krufter_multiclet
GPIOB->BPS = 0x00000F00;
45 9 krufter_multiclet
</pre>
46 9 krufter_multiclet
47 9 krufter_multiclet
Для UART3:
48 9 krufter_multiclet
<pre>
49 9 krufter_multiclet
GPIOD->BPS = 0x00000F00;
50 9 krufter_multiclet
</pre>
51 10 krufter_multiclet
52 11 krufter_multiclet
h3. 3. Проверка буфера передатчика на полноту
53 10 krufter_multiclet
54 10 krufter_multiclet
Для UART0:
55 10 krufter_multiclet
<pre>
56 10 krufter_multiclet
while(UART_FIFO_TX_FULL(UART0) == 1);
57 10 krufter_multiclet
</pre>
58 10 krufter_multiclet
59 10 krufter_multiclet
Для UART3:
60 10 krufter_multiclet
<pre>
61 10 krufter_multiclet
while(UART_FIFO_TX_FULL(UART3) == 1);
62 10 krufter_multiclet
</pre>
63 10 krufter_multiclet
64 11 krufter_multiclet
h3. 4.Передача байта по UART
65 10 krufter_multiclet
66 10 krufter_multiclet
Для UART0:
67 10 krufter_multiclet
<pre>
68 10 krufter_multiclet
UART_SEND_BYTE(0xAB, UART0);
69 10 krufter_multiclet
</pre>
70 10 krufter_multiclet
71 10 krufter_multiclet
Для UART3:
72 10 krufter_multiclet
<pre>
73 10 krufter_multiclet
UART_SEND_BYTE(0xAB, UART3);
74 1 krufter_multiclet
</pre>
75 10 krufter_multiclet
76 11 krufter_multiclet
В результате можно получить простой пример по отправке байта по UART со скоростью 38400 Кбит/с:
77 1 krufter_multiclet
78 12 krufter_multiclet
Для UART0:
79 1 krufter_multiclet
<pre>
80 12 krufter_multiclet
#include <HDL51001_ccf.h>
81 12 krufter_multiclet
#include <uart.h>
82 1 krufter_multiclet
83 12 krufter_multiclet
void main()
84 12 krufter_multiclet
{
85 12 krufter_multiclet
   UART_InitTypeDef UART_InitStructure;
86 12 krufter_multiclet
   
87 12 krufter_multiclet
    UART_InitStructure.BaudRate = 38400; //скорость обмена данными
88 12 krufter_multiclet
    UART_InitStructure.TypeParity = 0x00000000; //тип контроля четности
89 12 krufter_multiclet
    UART_InitStructure.Parity = 0x00000000; //разрешение контроля четности
90 1 krufter_multiclet
    UART_InitStructure.FlowControl = 0x00000000; //разрешение аппаратного контроля
91 18 krufter_multiclet
    UART_InitStructure.Mode = 0x00000002; //разрешение передачи
92 18 krufter_multiclet
93 18 krufter_multiclet
    uart_init(UART0, &UART_InitStructure);  
94 12 krufter_multiclet
95 12 krufter_multiclet
    GPIOB->BPS = 0x00000F00;
96 12 krufter_multiclet
97 12 krufter_multiclet
    while(UART_FIFO_TX_FULL(UART0) == 1);
98 12 krufter_multiclet
    UART_SEND_BYTE(0xAB, UART0);
99 12 krufter_multiclet
}
100 1 krufter_multiclet
</pre>
101 12 krufter_multiclet
102 12 krufter_multiclet
Для UART3 пример можно составить аналогично, только лишь заменив порт B на D и UART0 на UART3.
103 10 krufter_multiclet
104 10 krufter_multiclet
Переданный байт данных можно получить с помощью программы - монитора COM-порта настроенного на данные с 1 стоп-битом,
105 10 krufter_multiclet
скоростью передачи 38400 кбит/с, размером данных - 8 бит и отключённым контролем чётности.
106 13 krufter_multiclet
107 16 krufter_multiclet
h2. б) Приём по UART
108 13 krufter_multiclet
109 13 krufter_multiclet
Для приёма по UART необходимо:
110 13 krufter_multiclet
111 13 krufter_multiclet
h3. 1. Выполнить пункты 1,2 под а)
112 13 krufter_multiclet
113 13 krufter_multiclet
h3. 2. Проверить буфер приемника на наличие новых данных
114 13 krufter_multiclet
115 13 krufter_multiclet
Для UART0:
116 13 krufter_multiclet
<pre>
117 14 krufter_multiclet
while(UART_NEW_DATA(UART0) == 0);
118 13 krufter_multiclet
</pre>
119 13 krufter_multiclet
120 13 krufter_multiclet
Для UART3:
121 13 krufter_multiclet
<pre>
122 14 krufter_multiclet
while(UART_NEW_DATA(UART3) == 0);
123 1 krufter_multiclet
</pre>
124 14 krufter_multiclet
125 15 krufter_multiclet
h3. 3. Прочитать данные
126 14 krufter_multiclet
127 14 krufter_multiclet
Для UART0:
128 14 krufter_multiclet
<pre>
129 14 krufter_multiclet
rbyte = UART_GET_BYTE(UART0);
130 14 krufter_multiclet
</pre>
131 14 krufter_multiclet
132 14 krufter_multiclet
Для UART3:
133 14 krufter_multiclet
<pre>
134 14 krufter_multiclet
rbyte = UART_GET_BYTE(UART3);
135 14 krufter_multiclet
</pre>
136 14 krufter_multiclet
137 19 krufter_multiclet
Пример приёма байта данных составить довольно просто по аналогии с передачей байта. Следует заметить, что помимо анализа буфера приемника на
138 19 krufter_multiclet
наличие новых данных, необходимо проверять буфер приёма на полноту.
139 17 krufter_multiclet
140 17 krufter_multiclet
h2. API функции UART:
141 17 krufter_multiclet
142 17 krufter_multiclet
Кроме полезных макросов имеются функции для вывода данных по UART.
143 17 krufter_multiclet
Разберём подробнее каждую функцию, которая объявлена в uart.h
144 20 krufter_multiclet
145 25 krufter_multiclet
<pre>1) void uart_init(UART_TypeDef *UART, UART_InitTypeDef* UART_InitStruct)</pre>
146 20 krufter_multiclet
147 20 krufter_multiclet
Фунция _uart_init()_ выполняет инициализацию заданного номера UART.
148 20 krufter_multiclet
UART - может принимать значения: UART0, UART1, UART2, UART3
149 1 krufter_multiclet
UART_InitStruct - структура, содержащая элементы конфигурации UART
150 25 krufter_multiclet
151 25 krufter_multiclet
<pre>2) void DM2UART(UART_TypeDef *UART, int start_address, int size_block)</pre>
152 25 krufter_multiclet
153 25 krufter_multiclet
Фунция _DM2UART()_ выводит область памяти данных по UART младшим байтом вперёд.
154 25 krufter_multiclet
UART - может принимать значения: UART0, UART1, UART2, UART3
155 25 krufter_multiclet
start_address - начальный адрес памяти данных
156 25 krufter_multiclet
size_block - размер области данных
157 25 krufter_multiclet
158 25 krufter_multiclet
<pre>3) void uart_send_str(char *str, UART_TypeDef *UART)</pre>
159 25 krufter_multiclet
160 25 krufter_multiclet
Фунция _uart_send_str_ выводит строку по UART.
161 25 krufter_multiclet
UART - может принимать значения: UART0, UART1, UART2, UART3
162 25 krufter_multiclet
str - строка символов
163 25 krufter_multiclet
164 25 krufter_multiclet
<pre>4) void uart_send_int(int str, UART_TypeDef *UART)</pre>
165 25 krufter_multiclet
166 26 krufter_multiclet
Фунция _uart_send_int()_ выводит переменную типа int по UART.
167 25 krufter_multiclet
UART - может принимать значения: UART0, UART1, UART2, UART3
168 26 krufter_multiclet
str - переменная типа int
169 1 krufter_multiclet
170 1 krufter_multiclet
171 26 krufter_multiclet
Замечание: В версиях библиотеки до 01.04.13 необходимо перед вызовом функций DM2UART(), uart_send_int()
172 26 krufter_multiclet
применять конструкцию:
173 26 krufter_multiclet
<pre>
174 26 krufter_multiclet
while(UART_FIFO_TX_EMPTY(UART0) == 0);
175 26 krufter_multiclet
</pre>
176 26 krufter_multiclet
В версиях библиотеки после 01.04.13 функции могут использоваться самостоятельно.