Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Программирование встроенных приложений Keil uvision

.pdf
Скачиваний:
127
Добавлен:
06.01.2021
Размер:
4.29 Mб
Скачать

СПБГУАП группа 4736 / Индустрия 4.0

A

Б

Рис. 47. Схемы включения: A) FT230XS, Б) подключение к МК

4.7.2. Настройка

Как видно из рис. 47Б, задействован модуль UART2 МК, это 31 и 32 выводы (PD0 и PD1). Произведем настройку модуля UART2 на преимопередачу данных с ПК. Для начала работы с модулем UART2 необходимо [5]:

1)Настроить режим работы выводов PD0 и PD1 в составе модуля UART2;

2)Разрешить тактирование блока UART2 в регистрах PER_CLOCK и UART_CLOCK контроллера тактовой частоты MDR_RST_CLK;

3)Записать целую часть коэффициента делителя скорости передачи данных в регистр IBRD;

4)Записать дробную часть коэффициента делителя скорости передачи данных в регистр FBRD;

5)Настроить параметры приемопередатчика UART2 в регистре управления линией LCR_H;

6)Разрешить работу приемника и передатчика UART2 в регистре CR блока.

119

СПБГУАП группа 4736 / Индустрия 4.0

Перед началом работы необходимо рассчитать коэффициент деления тактовой частоты для настройки скорости обмена данными (пункты 3 и 4 настройки). Для этого воспользуемся формулой из спецификации на МК:

K = UARTCLK / (16 · V),

(1)

где К – искомый коэффициент, UARTCLK – частота тактирования блока UART2, V – скорость обмена данными [5]. Известно, что UARTCLK = 8 МГц, скорость обмена данными V примем равной 115200 бит/c. Подставив все значения в формулу 1, получаем

K = 8 000 000 / (16 · 115200) = 4.34.

Целая часть коэффициента деления тактовой частоты равна 4, это значение и будет записано в регистр IBRD.

Дробная часть коэффициента равна 0.34 и для записи числа в регистр FBRD требуется рассчитать значение по формуле

M = X · 64 + 0.5,

(2)

где М – число, записываемое в регистр дробной части коэффициента деления FBRD, X – дробная часть коэффициента, полученного по формуле 1. Подставив число 0.34 вместо X в формулу 2, получаем M = 22. Это число и будет записано в регистр FBRD. Код инициализации модуля UART2 показан листинге 15.

Перед началом передачи данных через UART2 необходимо создать функцию для отправки байта данных:

/*------------------------------------------------------------

*/

void uart2_send_byte(uint8_t byte) { /// отправка байта данных

// ожидание готовности UART2 для передачи байта данных while (MDR_UART2->FR & (1 << 5)) { }

MDR_UART2->DR = byte; // отправка байта данных

 

}

 

/*------------------------------------------------------------

*/

120

СПБГУАП группа 4736 / Индустрия 4.0

/*------------------------------------------------------------

 

 

*/

void uart2_init(void)

 

 

{ /// инициализация модуля UART2

// режим работы порта PD0, PD1 - UART2

MDR_PORTD->FUNC

|= ((2 <<

2) | (2 << 0));

MDR_PORTD->ANALOG |= ((1 <<

1)

| (1 << 0)); // цифровой порт

MDR_PORTD->PWR

|= ((3 <<

2)

| (3 << 0)); // максимально быcтрый фронт

MDR_RST_CLK->PER_CLOCK |=

(1 << 7);

// вкл. тактирование UART2

MDR_RST_CLK->UART_CLOCK =

(0

// установка делителя

UART1 = 1

 

| (0 << 8)

// установка делителя

UART2 = 1

 

| (0 << 24)

// запрет тактовой частоты UART1

 

| (1 << 25));

// разрешение тактирования UART2

// Параметры делителя при частоте = 8 МГц и скорости 115200

MDR_UART2->IBRD = 4;

// целая часть делителя скорости

MDR_UART2->FBRD = 22; // дробная часть делителя скорости

MDR_UART2->LCR_H = ( (0 <<

1)

// работа без проверки четности

| (0 <<

2)

// бит четности отключен

| (0 <<

3)

// кол-во стоповых бит = 1

| (0 << 4)

// буфер FIFO выключен

| (3 << 5)

// размер кадра – 8 бит

| (0 << 7)); // передача бита четности запрещена

// передатчик и приемник разрешен, разрешение приемопередатчика UART2

MDR_UART2->CR = ( (1 << 8)

| (1 << 9) | 1);

}

 

 

 

/*------------------------------------------------------------

 

 

*/

Листинг 15. Подпрограмма инициализации модуля UART2

