Главная страница
qrcode

А.В.Пуговкин И.А.Куан Н.К. Ахметов А.В. Бойченко. Методическое пособие по программированию микроконтроллеров. ТУСУР. Методическое пособие по программированию микроконтроллеров Учебно-методическое пособие


НазваниеМетодическое пособие по программированию микроконтроллеров Учебно-методическое пособие
АнкорА.В.Пуговкин И.А.Куан Н.К. Ахметов А.В. Бойченко. Методическое пособие по программированию микроконтроллеров. ТУСУР.pdf
Дата07.06.2019
Размер2.56 Mb.
Формат файлаpdf
Имя файлаA_V_Pugovkin_I_A_Kuan_N_K_Akhmetov_A_V_Boychenko_Metodicheskoe_p
оригинальный pdf просмотр
ТипМетодическое пособие
#52982
страница3 из 3
Каталог
1   2   3
Индивидуальные задания
52 1.
Реализовать работу двух светодиодов:

В ходе работы микроконтроллера светодиоды должны загораться одновременно;

В ходе работы микроконтроллера светодиоды должны загораться по очереди.
2.
Реализовать работу кнопки:

При нажатии кнопки LEFT загорается левый светодиод, при повторном нажатии он затухает;

При нажатии кнопки RIGHT загорается правый светодиод, при повторном нажатии он затухает;

При нажатии кнопки UPсветодиоды загораются по очереди, при повторном нажатии они потухают;

