
Программирование встроенных приложений Keil uvision
.pdf
СПБГУАП группа 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