Книжная полка Сохранить
Размер шрифта:
А
А
А
|  Шрифт:
Arial
Times
|  Интервал:
Стандартный
Средний
Большой
|  Цвет сайта:
Ц
Ц
Ц
Ц
Ц

Лабораторная работа №4

Бесплатно
Основная коллекция
Артикул: 620035.01.99
Борисевич, А. В. Лабораторная работа №4. Изучение платы STM32VLDISCOVERY, динамической индикации и модульного принципа написания программ [Электронный ресурс] / А. В. Борисевич. - Москва : Инфра-М, 2014. - 12 с. - Текст : электронный. - URL: https://znanium.com/catalog/product/470098 (дата обращения: 29.03.2024)
Фрагмент текстового слоя документа размещен для индексирующих роботов. Для полноценной работы с документом, пожалуйста, перейдите в ридер.
Лабораторная работа №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 часы.