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

Sb97585

.pdf
Скачиваний:
7
Добавлен:
13.02.2021
Размер:
863.34 Кб
Скачать

щая определенный набор функций. Если плата подключается с помощью соединительных проводов или задействует всего несколько контактов, то она называется модулем.

Рассмотрим примеры шилдов и модулей, которые находят применение в проектах с Arduino:

Ethernet Shield позволяет обеспечить связь Arduino с локальными и глобальными сетями. Имеет слот для MicroSD-карты, позволяющей хранить дополнительные объемы данных

Relay Shield позволяет коммутировать сильноточные внешние цепи. Несет контакты для подключения четырех периферийных устройств и содержит всю необходимую обвязку для каждого реле, компактно размещенную на печатной плате.

LCD Shield. Имеет LCD-экран и органы управления. Предназначен для организации интерактивного интерфейса.

Energy Shield. Позволяет работать с различными источниками питания. Одно из возможных применений – обеспечение подзарядки мобильных телефонов и гаджетов.

Motor Shield. Обеспечивает возможность управления электромоторами различных типов.

SD Card Shield. Позволяет хранить большие массивы информации на внешних SD-картах. Совместим с картами памяти форматов SD, SDHC и MicroSD. SD Card Shield использует для передачи данных стандартный SPIинтерфейс.

Wi-Fi Shield. Позволяет настроить передачу данных между устройствами с использованием технологии беспроводного сетевого соединения Wi-Fi.

Codec Shield. Позволяет обрабатывать аудиоданные в реальном времени.

GSM/GPRS Shield. Дает возможность использовать сети GSM/GPRS.

Врезультате разрабатываемое устройство приобретает способность осуществлять звонки и передачу коротких сообщений, а также доступ к мобильному Интернету.

Модуль беспроводной связи nRF24L01. Предназначен для объедине-

ния распределенных модулей в системе автоматики различного назначения внутри помещений в отсутствие проводных соединений. Подключается к любому микроконтроллеру, имеющему интерфейс SPI.

11

Модуль датчика температуры MCP9808. Дает возможность измере-

ния температуры в диапазоне от –20 °C до +100 °C для платы с необходимой периферией.

Модуль драйвера шагового двигателя Pololu A4988. Имеет настраи-

ваемое ограничение по току, защиту от перегрева, поддерживает пять различных разрешений. Работает с напряжениями от 8 В до 35 В и может обеспечить токи до 1 А на фазу без охлаждения, и до 2 А с системой охлаждения.

Bluetooth-модуль НС-06. Используется для организации управления Arduino с других устройств и передачи данных по беспроводному каналу.

Модуль часов реального времени (RTC). Содержит часы реального времени с календарем. Реализована функция будильника.

Порядок выполнения работы

1.Выберите шилд или модуль из описанных ранее, позволяющий реализовать соответствующее задание.

2.Подключите выходы шилда (модуля) к Arduino.

3.Создайте скетч. К каждому модулю прилагается демонстрационная программа, загружаемая из Arduino IDE/сети Интернет, которую необходимо взять за основу вашей работы.

4.Загрузите скетч в память контроллера.

5.Запустите монитор порта для анализа работы скетча, если этого требует задание.

Варианты заданий

1.Цифровой термометр. По запросу с компьютера возвращает текущую температуру датчика.

2.Беспроводное управление светодиодом. Используйте две платы Arduino

идва приемопередатчика. По команде с компьютера Arduino, подключенная к нему по USB, должна передать команду о режиме свечения светодиода: «вкл», «выкл», мигает. Вторая Arduino принимает команду и исполняет ее.

3.GSM-сигнализация. С помощью Arduino и соответвующего шилда (модуля) необходимо по нажатию кнопки на макетной плате отправлять SMS выполяющему лабораторную работу о том, что нажата «тревожная» кнопка.

4.USB-часы. Оправляйте время на компьютер по команде с терминала в ответ на любой переданный символ. Модифицируйте программу, чтобы она позволяла выставлять время на RTC не при включении Arduino, а только при настройке.

