Работа с UART (ASM) » History » Version 18
krufter_multiclet, 04/16/2013 07:28 PM
1 | 1 | krufter_multiclet | h1. Работа с UART (ASM) |
---|---|---|---|
2 | 1 | krufter_multiclet | |
3 | 2 | krufter_multiclet | Рассмотрим передачу и приём сообщений посредством интерфейса UART подробнее(на ассемблере). |
4 | 2 | krufter_multiclet | В приведённых ниже примерах кода используется список констант, который необходимо подключить директивой " .include " |
5 | 2 | krufter_multiclet | <pre> |
6 | 2 | krufter_multiclet | .include "HDL50001_pcf.inc" |
7 | 2 | krufter_multiclet | </pre> |
8 | 2 | krufter_multiclet | |
9 | 2 | krufter_multiclet | |
10 | 10 | krufter_multiclet | h2. а) Передача по UART |
11 | 7 | krufter_multiclet | |
12 | 10 | krufter_multiclet | h3. 1. Разрешаем алтернативные функции порта. |
13 | 2 | krufter_multiclet | |
14 | 4 | krufter_multiclet | В настоящее время выпущены две отладочные платы, в которых задействованы UART0(HW1-MCp04) и UART3(LDM-MCp04). |
15 | 2 | krufter_multiclet | Рассмотрим команды ассемблера для разрешения алтернативных функций порта. |
16 | 2 | krufter_multiclet | Для UART0: |
17 | 2 | krufter_multiclet | <pre> |
18 | 5 | krufter_multiclet | getl 0x00000F00 |
19 | 5 | krufter_multiclet | wrl @1, GPIOB_BPS |
20 | 5 | krufter_multiclet | </pre> |
21 | 5 | krufter_multiclet | |
22 | 5 | krufter_multiclet | Для UART3: |
23 | 5 | krufter_multiclet | <pre> |
24 | 5 | krufter_multiclet | getl 0x00000F00 |
25 | 5 | krufter_multiclet | wrl @1, GPIOD_BPS |
26 | 2 | krufter_multiclet | </pre> |
27 | 6 | krufter_multiclet | |
28 | 10 | krufter_multiclet | h3. 2. Настраиваем UART на передачу, устанавливаем скорость работы. |
29 | 6 | krufter_multiclet | |
30 | 6 | krufter_multiclet | Для настройки UART на передачу запишем следующее значение в регистр управления: |
31 | 6 | krufter_multiclet | Для UART0: |
32 | 6 | krufter_multiclet | <pre> |
33 | 6 | krufter_multiclet | getl 0x00000002 |
34 | 6 | krufter_multiclet | wrl @1, UART0_CR |
35 | 6 | krufter_multiclet | </pre> |
36 | 6 | krufter_multiclet | |
37 | 6 | krufter_multiclet | Для UART3: |
38 | 6 | krufter_multiclet | <pre> |
39 | 6 | krufter_multiclet | getl 0x00000002 |
40 | 6 | krufter_multiclet | wrl @1, UART3_CR |
41 | 6 | krufter_multiclet | </pre> |
42 | 11 | krufter_multiclet | |
43 | 11 | krufter_multiclet | Для установки скорости используется коэффициент деления BRDIV = Fsys/(8*Fuart - 1) |
44 | 12 | krufter_multiclet | Для скорости 38400 кбит/с: |
45 | 12 | krufter_multiclet | |
46 | 12 | krufter_multiclet | Для UART0: |
47 | 12 | krufter_multiclet | <pre> |
48 | 12 | krufter_multiclet | getl 0x00000104 |
49 | 12 | krufter_multiclet | wrl @1, UART0_BDR |
50 | 12 | krufter_multiclet | </pre> |
51 | 12 | krufter_multiclet | |
52 | 12 | krufter_multiclet | Для UART3: |
53 | 12 | krufter_multiclet | <pre> |
54 | 12 | krufter_multiclet | getl 0x00000104 |
55 | 12 | krufter_multiclet | wrl @1, UART3_BDR |
56 | 12 | krufter_multiclet | </pre> |
57 | 13 | krufter_multiclet | |
58 | 13 | krufter_multiclet | h3. 3. Проверка буфера передатчика на полноту. |
59 | 13 | krufter_multiclet | |
60 | 13 | krufter_multiclet | Для UART0: |
61 | 13 | krufter_multiclet | <pre> |
62 | 13 | krufter_multiclet | fifo_tx_full: |
63 | 13 | krufter_multiclet | rdl UART0_ST |
64 | 13 | krufter_multiclet | getl 0x00000200 |
65 | 13 | krufter_multiclet | and @1, @2 |
66 | 13 | krufter_multiclet | je @1, fifo_tx_full |
67 | 14 | krufter_multiclet | jne @2, send_byte |
68 | 13 | krufter_multiclet | complete |
69 | 13 | krufter_multiclet | </pre> |
70 | 1 | krufter_multiclet | |
71 | 14 | krufter_multiclet | Для UART3: |
72 | 14 | krufter_multiclet | <pre> |
73 | 14 | krufter_multiclet | fifo_tx_full: |
74 | 14 | krufter_multiclet | rdl UART3_ST |
75 | 14 | krufter_multiclet | getl 0x00000200 |
76 | 14 | krufter_multiclet | and @1, @2 |
77 | 14 | krufter_multiclet | je @1, fifo_tx_full |
78 | 14 | krufter_multiclet | jne @2, send_byte |
79 | 14 | krufter_multiclet | complete |
80 | 14 | krufter_multiclet | </pre> |
81 | 14 | krufter_multiclet | |
82 | 14 | krufter_multiclet | |
83 | 13 | krufter_multiclet | h3. 4. Передача байта по UART. |
84 | 13 | krufter_multiclet | |
85 | 13 | krufter_multiclet | Для UART0: |
86 | 13 | krufter_multiclet | <pre> |
87 | 13 | krufter_multiclet | getb 0xAB |
88 | 13 | krufter_multiclet | wrb @1, UART0_DATA |
89 | 13 | krufter_multiclet | </pre> |
90 | 13 | krufter_multiclet | |
91 | 13 | krufter_multiclet | Для UART3: |
92 | 13 | krufter_multiclet | <pre> |
93 | 13 | krufter_multiclet | getb 0xAB |
94 | 1 | krufter_multiclet | wrb @1, UART3_DATA |
95 | 14 | krufter_multiclet | </pre> |
96 | 14 | krufter_multiclet | |
97 | 14 | krufter_multiclet | В результате можно получить простой пример по отправке байта по UART со скоростью 38400 Кбит/с: |
98 | 14 | krufter_multiclet | |
99 | 14 | krufter_multiclet | Для UART0: |
100 | 14 | krufter_multiclet | <pre> |
101 | 14 | krufter_multiclet | preset_UART0: |
102 | 14 | krufter_multiclet | getl 0x00000F00 |
103 | 14 | krufter_multiclet | wrl @1, GPIOB_BPS |
104 | 14 | krufter_multiclet | getl 0x00000104 |
105 | 14 | krufter_multiclet | wrl @1, UART0_BDR |
106 | 14 | krufter_multiclet | getl 0x00000002 |
107 | 14 | krufter_multiclet | wrl @1, UART0_CR |
108 | 14 | krufter_multiclet | jmp fifo_tx_full |
109 | 14 | krufter_multiclet | complete |
110 | 14 | krufter_multiclet | |
111 | 14 | krufter_multiclet | fifo_tx_full: |
112 | 14 | krufter_multiclet | rdl UART0_ST |
113 | 14 | krufter_multiclet | getl 0x00000200 |
114 | 14 | krufter_multiclet | and @1, @2 |
115 | 14 | krufter_multiclet | je @1, fifo_tx_full |
116 | 14 | krufter_multiclet | jne @2, paragraph |
117 | 14 | krufter_multiclet | complete |
118 | 14 | krufter_multiclet | |
119 | 14 | krufter_multiclet | send_byte: |
120 | 14 | krufter_multiclet | getb 0xAB |
121 | 14 | krufter_multiclet | wrb @1, UART0_DATA |
122 | 14 | krufter_multiclet | complete |
123 | 13 | krufter_multiclet | </pre> |
124 | 15 | krufter_multiclet | |
125 | 15 | krufter_multiclet | Для UART3 всё будет аналогично. Ознакомиться с другими примерами работы с UART можно в Хранилище, интересующие вопросы по всем интерфейсам можно задать на форуме. |
126 | 16 | krufter_multiclet | |
127 | 16 | krufter_multiclet | h2. б) Приём по UART |
128 | 17 | krufter_multiclet | |
129 | 17 | krufter_multiclet | Для приёма байта по UART необходимо: |
130 | 18 | krufter_multiclet | |
131 | 18 | krufter_multiclet | h3. 1. Разрешить алтернативные функции портов (аналогично пункту 1 в "передаче") |
132 | 17 | krufter_multiclet | |
133 | 17 | krufter_multiclet | h3. 2. Настраиваем UART на приём, устанавливаем скорость работы. |
134 | 17 | krufter_multiclet | |
135 | 17 | krufter_multiclet | Для настройки UART на передачу запишем следующее значение в регистр управления: |
136 | 17 | krufter_multiclet | Для UART0: |
137 | 17 | krufter_multiclet | <pre> |
138 | 17 | krufter_multiclet | getl 0x00000001 |
139 | 17 | krufter_multiclet | wrl @1, UART0_CR |
140 | 17 | krufter_multiclet | </pre> |
141 | 17 | krufter_multiclet | |
142 | 17 | krufter_multiclet | Для UART3: |
143 | 17 | krufter_multiclet | <pre> |
144 | 17 | krufter_multiclet | getl 0x00000001 |
145 | 17 | krufter_multiclet | wrl @1, UART3_CR |
146 | 17 | krufter_multiclet | </pre> |
147 | 17 | krufter_multiclet | |
148 | 17 | krufter_multiclet | Настройка скорости работы аналогично пункту 2 в "передаче". |