Теперь все готово для начала работы с модулем UART2.

121

СПБГУАП группа 4736 / Индустрия 4.0

4.7.3. Обмен данными с ПК

Создадим программу, которая будет каждую секунду отправлять символ “R” на ПК, а также выводить на дисплей символ, переданный пользователем с ПК (листинг 16).

/*------------------------------------------------------------

 

*/

#include "MDR32Fx.h"

 

// подключение библиотеки МК

#define F_CPU 8000000

 

// указание тактовой частоты МК

#include "milkites_delay.h"

// подключение библиотеки задержек

#include "milkites_display.h" // подключение библиотеки дисплея

#define LCD_led_en

MDR_PORTE->RXTX |= (1<<2) // вкл. подсветки

#define LCD_led_dis

MDR_PORTE->RXTX &= ~(1<<2) // выкл. подсветки

/*========================== Функции UART2 ======================== */

void

uart2_init(void){

//

инициализация

void

uart2_send_byte(uint8_t){

//

отправка байта данных

/*================================================================= */

int main()

{

MDR_RST_CLK->PER_CLOCK = 0xffffffff; // вкл. тактир. всей периферии МК

MDR_PORTE->OE

= 0xff37; // биты 7,6,3 PORTE - входы, др. - выходы

MDR_PORTE->FUNC

=

0x0000; // функция - порт, основная функция

MDR_PORTE->PWR

=

0xff37; // макс. быстрый фронт

MDR_PORTE->ANALOG = 0xffff; // режим работы порта - цифровой ввод/вывод

delay_init();

// инициализация системы задержек

LCD_init();

// инициализация дисплея

LCD_clear();

// очистка дисплея

LCD_led_en;

// вкл. подсветки дисплея

uart2_init();

// инициализация модуля UART2

char ch = 0;

// символ принятый с ПК

uint16_t cnt = 0;

// счетчик мс

// продолжение на следующей странице

122

СПБГУАП группа 4736 / Индустрия 4.0

while (1)

{

// проверка наличия байта в буфере приемника UART2 if (MDR_UART2->FR & 1 <<6 )

{

ch = MDR_UART2->DR; LCD_set_cursor(0); LCD_wr_char(ch);

}

if(cnt > 999)

{

cnt = 0; uart2_send_byte('R'); uart2_send_byte(0x0A); uart2_send_byte(0x0D);

}

cnt++; delay_ms(1);

//считывание байта из буфера приемника UART2

//уст. курсора

//вывод принятого символа на дисплей

//если прошло более 999 мс

//сброс счетчика мс

//отправка символа «R» на ПК

//отправка символа перевода строки

//отправка символа возврата каретки

//инкремент счетчика мс

//задержка 1 мс

}// while

}// main

/*------------------------------------------------------------

*/

Листинг 16. Программа чтения и отправки одного символа через UART2

Для получения данных на ПК воспользуемся бесплатной терминальной утилитой “Hercules SETUP”. Она доступна для скачивания на официальном сайте программы [12]. Утилита не требует установки, после ее открытия следует перейти в вкладку “Serial” и выставить те же настройки интерфейса, что были заданы при конфигурировании модуля UART2 МК.

При этом требуется указать именно тот COM-порт, что присвоился системой виртуальному COM-порту на основе FT230XS (рис. 48А). После того, как выставлены все настройки необходимо нажать кнопку “Open/Close” (рис. 48Б), при этом начнется процесс получения данных от МК. Для отправки символа требуется ввести символ в поле “Send” и нажать кнопку “Send”.

Следует обратить внимание на то, что когда COM-порт открыт в утилите “Hercules SETUP”, загрузка HEX-файла прошивки невозможна. Необходимо закрыть его перед процессом прошивки МК.

123

СПБГУАП группа 4736 / Индустрия 4.0

A

Б

Рис. 48. Пример взаимодействия с COM-портом: A) COM-порт в диспетчере устройств системы; Б) прием и отправка символов

Символы, которые пользователь видит в поле “Received/Sent data” терминальной утилиты “Hercules SETUP”, – ничто иное, как закодированные символы таблицы ASCII.

ASCII (American Standard Code for Information Interchange) –

стандартный код обмена информацией. ASCII – это код для представления символов в виде чисел, каждой букве сопоставлено число от 0 до 127 (кодировка символов числами) (рис. 49). В большинстве компьютеров код ASCII используется для представления текста, что позволяет передавать данные от одного компьютера на другой.

Наглядным примером взаимодействия с таблицей символов ASCII будет пример отправки кода 64 (0x40), что соответствует символу “@” (рис. 49).

124