При нажатии кнопки
SELECTсветодиоды загораются одновременно, при повторном нажатии они потухают.
53
7.
Лабораторная работа №3. Использование таймера
Цель работы:Изучить работу системного таймера SysTick.
Теоретические сведения
В предыдущей лабораторной работе в качестве задержки был использован пустой цикл, что не совсем корректно. Для реализации задержки можно использовать таймеры, встроенные в микроконтроллер.
Таймеры - один из основных типов периферии микроконтроллера. Они используются для организации временных задержек, выполнения каких-то периодических событий, генерации ШИМ и различных других применений, жестко связанных со временем.
Микроконтроллер 1986BE92У содержит три 16-разрядных таймера с 4 каналами схем захвата и ШИМ с функциями формирования «мертвой зоны» и аппаратной блокировки, а также системный 24-х разрядный таймер и два сторожевых таймера.
В данной лабораторной работе необходимо освоить системный таймер
SysTick.
Процессор имеет 24-х разрядный системный таймер, SysTick, который считает вниз от загруженного в него значения до нуля; перезагрузка (возврат в начало) значения в регистр LOAD происходит по следующему фронту синхросигнала, затем счёт продолжается по последующему фронту.
Когда процессор остановлен для отладки, таймер не декрементируется.
При работе с различной периферией, в том числе и таймерами, часто используют прерывания.
Прерывание – событие, требующие немедленной реакции со стороны процессора. Реакция состоит в том, что процессор прерывает обработку текущей программы и переходит к выполнению некоторой другой программы, специально предназначенной для данного события. По завершении этой программы процессор возвращается к выполнению прерванной программы.
54
Настройка:
Всего четыре регистра, но понадобятся нам всего два из них.
Рассмотрим их поподробнее.
55
Необходимо выбрать источник тактового сигнала, разрешить прерывания и включить счетчик. Тактировать таймер необходимо от HCLK
(частота тактирования 8 Мгц). Прерывания нам будут нужны для создания собственной функции точной задержки.
#define CLKSOURCE (1<<2)
//Указывает источник синхросигнала: 0
- LSI, 1 - HCLK.
#define TCKINT (1<<1)
//Разрешает запрос на прерывание от системного таймера.
#define ENABLE (1<<0)
//Разрешает работу таймера.
Создаем отдельную функцию настройки таймера и вписываем в нее нашу конструкцию.
voidInit_SysTick (void)
{
56
SysTick->CTRL |= CLKSOURCE|TCKINT|ENABLE;
}
В данный регистр необходимо загрузить значение задержки. Настроим таймер на прерывание раз в одну миллисекунду. Таймер настроен на тактирование от HCLK – это частота тактирования ядра микроконтроллера. По умолчанию она равна 8 Мгц = 8000000 тактов в секунду. В одной секунде тысяча миллисекунд => 8000000(количество тактов в секунду)/1000(количество миллисекунд в секунде) = количество тактов в одной миллисекунде.
Необходимо отнять «1», как описано на рисунке выше.
SysTick->LOAD = (8000000/1000)-1;
Разместим данную настройку в функции Init_SysTick перед включением таймера. voidInit_SysTick (void)
{
SysTick->LOAD |= (8000000/1000)-1;
SysTick->CTRL |= CLKSOURCE|TCKINT|ENABLE;
}
57
Мы настроили таймер на появление прерываний, но необходимодействие, которое будет происходить, когда данное прерывание появится. Встартап файле находим вектора прерываний:
Когда появляется какое-то внешнее/внутреннее неотложное событие
(прерывание), микроконтроллер прерывает выполнение основной программы, переходит к этой таблице и смотрит, куда ему нужно перейти дальше.
Например, когда появляется прерывание от нашего таймера, он переходит к пункту с именем «SysTick_Handler». В случае, если вектор не прописан нами в программе (нет функции с таким именем) – контроллер игнорирует его и продолжает выполнение своей программы. Но если в программе есть функция с этим именем, то он переходит к ее выполнению.
В файлеmain.cсоздадим функцию с именем SysTick_Handler. Объявим глобальную переменную 32-х битной разрядности. Для того, чтобы компилятор не оптимизировал данную переменную, перед ней добавляем «volatile» (это необходимо во избежание ошибок). В данной функции прописываем условие: если переменная еще не равна нулю – отнять 1.
Таким образом, каждую миллисекунду контроллер будет останавливать основную программу и проверять, если еще счетчик не пуст – отнять от него 1.
volatile uint32_t Delay_dec = 0; voidSysTick_Handler (void)
58
{ if (Delay_dec) Delay_dec--;
}
Создадим функцию задержки, которая будет использовать данное прерывание, которая принимает длительность задержки (в миллисекундах), копирует ее в переменную, из которой по прерываниям системного таймера функция отнимает 1 каждую миллисекунду. После того, как задержка исчерпана, программа продолжает свою работу. voidDelay_ms (uint32_tDelay_ms_Data)
{
Delay_dec = Delay_ms_Data; while (Delay_dec) {};
}
59
Исходныйкодпрограммы:
#include "1986be9x_config.h"
#include "1986BE9x.h"
#include "1986BE9x_port.h"
#include "1986BE9x_rst_clk.h" voidLed_init (void)
{
RST_CLK_PCLKcmd(RST_CLK_PCLK_PORTC, ENABLE);
PortInit.PORT_Pin = PORT_Pin_1;
PortInit.PORT_OE = PORT_OE_OUT;
PortInit.PORT_FUNC= PORT_FUNC_PORT;
PortInit.PORT_MODE= PORT_MODE_DIGITAL;
PortInit.PORT_SPEED = PORT_SPEED_SLOW;
PORT_Init(PORTC, &PortInit);
}
#define CLKSOURCE (1<<2)
//Указываетисточниксинхросигнала: 0
- LSI, 1 - HCLK.
#define TCKINT (1<<1)
//Разрешает запрос на прерывание от системного таймера.
#define ENABLE(1<<0)
//Разрешает работу таймера. voidInit_SysTick (void)
//Прерывание раз в миллисекунду.
{
SysTick->LOAD |= (8000000/1000)-1;
SysTick->CTRL |= CLKSOURCE|TCKINT|ENABLE;
} volatile uint32_t Delay_dec = 0; voidSysTick_Handler (void)
{ if (Delay_dec) Delay_dec--;
} voidDelay_ms (uint32_t Delay_ms_Data)
60
{
Delay_dec = Delay_ms_Data; while (Delay_dec) {};
} int main (void)
{
Init_SysTick();
//Инициализируемсистемныйтаймер.
Led_init();
//Инициализируем ножку 0 порта C для светодиода. while (1)
{
PORTC->RXTX |= 1;
Delay_ms (5000);
PORTC->RXTX = 0;
Delay_ms (5000);
}
}
Индивидуальныезадания
1. Реализовать работу двух светодиодов:
• В ходе работы микроконтроллера светодиоды должны загораться одновременно с задержкой (номер вариант секунд);
• В ходе работы микроконтроллера светодиоды должны загораться по очереди с задержкой (номер вариант секунд).
• В ходе работы микроконтроллера светодиоды должны загораться по очереди: первый с задержкой (номер вариант секунд), второй с задержкой ( номер варианта / 2 + 1 секунд).
61
8.
Лабораторная работа №4. Универсальный приемопередатчик
(USART)
Цель
работы:Научиться использовать универсальный синхронный/асинхронный приемопередатчик, организовать передачу данных данным устройством.
Теоретические сведения
Универсальный
асинхронный
приёмопередатчик(УАПП,англ. UniversalAsynchronousReceiver-Transmitter,
UART) — узел вычислительных устройств, предназначенный для организации связи с другими цифровыми устройствами. Преобразует передаваемые данные в последовательный вид так, чтобы было возможно передать их по цифровой линии другому аналогичному устройству. Метод преобразования хорошо стандартизован и широко применяется в компьютерной технике.
Представляет собой логическую схему, с одной стороны подключённую к шине вычислительного устройства, а с другой имеющую два или более выводов для внешнего соединения.
Для работы с модулем UART необходимо подключить нуль-модемный кабель (Рисунок 8.1)одним концом к порту RS-232 отладочной платы (Рисунок
2.2 18-й элемент), другим –к персональному компьютеру через преобразователь портаRS-232 в USB порт(Рисунок 8.2), или же напрямую кпортуRS-232, если таковой имеется.
Рисунок 8.1 - Нуль-модемный кабель
62
Рисунок 8.2 – Кабель преобразователь RS-232 в USB
Взаимодействие между отладочной платой и персональным
компьютером
Для того что бы принимать и отправлять данные через порт RS-232
(COM порт) необходимо использовать стороннее программное обеспечение, такое как терминальные программы для интерфейса RS-232. В данной лабораторной работе рекомендуется использовать свободную программу
Terminal 1.9b (Рисунок 8.3).
Рисунок 8.3 – Внешний вид программы «Terminal 1.9b»
63
Рисунок 8.4 – Параметры подключения
Описание параметров подключения:
1.
Функциональные кнопки: Connect — кнопка для открытия COMпорта, Rescan — пересканировать список COM-портов, Help — справка,
About.. — о программе, Quit — выход из программы;
2.
Поле выбора номера COM-порта для подключения;
3.
Выбор скорости COM-порта;
4.
Выбор количества бит данных;
5.
Выбор четности;
6.
Выбор количества стоповых бит;
7.
Выбор типа управления потоком.
Рисунок 8.5 – Дополнительные параметры
Рисунок 8.6 – Параметры отображения сообщения от устройства
Рисунок 8.7 – Параметры передачи данный на устройство
Рисунок 8.8 – Поле для отправки сообщения
Рисунок 8.9 – Поле отображения отправленных сообщений
64
Индивидуальные задания
Реализовать программу,в которой микроконтроллер опрашивает кнопку,при нажатие которой контроллер вышлет в USARTсообщение
«Pressed», а если кнопка будет не нажата, то «NotPressed».
65
Исходныйкодпрограммы:
#include "1986be9x_config.h"
#include "1986BE9x.h"
#include "1986BE9x_uart.h"
#include "1986BE9x_port.h"
#include "1986BE9x_rst_clk.h"
#include "1986BE9x_it.h"
#include "MilFlash.h" voidLedPinGfg (void)
{
PORT_InitTypeDefPortInit;
RST_CLK_PCLKcmd(RST_CLK_PCLK_PORTC, ENABLE);
PortInit.PORT_Pin = PORT_Pin_1;
PortInit.PORT_OE = PORT_OE_OUT;
PortInit.PORT_FUNC = PORT_FUNC_PORT;
PortInit.PORT_MODE = PORT_MODE_DIGITAL;
PortInit.PORT_SPEED = PORT_SPEED_SLOW;
PORT_Init(PORTC, &PortInit);
} staticUART_InitTypeDefUART_InitStructure; void Uart2PinCfg(void)
{
RST_CLK_PCLKcmd(RST_CLK_PCLK_PORTF, ENABLE);
PORT_InitTypeDefPortInit;
PortInit.PORT_PULL_UP = PORT_PULL_UP_OFF;
PortInit.PORT_PULL_DOWN = PORT_PULL_DOWN_OFF;
PortInit.PORT_PD_SHM = PORT_PD_SHM_OFF;
PortInit.PORT_PD = PORT_PD_DRIVER;
PortInit.PORT_GFEN = PORT_GFEN_OFF;
PortInit.PORT_FUNC = PORT_FUNC_OVERRID;
PortInit.PORT_SPEED = PORT_SPEED_MAXFAST;
66
PortInit.PORT_MODE = PORT_MODE_DIGITAL;
PortInit.PORT_OE = PORT_OE_IN;
PortInit.PORT_Pin = PORT_Pin_0;
PORT_Init(PORTF, &PortInit);
PortInit.PORT_OE = PORT_OE_OUT;
PortInit.PORT_Pin = PORT_Pin_1;
PORT_Init(PORTF, &PortInit);
} void Uart2Setup(void)
{
/* Select HSI/2 as CPU_CLK source*/
RST_CLK_CPU_PLLconfig (RST_CLK_CPU_PLLsrcHSIdiv2,0);
/* Enables the CPU_CLK clock on UART2 */
RST_CLK_PCLKcmd(RST_CLK_PCLK_UART2, ENABLE);
/* Set the HCLK division factor = 1 for UART2*/
UART_BRGInit(UART2, UART_HCLKdiv1);
UART_InitStructure.UART_BaudRate= 9600;
UART_InitStructure.UART_WordLength= UART_WordLength8b;
UART_InitStructure.UART_StopBits = UART_StopBits1;
UART_InitStructure.UART_Parity = UART_Parity_No;
UART_InitStructure.UART_FIFOMode = UART_FIFO_OFF;
UART_InitStructure.UART_HardwareFlowControl =
UART_HardwareFlowControl_RXE | UART_HardwareFlowControl_TXE;
UART_Init (UART2,&UART_InitStructure);
UART_Cmd(UART2,ENABLE);
} voidButtonPinGfg (void)
{
PORT_InitTypeDefPortInit;
67
RST_CLK_PCLKcmd(RST_CLK_PCLK_PORTC, ENABLE); //
Включаемтактированиепорта C - кнопкавыбор
/* КонфигурируемпортСпин 2 */
PortInit.PORT_Pin = (PORT_Pin_2);
PortInit.PORT_OE = PORT_OE_IN;
PortInit.PORT_FUNC = PORT_FUNC_PORT;
PortInit.PORT_MODE = PORT_MODE_DIGITAL;
PortInit.PORT_SPEED = PORT_SPEED_SLOW;
PORT_Init(PORTC, &PortInit);
} int main (void)
{
LedPinGfg();
ButtonPinGfg();
Uart2PinCfg();
Uart2Setup(); uint16_t data; int flag = 0; while(1)
{ if (!PORT_ReadInputDataBit(PORTC,PORT_Pin_2)) // обработканажатиякновки select (выбор)
{
PORT_SetBits(PORTC, PORT_Pin_1);// включениесветодиода if(data == 0) { data = 1; flag = 0;
}
} else
{
68
PORT_ResetBits(PORTC, PORT_Pin_1);// отключениесветодиода if(data == 1) { data = 0; flag = 1;
}
} if(flag == 1) {
UART_SendData (UART2,data); flag = 0;
}
}
}
69
9.
Список литературы
1. А. В. Пуговкин, А. В. Бойченко, Р. В. Губарева, Е. С. Сорокина, А. М.
Мукашев. Методическое пособие по программированию микроконтроллеров.
Томск 2015.
2. Недяк С.П., Шаропин Ю.Б. Лабораторный практикум по микроконтроллерам семейства Cortex-M. Методическое пособие по проведению работ. - Томск: ТУСУР, 2013. - 77 с.
3. Коллективный блог Хабрахабр. Блог пользователя Vadimatorikda.
[электронный ресурс].

Режим доступа https://habrahabr.ru/users/vadimatorikda/topics/ (дата обращения 10.08.2016)
4. Быстрый старт для K1986BE92QI.
5. Спецификация Микросхем серии 1986ВЕ9ху, К1986ВЕ9ху,
К1986ВЕ9хуК К1986ВЕ92QI, К1986ВЕ92QC, 1986ВЕ91Н4, К1986ВЕ91Н4,
1986ВЕ94Н4, К1986ВЕ94Н4. – Миландр: Версия 3.8.0 - 08.09.2015 – 518 с.
6. Демонстрационно-отладочная плата 1986EvBrd_64. Техническое описание. – Миландр: Версия 1.0 – 25.05.2010 – 9 с.
1   2   3

перейти в каталог файлов


связь с админом