Работа с UART (ASM) » History » Version 26
Version 25 (krufter_multiclet, 07/18/2013 07:17 PM) → Version 26/27 (krufter_multiclet, 09/19/2013 05:33 PM)
h1. Работа с UART (ASM)
Рассмотрим передачу и приём сообщений посредством интерфейса UART подробнее(на ассемблере).
В приведённых ниже примерах кода используется список констант, который необходимо подключить директивой " .include "
<pre>
.include "HDL50001_pcf.inc"
</pre>
h2. а) Передача по UART
h3. 1. Разрешаем алтернативные функции порта.
В настоящее время выпущены две отладочные платы, в которых задействованы UART0(HW1-MCp04) и UART3(LDM-MCp04).
Рассмотрим команды ассемблера для разрешения алтернативных функций порта.
Для UART0:
<pre>
getl 0x00000F00
wrl @1, GPIOB_BPS
</pre>
Для UART3:
<pre>
getl 0x00000F00
wrl @1, GPIOD_BPS
</pre>
h3. 2. Настраиваем UART на передачу, устанавливаем скорость работы.
Для настройки UART на передачу запишем следующее значение в регистр управления:
Для UART0:
<pre>
getl 0x00000002
wrl @1, UART0_CR
</pre>
Для UART3:
<pre>
getl 0x00000002
wrl @1, UART3_CR
</pre>
Для установки скорости используется коэффициент деления BRDIV = Fsys/(8*Fuart - 1)
Для скорости 38400 кбит/с:
Для UART0:
<pre>
getl 0x00000104
wrl @1, UART0_BDR
</pre>
Для UART3:
<pre>
getl 0x00000104
wrl @1, UART3_BDR
</pre>
h3. 3. Проверка буфера передатчика на полноту.
Для UART0:
<pre>
fifo_tx_full:
rdl UART0_ST
getl 0x00000200
and @1, @2
je @1, fifo_tx_full
jne @2, send_byte
complete
</pre>
Для UART3:
<pre>
fifo_tx_full:
rdl UART3_ST
getl 0x00000200
and @1, @2
je @1, fifo_tx_full
jne @2, send_byte
complete
</pre>
h3. 4. Передача байта по UART.
Для UART0:
<pre>
getb 0xAB
wrb @1, UART0_DATA
</pre>
Для UART3:
<pre>
getb 0xAB
wrb @1, UART3_DATA
</pre>
В результате можно получить простой пример по отправке байта по UART со скоростью 38400 Кбит/с:
Для UART0:
<pre>
.include "HDL50001_pcf.inc"
.text
preset_UART0:
getl 0x00000F00
wrl @1, GPIOB_BPS
getl 0x00000104
wrl @1, UART0_BDR
getl 0x00000002
wrl @1, UART0_CR
jmp fifo_tx_full
complete
fifo_tx_full:
rdl UART0_ST
getl 0x00000200
and @1, @2
je @1, fifo_tx_full
jne @2, paragraph
complete
send_byte:
getb 0xAB
wrb @1, UART0_DATA
complete
</pre>
Для UART3 всё будет аналогично. Ознакомиться с другими примерами работы с UART можно в Хранилище, интересующие вопросы по всем интерфейсам можно задать на форуме.
h2. б) Приём по UART
Для приёма байта по UART необходимо:
h3. 1. Разрешить алтернативные функции портов (аналогично пункту 1 в "передаче")
h3. 2. Настраиваем UART на приём, устанавливаем скорость работы.
Для настройки UART на приём запишем следующее значение в регистр управления:
Для UART0:
<pre>
getl 0x00000001
wrl @1, UART0_CR
</pre>
Для UART3:
<pre>
getl 0x00000001
wrl @1, UART3_CR
</pre>
Настройка скорости работы аналогично пункту 2 в "передаче".
h3. 3. Проверить наличие новых данных в буфере приёма
Для UART0:
<pre>
fifo_rx_newb:
rdl UART0_ST
getl 0x00000001
and @1, @2
je @1, fifo_rx_newb
jne @2, get_byte
complete
</pre>
Для UART3:
<pre>
fifo_rx_newb:
rdl UART3_ST
getl 0x00000001
and @1, @2
je @1, fifo_rx_newb
jne @2, get_byte
complete
</pre>
h3. 4. Принять байт
Для UART0:
<pre>
rdb UART0_DATA
</pre>
Для UART3:
<pre>
rdb UART3_DATA
</pre>
Также пользователям рекомендуется посмотреть на готовые решения для ассемблера, такие как вывод
64-х разрядного значения РОНа и вывод блока памяти данных (аналогично функции на Си).
1) [[Вывод РОНа]]
2) [[Вывод блока памяти данных]]
Замечание:
Примеры с выводом РОНа и Выводом блока памяти данных в ближайшее время будут модифицированы.
Исходники некоторых библиотек также будут доступны в открытом доступе.
Рассмотрим передачу и приём сообщений посредством интерфейса UART подробнее(на ассемблере).
В приведённых ниже примерах кода используется список констант, который необходимо подключить директивой " .include "
<pre>
.include "HDL50001_pcf.inc"
</pre>
h2. а) Передача по UART
h3. 1. Разрешаем алтернативные функции порта.
В настоящее время выпущены две отладочные платы, в которых задействованы UART0(HW1-MCp04) и UART3(LDM-MCp04).
Рассмотрим команды ассемблера для разрешения алтернативных функций порта.
Для UART0:
<pre>
getl 0x00000F00
wrl @1, GPIOB_BPS
</pre>
Для UART3:
<pre>
getl 0x00000F00
wrl @1, GPIOD_BPS
</pre>
h3. 2. Настраиваем UART на передачу, устанавливаем скорость работы.
Для настройки UART на передачу запишем следующее значение в регистр управления:
Для UART0:
<pre>
getl 0x00000002
wrl @1, UART0_CR
</pre>
Для UART3:
<pre>
getl 0x00000002
wrl @1, UART3_CR
</pre>
Для установки скорости используется коэффициент деления BRDIV = Fsys/(8*Fuart - 1)
Для скорости 38400 кбит/с:
Для UART0:
<pre>
getl 0x00000104
wrl @1, UART0_BDR
</pre>
Для UART3:
<pre>
getl 0x00000104
wrl @1, UART3_BDR
</pre>
h3. 3. Проверка буфера передатчика на полноту.
Для UART0:
<pre>
fifo_tx_full:
rdl UART0_ST
getl 0x00000200
and @1, @2
je @1, fifo_tx_full
jne @2, send_byte
complete
</pre>
Для UART3:
<pre>
fifo_tx_full:
rdl UART3_ST
getl 0x00000200
and @1, @2
je @1, fifo_tx_full
jne @2, send_byte
complete
</pre>
h3. 4. Передача байта по UART.
Для UART0:
<pre>
getb 0xAB
wrb @1, UART0_DATA
</pre>
Для UART3:
<pre>
getb 0xAB
wrb @1, UART3_DATA
</pre>
В результате можно получить простой пример по отправке байта по UART со скоростью 38400 Кбит/с:
Для UART0:
<pre>
.include "HDL50001_pcf.inc"
.text
preset_UART0:
getl 0x00000F00
wrl @1, GPIOB_BPS
getl 0x00000104
wrl @1, UART0_BDR
getl 0x00000002
wrl @1, UART0_CR
jmp fifo_tx_full
complete
fifo_tx_full:
rdl UART0_ST
getl 0x00000200
and @1, @2
je @1, fifo_tx_full
jne @2, paragraph
complete
send_byte:
getb 0xAB
wrb @1, UART0_DATA
complete
</pre>
Для UART3 всё будет аналогично. Ознакомиться с другими примерами работы с UART можно в Хранилище, интересующие вопросы по всем интерфейсам можно задать на форуме.
h2. б) Приём по UART
Для приёма байта по UART необходимо:
h3. 1. Разрешить алтернативные функции портов (аналогично пункту 1 в "передаче")
h3. 2. Настраиваем UART на приём, устанавливаем скорость работы.
Для настройки UART на приём запишем следующее значение в регистр управления:
Для UART0:
<pre>
getl 0x00000001
wrl @1, UART0_CR
</pre>
Для UART3:
<pre>
getl 0x00000001
wrl @1, UART3_CR
</pre>
Настройка скорости работы аналогично пункту 2 в "передаче".
h3. 3. Проверить наличие новых данных в буфере приёма
Для UART0:
<pre>
fifo_rx_newb:
rdl UART0_ST
getl 0x00000001
and @1, @2
je @1, fifo_rx_newb
jne @2, get_byte
complete
</pre>
Для UART3:
<pre>
fifo_rx_newb:
rdl UART3_ST
getl 0x00000001
and @1, @2
je @1, fifo_rx_newb
jne @2, get_byte
complete
</pre>
h3. 4. Принять байт
Для UART0:
<pre>
rdb UART0_DATA
</pre>
Для UART3:
<pre>
rdb UART3_DATA
</pre>
Также пользователям рекомендуется посмотреть на готовые решения для ассемблера, такие как вывод
64-х разрядного значения РОНа и вывод блока памяти данных (аналогично функции на Си).
1) [[Вывод РОНа]]
2) [[Вывод блока памяти данных]]
Замечание:
Примеры с выводом РОНа и Выводом блока памяти данных в ближайшее время будут модифицированы.
Исходники некоторых библиотек также будут доступны в открытом доступе.