12

5.Управляйте яркостью светодиода с помощью цифрового потенцио-

метра. Для задания первичного значения яркости светодиода используйте обычный потенциометр.

6.Подключите и испытайте любой другой модуль (по согласованию с преподавателем).

Лабораторная работа 4. ПЛАТФОРМА STM32: ЗНАКОМСТВО

С IDE И ОТЛАДОЧНОЙ ПЛАТОЙ

Цель работы – знакомство со средой разработки ПО для платформы STM32 Keil uVision5, разработка простой программы для STM32.

STM32 – семейство 32-разрядных микроконтроллеров (МК) на базе RISC-процессоров ARM от компании «ST Microelectronics». В данном пособии в качестве примера рассматривается отладочная плата STM32F103C8T6.

Основные блоки микроконтроллера – микропроцессорное ядро, система тактирования, шина адреса и шина данных, память (ОЗУ и ПЗУ) и периферийные устройства ввода–вывода.

Плата STM32 имеет несколько портов, каждый из которых может управлять 16-ю выводами МК. Каждый из выводов может иметь свою скорость тактирования и может быть настроен на работу в одном из нескольких режимов.

Выводы микроконтроллера способны выполнять множество функций, связанных со сбором и генерацией цифровых и аналоговых сигналов, а также так называемые альтернативные функции, когда управление выводами передается другому периферийному устройству: ШИМ-генераторы, реализация интерфейсов и т. п.

Программирование STM32 возможно в различных IDE: IAR Embedded Workbench, Coocox CoIDE, System Workbench for STM32, Atollic True Studio, Segger Embedded Studio, Keil uVision и другие. В настоящем учебном посо-

бии рассматривается среда Keil uVision5.

Чтобы облегчить настройку системы тактирования и инициализацию периферийных устройств, мы также будем пользоваться STM32CubeMX, имеющим удобный графический интерфейс и автоматически генерирующем код для начальной настройки микроконтроллера.

По сравнению с платформой Arduino контроль за выполнением программы и передача информации на STM32 через виртуальный COM-порт несколько сложнее, но при этом STM32 аппаратно поддерживает USB.

13

Порядок выполнения работы

1.Загрузить в МК какой-либо пример из стандартного набора поставки STM32Cube с пакетом поддержки под нужное ядро (F0, F1, F4 или F7) для конкретной отладочной платы, имеющейся в учебной лаборатории.

2.Модифицировать пример в соответствии с указанием преподавателя.

Контроль выполнения программы и передача

1.Откройте STM32 CubeMX, создайте новый проект. Во вкладке MCU Selector выберите тип микроконтроллера STM32F103C8T6.

2.Включите интерфейс USB и внутри группы MiddleWares определите

USB Device Class как Communication Device Class (Virtual Com Port). Выводы для USB будут сконфигурированы автоматически.

3.Перейдите на следующую вкладку Clock Configuration (в случае возникновения ошибки нажмите Yes, и CubeMX попытается автоматически подобрать требуемые настройки).

4.Нажмите Project → Generate Code, укажите имя проекта и его расположение, тип компилятора (MDK-ARM V5 для Keil). В следующей вкладке настройте вывод инициализации в качестве отдельных *.c + *.h файлов.

5.Запустите процесс генерации кода, дождитесь его окончания и откройте проект. Вокнеproject window откройтефайлmain.c вгруппеApplication/User.

6.После комментария Private variables объявите массив элементов типа uint8_t и заполните его произвольными символами.

После комментария Private function prototypes объявите функцию uint8_t CDC_Transmit_FS(uint8_t* Buf, uint16_t Len). Это функция передачи массива данных через виртуальный COM-порт, и ее определение можно найти, нажав на функции правой кнопкой и выбрав Go to Definition.

7.Напишите код, отправляющий созданный массив данных на порт в бесконечном цикле с некоторой задержкой HAL_Delay().

