Project

General

Profile

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

krufter_multiclet, 04/18/2013 06:48 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