Лабораторная работа №4
Бесплатно
Основная коллекция
Издательство:
НИЦ ИНФРА-М
Автор:
Борисевич Алексей Валерьевич
Год издания: 2014
Кол-во страниц: 12
Дополнительно
Тематика:
ББК:
УДК:
ОКСО:
- ВО - Бакалавриат
- 09.03.01: Информатика и вычислительная техника
- 09.03.02: Информационные системы и технологии
- 09.03.03: Прикладная информатика
ГРНТИ:
Скопировать запись
Фрагмент текстового слоя документа размещен для индексирующих роботов.
Для полноценной работы с документом, пожалуйста, перейдите в
ридер.
Лабораторная работа №4. Изучение платы STM32VLDISCOVERY, динамической индикации и модульного принципа написания программ. Ход работы 1. Изучить теоретические сведения к лабораторной работе. 2. Выполнить практическую часть лабораторной работы. 3. Модифицировать программу в соответствии со своим вариантом. 4. Подготовить отчет по работе. 5. Ответить на контрольные вопросы. Теория 1. Плата STM32VLDISCOVERY Отладочная плата STM32VLDISCOVERY – это одно из самых дешевых доступных на рынке решений, предназначенных для ознакомления разработчиков с микроконтроллерами STM32 F1. Отличительными особенностями платы являются: - микроконтроллер STM32F100RB, с 128 Кб flash-памяти, 8 Кб памяти ОЗУ, корпус LQFP-64, - установленный на плату программатор ST-Link, который подключается к компьютеру через интерфейс USB, - питания от USB или от внешнего источника 5 В или 3.3 В, - два пользовательских светодиода (зеленый и синий), - пользовательская кнопка и кнопка сброса, - разъем расширения (гребенка контактов с шагом 2,54 мм на обратной стороне платы), на который выведены все сигналы микроконтроллера, а также питания, - разъем SWD и джамеры позволяют подключать программатор другому микроконтроллеру. Внешний вид платы показан на рисунке.
2. Цифровой светодиодный индикатор На рисунке показан стандартный светодиодный 7-сегментный индикатор.
8-й сегмент – это точка, которая не входит в изображение цифры и вообще, является необязательной. Бывают индикаторы и без точек. Для нумерации сегментов используются латинские буквы от a до h . У всех 7-сегментных индикаторов, сегменты нумеруются в том порядке, как это показано на рисунке, и никак иначе. Существует два типа индикаторов : с общим катодом (ОК), и общим анодом (ОА) в зависимости от того, как подключены светодиоды внутри. Для индикатора с общим катодом, общий вывод (ОК на схеме, показанной на рисунке) подключается к земле, а аноды сегментов через токоограничительные резисторы подключаются к плюсу источника питания. Для схемы с общим анодом направление тока должно быть обратным. 3. Динамическая индикация. Известно, что инерционность зрения человека приводит к тому, что мелькание с частотой большей 25 Гц мы воспринимаем как непрерывное свечение. Динамическая индикация – это способ управления индикаторами, когда отображаемая информация выводится или обновляется последовательно с частотой, достаточной для непрерывного восприятия за счет инерционности зрения человека. При динамической индикации одноименные сегменты всех разрядов многоразрядного индикатор объединяются. Пример схемы объединения сегментов для 5-и разрядного индикатора представлен на рисунке. Рассмотрим задачу вывода числа 316 на трехразрядный индикатор. Схема, иллюстрирующая процесс динамической индикации показана ниже В данной схеме сегменты индикатора с общим анодом объединены между собой и подключены к порту B микроконтроллера. Общие аноды каждого разряда подключаются через транзисторные ключи к напряжению питания +5В. На первом такте микроконтроллер зажигает первый слева разряд и подает на сегменты всех разрядов код цифры 3. Через некоторое время микроконтроллер включает второй разряд (средний) и подает на сегменты код цифры 1. Далее включается последний разряд и подается код цифры 6. После чего цикл повторяется снова. Поскольку частота переключения выбирается обычно больше 50 Гц, то визуально кажется, что все цифры индикатора светятся непрерывно. Практическая часть. Цель: с помощью платы STM32VLDISCOVERY осуществить индикацию 4-х разрядного числа, от кнопки осуществить включение и выключение индикатора. 1. Общее описание аппаратного обеспечения. Для работы с платой STM32VLDISCOVERY предполагается
использование разработанной материнской платы (backplane), в которую имеются ответные разъемы для установки STM32VLDISCOVERY. На материнской плате установлен 4-х разрядный индикатор с общим катодом красного цвета свечения (HL1 на схеме). Сегменты индикатора подключены через токоограничительные резисторы номиналом 220 Ом (RN1-RN2) непосредственно к выводам микроконтроллера. Катод каждого из разрядов управляется от микроконтроллера транзистором, включенным по схеме общим эммитером (VT2-VT5). Кроме того, на плате установлены две кнопки, формирующие сигналы BTN0 и BTN1 Фрагмент схемы материнской платы соответствующий разъемам для подключения платы STM32VLDISCOVERY показан на рисунке ниже Анализируя подключения элементов схемы к микроконтроллеру, можно свести воедино сигналы и порты ввода-вывода микроконтроллера в виде таблицы: Сигнал на схеме Порт микроконтроллера Описание BTN0 PC6 Кнопка 1 на материнской плате BTN1 PС1 Кнопка 2 на материнской плате
LED0 PC13 Сегменты A индикатора LED1 PC14 Сегменты B индикатора LED2 PС0 Сегменты C индикатора LED3 PC15 Сегменты D индикатора LED4 PA11 Сегменты E индикатора LED5 PA12 Сегменты F индикатора LED6 PC8 Сегменты G индикатора LED7 PC9 Сегменты H индикатора LED7X_IN_A0 PA15 Общий катод цифры 1 индикатора LED7X_IN_A1 PC12 Общий катод цифры 2 индикатора LED7X_IN_A2 PD2 Общий катод цифры 3 индикатора LED7X_IN_A3 PA5 Общий катод цифры 4 индикатора BEEP_IO PC7 Включение звукового сигнала (бипера) 2. Компиляция и отладка примера кода. Стандартным подходом для работы с отладочными платами является изучение примеров кода программ, распространяемых производителями. STMicroelectronics распространяет постоянно обновляемый пакет примеров к плате STM32VLDISCOVERY, который можно скачать на сайте st.com (вместе с документацией на плату) под названием STSW-STM32078 STM32VLDISCOVERY firmware package (AN3268). После скачивания и разархивирования архива, имеем следующую структуру файлов Выберем пример использования SysTick в качестве заготовки для создания проекта управления семисегментными индикаторами. Для этого в Keil необходимо открыть файл проекта, находящийся тут \Project\Examples\SysTick\MDK-ARM\SysTick.uvproj Скомпилировав проект, перейдем к его отладке. Для этого необходимо сделать два шага: 1. Переключить отладчик в режим моделирования (симулирования), как это было сделано в лабораторной работе №3. 2. Из-за того, что Keil не поддерживает моделирование процессора STM32F100, необходимо временно изменить процессор в настройках проекта на STM32F103, как это показано на рисунке:
Запустив отладчик, откроим логический анализатор (это все описано в материале работы №3). Добавим сигналы с выводов PC8 и PC9 микроконтроллера, введя в командную строку отладчика следующее la portc&0x100 la portc&0x200 Запустив программу на непрерывное выполнение, получим диаграммы сигналов, подающихся на светодиод Таким образом, данный пример реализует поочередное мигание светодиода, что также видно из исходного кода. 3. Написание функций для работы с индикатором. Рассмотрим процесс создания библиотеки функций для динамической индикации чисел на индикаторы. Основной функцией будет void LED7X_Update (unsigned char *Digits) Эта функция будет периодически вызываться из главного цикла программы. Ее параметр – это указатель на массив цифр, которые выводятся на индикатор. Для того, чтобы создать ощущение непрерывного свечения
цифры на индикаторе, необходимо вызывать эту функцию по крайне мере раз в 20 мс / 4 разряда = 5 мс. Алгоритм это функции следующий 0. Увеличить на 1 переменную iDigit – номер текущего выводимого на индикатор разряда. Если iDigit > 3, то iDigit = 0. (т.е. iDigit – всегда в пределах от 0 до 3). 1. Перекодировать Digits[iDigit] в код для семисегментного индикатора. Выдать этот код на сегменты индикатора. 2. Включить катод разряда, который соответствует iDigit Таким образом, помимо функции Update_LED7X имеет смысл предусмотреть еще ряд функций, а именно unsigned char DecodeTo7x(unsigned char x) – перекодирование двоичного кода числа x в код для отображения на семисегментном индикаторе. void DriveSegments(unsigned char c) – вывод кода c на сегменты индикатора. void DriveDigits(unsigned char d) – включение общего катода разряда с номером d. Еще необходимо объявить функцию void ConvertToDigits(unsigned char *Digits, unsigned int value) – преобразование числа value в массив цифр Digits. Для инициализации семисегментного индикатора используется функция void LED7X_Init() Функция DecodeTo7x осуществляет преобразование, заданное таблицей. На входе функции число, на выходе – код, который является побитным объединением состояний сегментов, Код16 = HGFEDCBA2 Числ о H G F E D C B A Код 0 0 0 1 1 1 1 1 1 3F 1 0 0 0 0 0 1 1 0 6 2 0 1 0 1 1 0 1 1 5B 3 0 1 0 0 1 1 1 1 4F 4 0 1 1 0 0 1 1 0 66 5 0 1 1 0 1 1 0 1 6D 6 0 1 1 1 1 1 0 1 7D 7 0 0 0 0 0 1 1 1 7 8 0 1 1 1 1 1 1 1 7F 9 0 1 1 0 1 1 1 1 6F -1 0 0 0 0 0 0 0 0 0 Заметим, что десятичная точка не используется в данной реализации. Значение параметра -1 предназначено для гашения разряда индикатора. Соберем все функции в один файл – led.c. Также к нему создадим заголовочный файл led.h, в котором будут объявления двух функций,
доступных внешнему пользователю LED7X_Init и LED7X_Update. Исходный код файлов led.c и led.h приведен в приложении. Файлы led.c и led.h необходимо скопировать в \Project\Examples\SysTick и файл led.c добавить в проект Keil, в группу файлов User (где содержится main.c), как это описано в лабораторной работе №3. 4. Код основной программы Для начала добавим в самое начало main.c ссылку на заголовочный файл с функциями работы с семисегментным индикатором (там где содержатся другие #include): #include "led.h" Далее перед функцией main необходимо реализовать код функцию преобразования числа, заданного в виде переменной типа int в массив цифр для вывода на индикатор: void ConvertToDigits(unsigned char *Digits, unsigned int value) { int i; sprintf(Digits, "%04d", value); for (i = 0; i < 4; i++) Digits[i] = Digits[i] - 0x30; } Приведем полный код функции main int main(void) { int iValue = 1234; // выводимое на индикатор число unsigned char sDigits[4]; // число, разделенное на разряды unsigned char bEnable = 0; // если =1, то индикатор включен unsigned char bBtn = 0; // состояние кнопки unsigned char bPrevBtn = 0; // предыдущее состояние кнопки GPIO_InitTypeDef GPIO_InitStructure; // configure button 1 pin RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6; GPIO_Init(GPIOC , &GPIO_InitStructure); /* Initialize Leds LD3 and LD4 mounted on STM32VLDISCOVERY board */ STM32vldiscovery_LEDInit(LED3); STM32vldiscovery_LEDInit(LED4); /* Turn on LD3 and LD4 */ STM32vldiscovery_LEDOn(LED3);
STM32vldiscovery_LEDOn(LED4); LED7X_Init(); /* Setup SysTick Timer for 1 msec interrupts */ if (SysTick_Config(SystemCoreClock / 1000)) { /* Capture error */ while (1); } while (1) { /* Toggle LD3 */ STM32vldiscovery_LEDToggle(LED3); // разбиение числа iValue на массив разрядов iValue = 1234; ConvertToDigits(sDigits, iValue); // обновление индикатора if (bEnable) LED7X_Update(sDigits); else LED7X_Update(" "); // обработка кнопки bBtn = (GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_6) == 0); if ((bBtn != 0) && (bBtn != bPrevBtn)) { bEnable = !bEnable; } bPrevBtn = bBtn; /* Insert 1 ms delay */ Delay(1); } } 5. Финальная компиляция и прошивка. После того, как все сделано и код отлажен необходимо скомпилировать проект с правильным процессором. А именно, вызвать контекстное меню вершины SysTick в дереве проекта, и выбрать пункт Options for Target 'SysTick' (как это было сделано ранее и в работе №3). Необходимо установить - на вкладке Device процессор STM32F100VB, - на вкладке Debug установить переключатель на Use и выбрать из списка ST-Link Debugger. Далее необходимо заново откомпилировать проект (Project\Build target). Перед подключением платы STM32VLDISCOVERY к компьютеру.
крайне желательно установить драйвер программатор микроконтроллера ST-Link V2, скачать который можно на официальном сайте st.com. После чего необходимо подключить плату STM32VLDISCOVERY, и в меню выбрать в меню Debug/Start-stop Debug Session (F5). В результате запуститься отладчик, но с тем отличием, что теперь отладка программы будет производится не на компьютере, а непосредственно внутри микроконтроллера на плате STM32VLDISCOVERY. Варианты заданий 1. Реализовать секундомер, отсчитывающий и выводящий время на LCD с точностью 1 с. Устройство имеет две кнопки: Пуск, при нажатии которой предыдущие показания индикатора стираются и начинается отсчет времени; и Стоп – при нажатии на которую отсчет времени останавливается. 2. Реализовать таймер, отсчитывающий и выводящий время на LCD с точностью 1 мин. Устройство имеет две кнопки: Пуск, при нажатии которой предыдущие показания индикатора стираются и начинается отсчет времени; и Стоп – при нажатии на которую отсчет времени останавливается. 3. Реализовать устройство, которое складывает два числа. Одно число отображается на двух младших разрядах индикатора. Второе число -- на двух старших. Таким образом, числа лежат в пределах от 0 до 99. При нажатии на кнопку 1 на плате первое число увеличивается на 1, при нажатии на кнопку 2 -- второе число увеличивается на 1. При нажатии одновременно на две кнопки -- числа складываются и результат выводится на индикатор 4. Реализовать устройство, которое перемножает два числа. Одно число отображается на двух младших разрядах индикатора. Второе число -- на двух старших. Таким образом, числа лежат в пределах от 0 до 99. При нажатии на кнопку 1 на плате первое число увеличивается на 1, при нажатии на кнопку 2 -- второе число увеличивается на 1. При нажатии одновременно на две кнопки -- числа перемножаются и результат выводится на индикатор. 5. Реализовать электронные часы. Два старших разряда -- показания часов от 0 до 23, два младших разряда -- показания минут от 0 до 59. Желательно, чтобы светодиод на плате STM32VLDISCOVERY мигал с частотой 1 Гц. Нажатие кнопки 1 увеличивает на 1 минуты, нажатие кнопки 2 увеличивается на 1 часы.