8.Скомпилируйте проект, убедитесь, что ошибки отсутствуют, подключите отладочную плату к разъему USB ПК и нажмите load (или F8), чтобы загрузить прошивку.

В случае возникновения проблем попробуйте начать прошивку микроконтроллера с нажатой кнопкой Reset. После ее отпускания прошивка должна загрузиться.

9.Подключите плату по тому интерфейсу USB, который был настроен ранее. На компьютере откройте монитор последовательного порта через Arduino IDE. Убедитесь, что порт активен и информация передается.

14

Лабораторная работа 5. ПЛАТФОРМА STM32: РАБОТА С ОС РЕАЛЬНОГО ВРЕМЕНИ

Цель работы – знакомство c функциональными возможностями ОСРВ

FreeRTOS.

Операционная система реального времени (ОСРВ, англ. – Real Time Operation System, RTOS) – это ОС, предназначенная для обеспечения режима реального времени при решении вычислительных задач.

Семафор – объект, ограничивающий количество потоков, которые могут войти в заданный участок кода. Семафоры используются для синхронизации и защиты данных при передаче через общую память, а также для синхронизации работы процессов и потоков.

Очередь – абстрактный тип данных с дисциплиной доступа к элементам вида «первый пришел – первый вышел». Добавление элемента возможно лишь в конец очереди, а выборка только из начала очереди, при этом выбранный элемент из очереди удаляется.

Поток ОС – наименьшая единица обработки, исполнение которой может быть назначено ядром операционной системы. Потоковая система имеет встроенный механизм распределение ресурсов и управления процессами.

Порядок выполнения работы

Реализуйте мигание светодиодами определенным образом при нажатии на кнопку, используя возможности ОСРВ: очереди, семафоры и потоки.

Очереди:

1.В STM32CubeMX создайте проект, поддерживающий использование

FreeRTOS.

2.Откройте его в Keil uVision5 и отредактируйте файл main.c. Удалите строки, содержащие автоматически созданную переменную defaultTaskHandle, прототип функции StartDefaultTask, ее реализацию и создание потока (osThreadDef) в теле функции main(void). Теперь после прототипа функции MX_GPIO_Init(void) нужно создать прототипы следующих функций:

static void StartThread(void const * argument); static void WorkThread(void const * argument); static void PD12Thread(void const * argument); static void PD13Thread(void const * argument); static void PD14Thread(void const * argument); static void PD15Thread(void const * argument);

15

3. Создайте объект-очередь:

xQueueHandle q;

В теле функции main(void) между MX_GPIO_Init() и osKernelStart()

напишите:

osThreadDef(PD12_Thread, PE12Thread, osPriorityNormal, 0, configMINIMAL_STACK_SIZE);

osThreadCreate (osThread(PD12_Thread), NULL); osThreadDef(PD13_Thread, PE13Thread, osPriorityNormal, 0, configMINIMAL_STACK_SIZE);

osThreadCreate (osThread(PD13_Thread), NULL); osThreadDef(PD14_Thread, PE14Thread, osPriorityNormal, 0, configMINIMAL_STACK_SIZE);

osThreadCreate (osThread(PD14_Thread), NULL); osThreadDef(PD15_Thread, PE15Thread, osPriorityNormal , 0, configMINIMAL_STACK_SIZE);

osThreadCreate (osThread(PD15_Thread), NULL); osThreadDef(USER_Thread, StartThread, osPriorityNormal, 0, configMINIMAL_STACK_SIZE);

osThreadCreate (osThread(USER_Thread), NULL); osThreadDef(WORK_Thread, WorkThread, osPriorityNormal, 0, configMINIMAL_STACK_SIZE);

osThreadCreate (osThread(WORK_Thread), NULL);

q = xQueueCreate( 4, sizeof( unsigned char ) );

После определения функции MX_GPIO_Init(void) определите функции, прототипы которых создали ранее:

static void StartThread(void const * argument)

