Project

General

Profile

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

krufter_multiclet, 04/18/2013 06:37 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 8 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 9 krufter_multiclet
32 9 krufter_multiclet
h3. 2. Разрешаем альтернативные функции порта
33 9 krufter_multiclet
34 9 krufter_multiclet
Для UART0:
35 9 krufter_multiclet
<pre>
36 9 krufter_multiclet
GPIOB->BPS = 0x00000F00;
37 9 krufter_multiclet
</pre>
38 9 krufter_multiclet
39 9 krufter_multiclet
Для UART3:
40 9 krufter_multiclet
<pre>
41 9 krufter_multiclet
GPIOD->BPS = 0x00000F00;
42 9 krufter_multiclet
</pre>
43 10 krufter_multiclet
44 11 krufter_multiclet
h3. 3. Проверка буфера передатчика на полноту
45 10 krufter_multiclet
46 10 krufter_multiclet
Для UART0:
47 10 krufter_multiclet
<pre>
48 10 krufter_multiclet
while(UART_FIFO_TX_FULL(UART0) == 1);
49 10 krufter_multiclet
</pre>
50 10 krufter_multiclet
51 10 krufter_multiclet
Для UART3:
52 10 krufter_multiclet
<pre>
53 10 krufter_multiclet
while(UART_FIFO_TX_FULL(UART3) == 1);
54 10 krufter_multiclet
</pre>
55 10 krufter_multiclet
56 11 krufter_multiclet
h3. 4.Передача байта по UART
57 10 krufter_multiclet
58 10 krufter_multiclet
Для UART0:
59 10 krufter_multiclet
<pre>
60 10 krufter_multiclet
UART_SEND_BYTE(0xAB, UART0);
61 10 krufter_multiclet
</pre>
62 10 krufter_multiclet
63 10 krufter_multiclet
Для UART3:
64 10 krufter_multiclet
<pre>
65 10 krufter_multiclet
UART_SEND_BYTE(0xAB, UART3);
66 1 krufter_multiclet
</pre>
67 10 krufter_multiclet
68 11 krufter_multiclet
В результате можно получить простой пример по отправке байта по UART со скоростью 38400 Кбит/с:
69 1 krufter_multiclet
70 12 krufter_multiclet
Для UART0:
71 1 krufter_multiclet
<pre>
72 12 krufter_multiclet
#include <HDL51001_ccf.h>
73 12 krufter_multiclet
#include <uart.h>
74 1 krufter_multiclet
75 12 krufter_multiclet
void main()
76 12 krufter_multiclet
{
77 12 krufter_multiclet
   UART_InitTypeDef UART_InitStructure;
78 12 krufter_multiclet
   
79 12 krufter_multiclet
    UART_InitStructure.BaudRate = 38400; //скорость обмена данными
80 12 krufter_multiclet
    UART_InitStructure.TypeParity = 0x00000000; //тип контроля четности
81 12 krufter_multiclet
    UART_InitStructure.Parity = 0x00000000; //разрешение контроля четности
82 12 krufter_multiclet
    UART_InitStructure.FlowControl = 0x00000000; //разрешение аппаратного контроля
83 12 krufter_multiclet
    UART_InitStructure.Mode = 0x00000002; //разрешение передачи  
84 12 krufter_multiclet
85 12 krufter_multiclet
    GPIOB->BPS = 0x00000F00;
86 12 krufter_multiclet
87 12 krufter_multiclet
    while(UART_FIFO_TX_FULL(UART0) == 1);
88 12 krufter_multiclet
    UART_SEND_BYTE(0xAB, UART0);
89 12 krufter_multiclet
}
90 1 krufter_multiclet
</pre>
91 12 krufter_multiclet
92 12 krufter_multiclet
Для UART3 пример можно составить аналогично, только лишь заменив порт B на D и UART0 на UART3.
93 10 krufter_multiclet
94 10 krufter_multiclet
Переданный байт данных можно получить с помощью программы - монитора COM-порта настроенного на данные с 1 стоп-битом,
95 10 krufter_multiclet
скоростью передачи 38400 кбит/с, размером данных - 8 бит и отключённым контролем чётности.
96 13 krufter_multiclet
97 13 krufter_multiclet
h2. б)Приём по UART
98 13 krufter_multiclet
99 13 krufter_multiclet
Для приёма по UART необходимо:
100 13 krufter_multiclet
101 13 krufter_multiclet
h3. 1. Выполнить пункты 1,2 под а)
102 13 krufter_multiclet
103 13 krufter_multiclet
h3. 2. Проверить буфер приемника на наличие новых данных
104 13 krufter_multiclet
105 13 krufter_multiclet
Для UART0:
106 13 krufter_multiclet
<pre>
107 14 krufter_multiclet
while(UART_NEW_DATA(UART0) == 0);
108 13 krufter_multiclet
</pre>
109 13 krufter_multiclet
110 13 krufter_multiclet
Для UART3:
111 13 krufter_multiclet
<pre>
112 14 krufter_multiclet
while(UART_NEW_DATA(UART3) == 0);
113 1 krufter_multiclet
</pre>
114 14 krufter_multiclet
115 15 krufter_multiclet
h3. 3. Прочитать данные
116 14 krufter_multiclet
117 14 krufter_multiclet
Для UART0:
118 14 krufter_multiclet
<pre>
119 14 krufter_multiclet
rbyte = UART_GET_BYTE(UART0);
120 14 krufter_multiclet
</pre>
121 14 krufter_multiclet
122 14 krufter_multiclet
Для UART3:
123 14 krufter_multiclet
<pre>
124 14 krufter_multiclet
rbyte = UART_GET_BYTE(UART3);
125 14 krufter_multiclet
</pre>
126 14 krufter_multiclet
127 14 krufter_multiclet
Пример приёма байта данных составить довольно просто по аналогии с передачей байта.