Работа с UART (Си) » History » Version 26
Version 25 (krufter_multiclet, 04/18/2013 07:06 PM) → Version 26/33 (krufter_multiclet, 04/18/2013 07:11 PM)
h1. Работа с UART (Си)
Рассмотрим передачу и приём сообщения по UART подробнее (на Си).
Сконфигурировать UART на передачу и приём сообщения на Си также просто как и на ассемблере мультиклеточного процессора.
Кроме того на Си для работы с UART доступны полезные функции и макросы, такие как вывод значения типа int, вывод строки,
вывод заданного массива памяти данных.
В приведённых ниже примерах кода используется библиотека для работы с UART, которую необходимо подключить:
<pre>
#include <uart.h>
</pre>
h2. а) Передача по UART
h3. 1. Настраиваем UART на передачу
Первым шагом задаём структуру (все элементы структуры можно посмотреть в файле uart.h).
<pre>
UART_InitTypeDef UART_InitStructure;
</pre>
Затем инициализируем нужные параметры (незаданные параметры по умолчанию инициализируются нулём).
<pre>
UART_InitStructure.BaudRate = 38400; //скорость обмена данными
UART_InitStructure.TypeParity = 0x00000000; //тип контроля четности
UART_InitStructure.Parity = 0x00000000; //разрешение контроля четности
UART_InitStructure.FlowControl = 0x00000000; //разрешение аппаратного контроля
UART_InitStructure.Mode = 0x00000002; //разрешение передачи
</pre>
Инициализация для UART0:
<pre>
uart_init(UART0, &UART_InitStructure);
</pre>
Для UART3:
<pre>
uart_init(UART3, &UART_InitStructure);
</pre>
h3. 2. Разрешаем альтернативные функции порта
Для UART0:
<pre>
GPIOB->BPS = 0x00000F00;
</pre>
Для UART3:
<pre>
GPIOD->BPS = 0x00000F00;
</pre>
h3. 3. Проверка буфера передатчика на полноту
Для UART0:
<pre>
while(UART_FIFO_TX_FULL(UART0) == 1);
</pre>
Для UART3:
<pre>
while(UART_FIFO_TX_FULL(UART3) == 1);
</pre>
h3. 4.Передача байта по UART
Для UART0:
<pre>
UART_SEND_BYTE(0xAB, UART0);
</pre>
Для UART3:
<pre>
UART_SEND_BYTE(0xAB, UART3);
</pre>
В результате можно получить простой пример по отправке байта по UART со скоростью 38400 Кбит/с:
Для UART0:
<pre>
#include <HDL51001_ccf.h>
#include <uart.h>
void main()
{
UART_InitTypeDef UART_InitStructure;
UART_InitStructure.BaudRate = 38400; //скорость обмена данными
UART_InitStructure.TypeParity = 0x00000000; //тип контроля четности
UART_InitStructure.Parity = 0x00000000; //разрешение контроля четности
UART_InitStructure.FlowControl = 0x00000000; //разрешение аппаратного контроля
UART_InitStructure.Mode = 0x00000002; //разрешение передачи
uart_init(UART0, &UART_InitStructure);
GPIOB->BPS = 0x00000F00;
while(UART_FIFO_TX_FULL(UART0) == 1);
UART_SEND_BYTE(0xAB, UART0);
}
</pre>
Для UART3 пример можно составить аналогично, только лишь заменив порт B на D и UART0 на UART3.
Переданный байт данных можно получить с помощью программы - монитора COM-порта настроенного на данные с 1 стоп-битом,
скоростью передачи 38400 кбит/с, размером данных - 8 бит и отключённым контролем чётности.
h2. б) Приём по UART
Для приёма по UART необходимо:
h3. 1. Выполнить пункты 1,2 под а)
h3. 2. Проверить буфер приемника на наличие новых данных
Для UART0:
<pre>
while(UART_NEW_DATA(UART0) == 0);
</pre>
Для UART3:
<pre>
while(UART_NEW_DATA(UART3) == 0);
</pre>
h3. 3. Прочитать данные
Для UART0:
<pre>
rbyte = UART_GET_BYTE(UART0);
</pre>
Для UART3:
<pre>
rbyte = UART_GET_BYTE(UART3);
</pre>
Пример приёма байта данных составить довольно просто по аналогии с передачей байта. Следует заметить, что помимо анализа буфера приемника на
наличие новых данных, необходимо проверять буфер приёма на полноту.
h2. API функции UART:
Кроме полезных макросов имеются функции для вывода данных по UART.
Разберём подробнее каждую функцию, которая объявлена в uart.h
<pre>1) void uart_init(UART_TypeDef *UART, UART_InitTypeDef* UART_InitStruct)</pre>
Фунция _uart_init()_ выполняет инициализацию заданного номера UART.
UART - может принимать значения: UART0, UART1, UART2, UART3
UART_InitStruct - структура, содержащая элементы конфигурации UART
<pre>2) void DM2UART(UART_TypeDef *UART, int start_address, int size_block)</pre>
Фунция _DM2UART()_ выводит область памяти данных по UART младшим байтом вперёд.
UART - может принимать значения: UART0, UART1, UART2, UART3
start_address - начальный адрес памяти данных
size_block - размер области данных
<pre>3) void uart_send_str(char *str, UART_TypeDef *UART)</pre>
Фунция _uart_send_str_ выводит строку по UART.
UART - может принимать значения: UART0, UART1, UART2, UART3
str - строка символов
<pre>4) void uart_send_int(int str, UART_TypeDef *UART)</pre>
Фунция _uart_send_int()_ _uart_send_int_ выводит переменную типа int строку по UART.
UART - может принимать значения: UART0, UART1, UART2, UART3
str - переменная типа int
Замечание: В версиях библиотеки до 01.04.13 необходимо перед вызовом функций DM2UART(), uart_send_int()
применять конструкцию:
<pre>
while(UART_FIFO_TX_EMPTY(UART0) == 0);
</pre>
В версиях библиотеки после 01.04.13 функции могут использоваться самостоятельно.
строка символов
Рассмотрим передачу и приём сообщения по UART подробнее (на Си).
Сконфигурировать UART на передачу и приём сообщения на Си также просто как и на ассемблере мультиклеточного процессора.
Кроме того на Си для работы с UART доступны полезные функции и макросы, такие как вывод значения типа int, вывод строки,
вывод заданного массива памяти данных.
В приведённых ниже примерах кода используется библиотека для работы с UART, которую необходимо подключить:
<pre>
#include <uart.h>
</pre>
h2. а) Передача по UART
h3. 1. Настраиваем UART на передачу
Первым шагом задаём структуру (все элементы структуры можно посмотреть в файле uart.h).
<pre>
UART_InitTypeDef UART_InitStructure;
</pre>
Затем инициализируем нужные параметры (незаданные параметры по умолчанию инициализируются нулём).
<pre>
UART_InitStructure.BaudRate = 38400; //скорость обмена данными
UART_InitStructure.TypeParity = 0x00000000; //тип контроля четности
UART_InitStructure.Parity = 0x00000000; //разрешение контроля четности
UART_InitStructure.FlowControl = 0x00000000; //разрешение аппаратного контроля
UART_InitStructure.Mode = 0x00000002; //разрешение передачи
</pre>
Инициализация для UART0:
<pre>
uart_init(UART0, &UART_InitStructure);
</pre>
Для UART3:
<pre>
uart_init(UART3, &UART_InitStructure);
</pre>
h3. 2. Разрешаем альтернативные функции порта
Для UART0:
<pre>
GPIOB->BPS = 0x00000F00;
</pre>
Для UART3:
<pre>
GPIOD->BPS = 0x00000F00;
</pre>
h3. 3. Проверка буфера передатчика на полноту
Для UART0:
<pre>
while(UART_FIFO_TX_FULL(UART0) == 1);
</pre>
Для UART3:
<pre>
while(UART_FIFO_TX_FULL(UART3) == 1);
</pre>
h3. 4.Передача байта по UART
Для UART0:
<pre>
UART_SEND_BYTE(0xAB, UART0);
</pre>
Для UART3:
<pre>
UART_SEND_BYTE(0xAB, UART3);
</pre>
В результате можно получить простой пример по отправке байта по UART со скоростью 38400 Кбит/с:
Для UART0:
<pre>
#include <HDL51001_ccf.h>
#include <uart.h>
void main()
{
UART_InitTypeDef UART_InitStructure;
UART_InitStructure.BaudRate = 38400; //скорость обмена данными
UART_InitStructure.TypeParity = 0x00000000; //тип контроля четности
UART_InitStructure.Parity = 0x00000000; //разрешение контроля четности
UART_InitStructure.FlowControl = 0x00000000; //разрешение аппаратного контроля
UART_InitStructure.Mode = 0x00000002; //разрешение передачи
uart_init(UART0, &UART_InitStructure);
GPIOB->BPS = 0x00000F00;
while(UART_FIFO_TX_FULL(UART0) == 1);
UART_SEND_BYTE(0xAB, UART0);
}
</pre>
Для UART3 пример можно составить аналогично, только лишь заменив порт B на D и UART0 на UART3.
Переданный байт данных можно получить с помощью программы - монитора COM-порта настроенного на данные с 1 стоп-битом,
скоростью передачи 38400 кбит/с, размером данных - 8 бит и отключённым контролем чётности.
h2. б) Приём по UART
Для приёма по UART необходимо:
h3. 1. Выполнить пункты 1,2 под а)
h3. 2. Проверить буфер приемника на наличие новых данных
Для UART0:
<pre>
while(UART_NEW_DATA(UART0) == 0);
</pre>
Для UART3:
<pre>
while(UART_NEW_DATA(UART3) == 0);
</pre>
h3. 3. Прочитать данные
Для UART0:
<pre>
rbyte = UART_GET_BYTE(UART0);
</pre>
Для UART3:
<pre>
rbyte = UART_GET_BYTE(UART3);
</pre>
Пример приёма байта данных составить довольно просто по аналогии с передачей байта. Следует заметить, что помимо анализа буфера приемника на
наличие новых данных, необходимо проверять буфер приёма на полноту.
h2. API функции UART:
Кроме полезных макросов имеются функции для вывода данных по UART.
Разберём подробнее каждую функцию, которая объявлена в uart.h
<pre>1) void uart_init(UART_TypeDef *UART, UART_InitTypeDef* UART_InitStruct)</pre>
Фунция _uart_init()_ выполняет инициализацию заданного номера UART.
UART - может принимать значения: UART0, UART1, UART2, UART3
UART_InitStruct - структура, содержащая элементы конфигурации UART
<pre>2) void DM2UART(UART_TypeDef *UART, int start_address, int size_block)</pre>
Фунция _DM2UART()_ выводит область памяти данных по UART младшим байтом вперёд.
UART - может принимать значения: UART0, UART1, UART2, UART3
start_address - начальный адрес памяти данных
size_block - размер области данных
<pre>3) void uart_send_str(char *str, UART_TypeDef *UART)</pre>
Фунция _uart_send_str_ выводит строку по UART.
UART - может принимать значения: UART0, UART1, UART2, UART3
str - строка символов
<pre>4) void uart_send_int(int str, UART_TypeDef *UART)</pre>
Фунция _uart_send_int()_ _uart_send_int_ выводит переменную типа int строку по UART.
UART - может принимать значения: UART0, UART1, UART2, UART3
str - переменная типа int
Замечание: В версиях библиотеки до 01.04.13 необходимо перед вызовом функций DM2UART(), uart_send_int()
применять конструкцию:
<pre>
while(UART_FIFO_TX_EMPTY(UART0) == 0);
</pre>
В версиях библиотеки после 01.04.13 функции могут использоваться самостоятельно.
строка символов