{

for(;;)

{

if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0)==GPIO_PIN_SET)

{

unsigned char toSend;

xQueueSend( q, ( void * ) &toSend, portMAX_DELAY ); //Добавляем в очередь элемент размером 1 байт.

}

osDelay(500);

}

}

static void WorkThread(void const * argument)

{

//Новый поток, выполняющий работу по убиранию элемента из очереди.

for(;;)

{

unsigned char rec; //Создание буфера

xQueueReceive( q, &( rec ), portMAX_DELAY ); //Убираем из очереди один элемент

osDelay(1000);

16

}

}

static void PD12Thread(void const * argument)

{

for(;;)

{

if(uxQueueMessagesWaiting(q)>1)

//Проверка на количество элементов в очереди //Число в правой части неравенства увеличивается на 1 //От первого светодиода к последнему

HAL_GPIO_WritePin(GPIOD,GPIO_PIN_15,GPIO_PIN_SET);

else

HAL_GPIO_WritePin(GPIOD,GPIO_PIN_15,GPIO_PIN_SET); osDelay(100);

}

}

Опишите оставшиеся три функции аналогично первой.

После загрузки проекта на плату протестируйте его, нажав кнопку Reset, а затем удерживайте пользовательскую кнопку в течение нескольких секунд. Светодиоды будут последовательно загораться, пока не будет задействована вся линейка. После отпускания кнопки они начнут в обратном порядке гаснуть, пока не останется гореть один.

Семафоры:

1.В STM32CubeMX создайте проект, поддерживающий использование

FreeRTOS.

2.Запустите проект в Keil uVision5 и откройте файл main.c. Удалите

строки, содержащие автоматически созданную переменную defaultTaskHandle, прототип функции StartDefaultTask, ее реализацию и создание потока osThreadDef в теле функции main(void). Теперь после прототипа функции MX_GPIO_Init(void) нужно создать прототипы следующих функций:

static void StartThread(void const * argument); static void PD12Thread(void const * argument); static void PD13Thread(void const * argument); static void PD14Thread(void const * argument); static void PD15Thread(void const * argument);

3. До описания функции main(void) создайте объект-семафор:

xSemaphoreHandle semaphore;

4. В теле функции main(void) между MX_GPIO_Init() и osKernelStart()

напишите:

17

osThreadDef(PD12_Thread, PD12Thread, osPriorityNormal, 0, configMINIMAL_STACK_SIZE);

osThreadCreate (osThread(PD12_Thread), NULL);

osThreadDef(PD13_Thread, PD13Thread, osPriorityNormal, 0, configMINIMAL_STACK_SIZE);

osThreadCreate (osThread(PD13_Thread), NULL);

osThreadDef(PD14_Thread, PD14Thread, osPriorityNormal, 0, configMINIMAL_STACK_SIZE);

osThreadCreate (osThread(PD14_Thread), NULL);

osThreadDef(PD15_Thread, PD15Thread, osPriorityNormal , 0, configMINIMAL_STACK_SIZE);

osThreadCreate (osThread(PD15_Thread), NULL);

osThreadDef(USER_Thread, StartThread, osPriorityHigh, 0, configMINIMAL_STACK_SIZE);

osThreadCreate (osThread(USER_Thread), NULL);

5. После определения функции MX_GPIO_Init(void) определите функции, прототипы которых создали ранее:

static void StartThread(void const * argument)

{

semaphore = xSemaphoreCreateCounting( 60000, 0 );

//Инициализация семафора, максимум задач 60000, на данный мо-

мент 0 for(;;)

{

if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0)==GPIO_PIN_SET)

{

//Читаем, нажата ли пользовательская кнопка xSemaphoreGive(semaphore);

//Выдаем один семафор, то есть даем потокам еще одну задачу

}

osDelay(10); //Периодичность, с которой потокам дается новая задача при нажатой кнопке (10 мс)

}

}

static void PD12Thread(void const * argument)

{

for(;;)

{

xSemaphoreTake( semaphore, portMAX_DELAY);

//Забираем один семафор, то есть сообщаем, что одна задача решена

HAL_GPIO_WritePin(GPIOD,GPIO_PIN_12,GPIO_PIN_RESET);

//Выключение диода, подключенного к ножке PD12 osDelay(500);

//Задержка 500 миллисекунд

HAL_GPIO_WritePin(GPIOD,GPIO_PIN_12,GPIO_PIN_SET); //Включение диода, подключенного к ножке PD12

osDelay(100);

//Задержка 100 миллисекунд

}

Составьте самостоятельно оставшиеся три функции.

18

6. Чтобы сборка кода прошла без ошибок, нужно разрешить программе использовать семафоры. Для этого откройте папку с проектом, зайдите в папку Inc, и в файл FreeRTOSConfig.h сразу после строки

#define configQUEUE_REGISTRY_SIZE

8

добавьте

#define configUSE_COUNTING_SEMAPHORES

1

7.Сохраните файл и запустите сборку проекта. Теперь все готово для тестового запуска.

8.После загрузки проекта на плату протестируйте, нажав кнопку Reset,

азатем удерживайте несколько секунд пользовательскую кнопку. Мигание светодиодов будет индикатором того, что функции в потоках выполняют задачи параллельно, а когда все они будут выполнены, мигание прекратится.

Варианты заданий

1.Реализуйте пример «Семафоры».

2.Реализуйте пример «Очереди».

Лабораторная работа 6. ПЛАТФОРМА ПЛИС: ВЕРИФИКАЦИЯ КОДОВ В СРЕДЕ MODELSIM

Цель работы – знакомство с основами языка Verilog и средой разработ-

ки Modelsim.

Синтаксис языка Verilog напоминает синтаксис C-подобных языков, что упрощает его освоение. Основные управляющие конструкции if, while и др. подобны одноименным конструкциям языка C.

Verilog позволяет группировать программируемую логику в блоки. Каждый логический блок называется модулем. Модули имеют входы и выходы, которые ведут себя как сигналы, называемые wire.

Разработка устройств на языке Verilog обязательно включает в себя этап моделирования их работы. Одной из популярных сред для этого является

Modelsim разработки Mentor Graphics.

В тестовой оболочке (тестбенче) прописываются два блока: блок initial, который запускается один раз в начале процесса моделирования и служит для формирования начальных значений, и блок always, выполняющийся по положительному фронту тактирования clk.

19

Порядок выполнения работы

1.Создайте проект в среде Modelsim. Запустите Modelsim. Далее выполните последовательность команд меню File→New→Project…, введите название своего проекта и расположение на диске.

Добавьте файлы в проект. Выберите пункт меню Project → Add to Project

New File… Выберите тип файла Verilog и нажмите ОК.

2.Напишите свой модуль согласно заданию.

3.Напишите тестбенч к созданному модулю.

4.Промоделируйте тестбенч, получите требуемую последовательность данных.

Подразумевается, что созданные в ходе лабораторной работы модули будут впоследствии залиты на отладочную плату DE0-Nano, на которой расположены 4-позиционный DIP-переключатель, линейка из 8 светодиодов и две копки, формирующие управляющий сигнал и сигнал сброса (перезагрузки).

Таблица содержит данные для подключения всех необходимых выводов при выполнении лабораторной работы.

Соответствие выводов ПЛИС и периферийных устройств

Сигнал

Вывод ПЛИС

Генератор 50 МГц

R8

АЦП CS_N

A10

АЦП SCLK

B14

АЦП DOUT

A9

АЦП DIN

B10

LED0

A15

LED1

A13

LED2

B13

LED3

A11

LED4

D1

LED5

F3

LED6

B1

LED7

L3

Кнопка 0

J15

Кнопка 1

E1

DIP-переключатель 0

M1

DIP-переключатель 1

T8

DIP-переключатель 2

B9

DIP-переключатель 3

M15

20

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]