Изучение микроконтроллеров архитектуры ARM Cortex-M3 на базе отладочного модуля STM32VL Discovery

Узнать стоимость написания работы

ЛАБОРАТОРНЫЙ ПРАКТИКУМ
по изучению микроконтроллеров архитектуры ARM Cortex-M3
на базе отладочного модуля STM32VL Discovery


Содержание:

1. Описание отладочной платы STM32VL Discovery

2. Установка и настройка программы Keil uVision

3. Начало работы и создание проекта

4. Общая информация для выполнения работ

4.1Порты ввода/вывода

4.2Система тактирования микроконтроллера STM32

4.3Прерывания в микроконтроллерах

4.4Системный таймер SysTick

5. Справка по Си

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

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

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

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

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


1. Описание отладочной платы STM32VL Discovery

Отладочная плата STM32VL Discovery (рис.1) предназначена для знакомства с возможностями 32-битного микроконтроллера. На плате имеется 32-битный микроконтроллер STM32F100RB с ядром Cortex-M3, частотой до 24 МГц, напряжение питания 2.0-3.6 В, ОЗУ 8 Кб, Flash-память 128Кб, 16-канальный 12-битный АЦП с датчиком температуры, два 12-битных ЦАП, семь 16-битных таймеров. Плата поделена на две части: отладчик ST-Link и микроконтроллер с набором периферии. Так же плата оснащена двумя светодиодами (зеленый и синий); пользовательской кнопкой и кнопкой сброса; реализованы интерфейсы UART, SWD, JTAG. По краям платы расположены 64 вывода микроконтроллера, из них 51 – программируемые. Для работы с платой будем пользоваться средой разработки Keil μVision.

Рис. 1 Внешний вид отладочной платы STM32VL Discovery

2. Установка и настройка программного обеспечения

Скачиваем программу с официального сайта разработчика https://www.keil.com/download/product/. Для загрузки выбираем пункт MDK-ARM. Для скачивания программы необходимо ввести свои персональные данные (рис. 2)

Рис. 2 Форма для ввода персональных данных

Для установки потребуется около 2Гб дискового пространства. После запуска установки необходимо принять условия лицензионного соглашения и выбрать директорию для установки (рис.3).

Рис. 3 Выбор директории для установки программы

При первом запуске программы откроется окно Pack Installer – утилита для установки, обновления и удаления программных пакетов (рис. 4).

Рис. 4 Окно утилиты Pack Installer

Для наших работ в окне Devices нужно выбрать STMicroelectronics-STM32F1 Series-STM32F100. Справа в окне Packs появится список доступных для загрузки пакетов. Нажимаем на кнопки Install рядом с пакетами ARM:: CMSIS, ARM::CMSIS-Driver_Validation, ARM::CMSIS-RTOS_Validation, ARM::mbedClient, ARM::mbedTLS, ARM::minar, Keil::ARM_Compiler, Keil::MDK-Middleware. После этого начнётся загрузка приложений. Программа всё сделает за вас – а вам останется только наблюдать за окном состояния загрузки в правом нижнем углу утилиты pack Installer.

3. Начало работы и создание проекта

После установки и настройки программного обеспечения, мы можем приступить к созданию проекта для нашего микроконтроллера. Выбираем в меню Project-New uVision Project (рис. 7).

Рис. 7 Создание нового проекта

Откроется стандартный мастер проекта, будет предложено указать имя файла. Для файлов проекта лучше создать отдельную папку, их в проекте будет много. После выбора папки выбираем производителя (STMicroelectronics) и наш микроконтроллер STM32F100RB(рис. 8).

Рис. 8 Выбор устройства для работы

После выбора микроконтроллера, откроется окно Manage Run-Time Environment, с помощью которого мы добавим: набор файлов для линейки семейства STM32, обеспечивающих инициализацию стека; библиотеки CMSIS и StdPeriph; файлы для работы с портами ввода/вывода; файлы для управления устройством сброса и тактирования периферийных устройств. Для этого в окне Manage Run-Time Environment отметим галочками следующие пункты: CMSIS – Core; Device – GPIO, Startup; StdPeriph Drivers – GPIO, RCC (рис. 9). После этого остается добавить еще один файл, в котором содержится функция main. Вначале создадим и сохраним его с помощью команд меню File, а затем добавим его в группу User. В результате получим проект со следующей структурой (рис. 10).

Рис.9 Окно Manage Run-Time Environment

Рис. 10 Структура проекта

Осталось сделать некоторые настройки, которые нужны для компиляции кода и выполнения отладки. Настройки выполняются в окне настроек с помощью команды Project/Options for target… или кнопкой на панели инструментов, или комбинацией клавиш Alt-F7. В открывшемся окне на вкладке С/С++ зададим определения USE_STDPERIPH_DRIVER, STM32F10X_MD_VL в поле Define (рис. 11).

Рис.11 Настройки проекта

Во вкладке Debug из списка отладчиков выбираем отладчик ST-Link Debugger. В настройках отладчика выбираем порт SW, так как предполагается использование ST-Link в режиме SW (рис.12).

Рис. 12 Настройки отладчика ST-Link

Здесь же выбираем алгоритм прошивания программы в Flash память
микроконтроллера (рис. 13).

Рис. 13 Выбор алгоритма прошивания flash-памяти

4. Общая информация для выполнения работ

4.1 Порты ввода/вывода

Контроллер STM32F100RB содержит три 16-разрядных порта ввода/вывода общего назначения, которые обозначены как GPIOx, где x может иметь значения A, B, C. Каждый порт GPIO имеет два 32-битных регистра конфигурации – CRL и CRH (в первом конфигурируются выводы от 0 до 7, во втором – от 8 до 15); два 32-битных регистра данных: входной регистр GPIOx_IDR (рис. 14) и выходной регистр GPIOx_ODR (рис. 15); 32-битный регистр для установки состояния определенных пинов GPIOx_BSSR; 16-битный регистр для сброса пина GPIOx_BRR; 32-битный регистр для установки блокировки пина GPIOx_LCKR.

Регистр входа (GPIOx_IDR). Биты регистра доступны только для чтения и содержат входные значения соответствующего порта ввода/вывода. Биты с 16 по 31 зарезервированы системой.

Адресное пространство: 0х08h

Значение сброса: 0х0000 XXXX

Рис. 14 Регистр входа

Регистр выхода (GPIOx_ODR). Биты регистра доступны для чтения и записи, значение битов этих регистров может быть изменено через регистры: GPIOx_BSRR и GPIOx_BRR. Биты с 16 по 31 зарезервированы системой.

Адресное пространство: 0х0C

Значение сброса: 0х0000 0000

Рис. 15 Регистр выхода

Режимы работы портов:

1. Input floating [GPIO_Mode_IN_FLOATING]. Высокоимпедансный вход (Hi-z);

2. Input pull-up [GPIO_Mode_IPU]. Вход с подтяжкой к питанию (между входом и питанием включен подтягивающий резистор);

3. Input-pull-down [GPIO_Mode_IPD]. Вход с подтяжкой к земле

4. Analog [GPIO_Mode_AIN]. Вывод может быть аналоговым входом или выходом;

5. Output open-drain [GPIO_Mode_Out_OD]. Выход с открытым коллектором;

6. Output push-pull [GPIO_Mode_Out_PP]. Двухтактный выход.

Во время и после сброса, альтернативные функции неактивны и порты ввода/вывода находятся в высокоимпедансном состоянии.

GPIO (General Purpose Input/Output ) - самый простой способ организации работы с внешними устройствами. Порты могут работать в двух режимах: вход (прием сигнала) и выход (передача сигнала). Работают они только с логическими уровнями 0 (Low) или 1 (Hight). Например, если подключить к порту в режиме выхода светодиод, то при подаче сигнала высокого уровня светодиод будет светиться, а при подаче низкого – потухнет. Если включить вывод в режим входа и подключить к нему кнопку, соединённую с землей, то с помощью микроконтроллера можно отслеживать ее состояние: нажатое или отжатое.

4.2 Система тактирования в микроконтроллере STM32F100RB

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

1. HSI oscillator clock (внутренний источник тактов);

2. HSE oscillator clock (внешний источник тактов);

3. PLL clock (внутренний блок умножения частоты).

Для снижения электропотребления микроконтроллера практически все
периферийные устройства после включения микроконтроллера – отключены. Включение периферийного устройства производится передачей тактового сигнала на его вход. Для того чтобы включить тактирование (микропроцессору будет указано, что ему нужно выделить некоторое количество времени в своей работе для периодического контроля состояния своего периферийного порта, в данном случае PC), нужно обратиться к двум datasheets: Reference Manual и Product Specification, которые расположены на st.com. В Reference Manual, находим раздел Reset and clock control for STM32F10xx, пункт RCC register map (рис. 16). RCC (reset and clock control) – система тактирования микроконтроллера, в ней находятся все регистры управления настройками генераторов, ФАПЧ и шин (фазовая автоподстройка частоты или phase-locked loop).

Рис. 16 Карта регистров RCC

4.3 Прерывания в микроконтроллерах

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

В документации на микроконтроллер рассматриваются interrupt и event. Interrupt – прерывание работы программы и переход к обработчику прерываний. Event – событие (аппаратное или программное). Событие может вызвать прерывание, запустить периферию, или другие возможности микроконтроллера. Каждое прерывание вызывается событием, но не каждое событие вызывает прерывание.

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

Вектора прерываний – особые адреса местоположения программы обработки прерываний. Таблицу векторов прерываний можно посмотреть в Reference Manual либо в файле startup_stm32f10x_md_vl.s (рис. 17). Вначале записаны fault interrupt – прерывания ядра, которые имеют наивысший приоритет и не подчиняются команде общего запрета\разрешения прерываний.

Рис. 17 Таблица векторов прерываний в файле startup_stm32f10x_md_vl.s

Как было сказано выше, NVIC поддерживает прерывания с различными приоритетами, которые могут прерывать друг друга. При этом могут возникнуть различные ситуации, обработка которых по-разному оптимизирована:

1. Приостановка низкоприоритетного прерывания;

2. Непрерывная обработка прерываний;

3. Запаздывание высокприоритетного прерывания.

Рассмотрим подробнее данные ситуации.

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

Непрерывная обработка прерываний может возникнуть в двух случаях: если два прерывания имеют одинаковый приоритет и возникают одновременно или если низкоприоритетное прерывание возникает во время обработки высокоприоритетного. В этом случае промежуточные операции над стеком не производятся. Происходит только загрузка адреса обработчика низкоприоритетного прерывания и переход к его выполнению. Отказ от операций над стеком экономит 6 тактов. Переход к следующему прерыванию происходит не за 12 тактов, а за 6.

Запаздывание высокоприоритетного прерывания возникает, если высокоприоритетное прерывание происходит во время перехода к обработке низкоприоритетного (за 12 тактов). В этом случае переход к высокоприоритетному прерыванию будет происходить не менее 6 тактов с момента его возникновения (время, необходимое для загрузки адреса обработчика прерывания и перехода к нему).

Для обработки внешних прерываний существует External interrupt/event controller (EXTI) – контроллер внешних прерываний/событий. Он имеет до 18 датчиков для генерации запросов прерывания/событий, специальный бит состояния для каждой линии прерывания, обнаружение внешнего сигнала с длительностью импульса меньше, чем период частоты APB2.

Регистр масок прерываний (EXTI_IMR). Все биты после сброса установлены в ноль. Единица в соответствующем бите разрешает прерывание для выбранной линии.

Адресное пространство: 0х00

Значение сброса: 0х0000 0000

Рис. 18 Регистр масок прерываний



4.4 Системный таймер SysTick

Этот таймер не описан подробно в документации на конкретное семейство микроконтроллеров, в Reference manual про него присутствует всего лишь несколько строк. Таймер SysTick расположен в ядре микроконтроллера и для всех устройств на базе ядра Cortex является стандартным. Этот таймер предназначен для формирования временных интервалов операционной системы реального времени – RTOS. Но и для других целей можно использовать периодические прерывания, формируемые этим таймером. В микроконтроллерах на ядре Cortex время перехода к обработчику прерывания строго детерминировано, что является огромным плюсом этого ядра.

Таймер представляет собой 24-разрядный декрементирующий счетчик. Источником тактирования является системная тактовая частота SYSCLK, либо та же частота, но поделенная на 8 – SYSCLK/8. В составе таймера имеются следующие регистры:

1. SYSTICK Current Value Register – счетный регистр, с каждым тактом уменьшающий содержимое на 1. При достижении нулевого значения в счетном регистре генерируется прерывание.

2. SYSTICK Reload Value Register – в этом регистре хранится значение для перезагрузки счетного регистра после обнуления.

3. SYSTICK Control and Status Register — регистр управления и статуса, здесь выбирается тактовая частота, запускается счетчик, разрешается генерация прерывания.

Контроллер прерываний NVIC всегда ожидает прерывания от этого таймера, достаточно только загрузить регистры таймера нужными значениями, разрешить генерацию прерываний и запустить счет, и тогда в устройстве будет источник периодических прерываний, при этом периферийные таймеры можно использовать для других целей. Для конфигурации таймера в файле core_cm3.h есть функция SysTick_Config(uint32_t ticks), в качестве аргумента которой передается коэффициент деления тактовой частоты для получения необходимой временной задержки (рис. 19).

Рис. 19 Конфигурация таймера в файле core_cm3.h

Это значение заносится в регистр перезагрузки. В самом начале выполняется проверка на то, что данная величина не выходит за максимальный предел, поскольку счетчик 24-разрядный, а передаваемый аргумент функции является 32-разрядным числом. Далее в функции конфигурации SysTick_Config() задается уровень приоритета прерывания, обнуляется счетный регистр, разрешается генерация прерывания, задается источник тактирования и разрешается работа таймера – запускается счет.

По умолчанию тактовая частота этого таймера будет равна системной тактовой частоте SYSCLK. Если же нужно задать частоту тактирования таймера как SYSCLK/8, то уже после этой функции инициализации можно вызвать функцию SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8),

которая находится в файле misc.c. Для этого к проекту необходимо подключить файлы misc.c и misc.h.

5. Справка по С

Для программирования в среде Keil uVision необходимо некоторое понимание языка С и структуры проектов, создаваемых на его базе.

Проект состоит из файлов с расширениями .c и .h. В первых находятся функции во вторых названия используемых функций и константы. Самый главный файл, в котором находится код программы main.c. Для использования различных функций нужно подключать библиотеки с этими функциями. Подключаются они записью #include "название_библиотеки" библиотеки должны быть в проекте. Подключают их в самом начале файла.

Функции – это часть программы. Программа состоит из одной или нескольких функций. Функция имеет вид:

тип_возвращаемой_переменной имя_функции (тип_переменной)

{

Тело функции

}

В функцию можно отправить переменную, функция её обработает и вернёт значение. Очень удобно использовать функцию для повторяющихся действий. Перед тем, как использовать функцию, её нужно объявить в самом начале файла. Делают это в таком виде:

тип_возвращаемой_переменной имя_функции (тип_переменной);

В конце каждой строки должна быть точка с запятой.

Если функция ничего не возвращает (например, временная задержка) то тип указывают void. При запуске, первой всегда выполняется функция main().

Все переменные могут быть разных типов, вот основные:

INT - переменная этого типа может быть только целым числом от -2147483648 до 2147483647

FLOAT - переменная этого типа число с точностью до 7 разрядов от ±1,5*10-45 до ±3,4*1033

DOUBLE - число с точностью до 16 разрядов от ±5*10-324 до ±1,7*10306

ULONG - тоже целое число, но от 0 до 18446744073709551615

LONG - целое от -9223372036854775808 до 9223372036854775807

CHAR - один символ

BOOL - логическая переменная. Она может иметь только 2 значения: истина (true) или ложь (false)

Строку (слово, предложение) можно представить как массив из символов типа char. Например:

char stroka[5] = "Слово";

Здесь квадратных скобках – количество символов в строке, «stroka» – название массива.

Перед использованием переменной её нужно обязательно объявить. (просто указать тип переменной и имя)

Дальше по плану операторы. Операторы - символы при помощи которых производятся какие либо операции над переменными.

+ – сложение.

- – вычитание.

* – умножение.

/ – деление.

= – присвоение переменной значения.

Например выражение a=b+c значит присвоить переменной a значение суммы значений переменных b и c.

++ – инкремент. Увеличение значения переменной на 1

-- – декремент. Уменьшение значения переменной на 1

Например, выражение a++ значит увеличить значение переменной a на 1 (то же самое, что и a=a+1)

== – сравнение, знак «равно».

!= – сравнение, знак «не равно».

< – сравнение, знак «меньше».

<= – сравнение, знак «меньше или равно».

> – сравнение, знак «больше».

>= – сравнение, знак «больше или равно».

Например выражение a<b становится истинным, если значение ,переменной a меньше значения переменной b и ложным, если значения равны или a больше b.

Выражение a==b истинно если a равно b и ложно, если a не равно b, НО выражение a=b истинно всегда, потому что это не сравнение, это присвоение

переменной a значения переменной b.

% – остаток от деления

Например, если a=5, b=3, то значение выражения a%b будет равно 2 (т.к. 5/3=1 (ост.2))

<< – побитовый сдвиг влево. Не вдаваясь в подробности, значение выражения a<<b на языке Си будет равно выражению a*2b

>> – побитовый сдвиг вправо. Выражение a>>b в программе равносильно выражению a/2b

& – логическое И.

| – логическое ИЛИ.

~ – инвертирование.

Циклы. Основные:

while(условие) {

тело цикла

}

Тело цикла (всё что в фигурных скобках) выполняется, когда условие истинно (пока условие не станет ложным).

Дальше идёт цикл всех циклов. Цикл со счетчиком. Он выполняется определенное количество раз, выглядит он так:

for (начальное_значение; цикл_выполняется_до, шаг) {

тело цикла

{

Начальное_значение – начальное значение счётчика

Цикл_выполняется_до – до достижения какого значения выполняется цикл

Шаг – с каким шагом счетчик считает

Например

Здесь начальное значение переменной i равно 0, цикл выполняется, пока значение переменной i меньше 10, при каждом выполнении цикла к переменной i прибавляется 1. Так же можно изменять значение переменной прямо в цикле.

Дальше по плану «условный переход»:

if (условие){

тело 1

} else {

тело 2

}

В условном переходе «тело 1» выполняется, если условие истинно и выполняется «тело 2», если условие ложно. Ещё есть такой вариант:

if (условие 1){

тело 1

} else if (условие 2) {

тело 2

}

В этом случае «тело 1» выполняется, если истинно «условие 1», «тело 2» выполняется, если истинно «условие 2». Таких условий может быть сколько угодно, так же может быть одно else.

Условия могут быть простыми и составными: простые - одно логическое выражение, а составное - несколько логических выражений соединённых знаком & (условия истинно, когда все условия соединённые этим знаком истинны) или | (условие истинно, если хотябы одно условие соединённое этим знаком истинно).

Ещё полезная вещь – комментарии. Комментировать можно или после знаков // и до конца строки или начинаются знаками /* и заканчиваются */, в таком случае комментарий может быть любое количество строк. На размер программы комментарии не влияют.

Лабораторная работа №1. Изучение настройки портов ввода\вывода с использованием библиотеки CMSIS.

Цель работы: ознакомиться с созданием проектов для платы, рассмотреть структуру проекта, изучить принципы работы с портами ввода/вывода и организацией их взаимодействия с использованием библиотеки CMSIS.

Оборудование и программное обеспечение: плата STM32VL Discovery, среда разработки Keil uVision 5, библиотека CMSIS, справочное руководство Reference manual для микроконтроллера STM32F100RB.

Светодиоды, предназначенные для программирования, подключены на плате к порту С (рис. 22):

Рис. 22 Подключение светодиодов на плате

Программируемая пользовательская кнопка подключена к порту А (рис. 23):

Рис. 23 Подключение пользовательской кнопки

Ход работы:

1. Создаем новый проект в среде разработки Keil uVision 5.

2. Для создания программы необходимо подключить файл, обеспечивающий инициализацию стека и таблицу векторов прерываний - startup_stm32f10x_md_vl.s Для этого в файле main.c проекта необходимо набрать #include "stm32f10x.h". Либо кликнуть правой кнопкой мыши по пустой строчке в файле main.c, выбрать меню Insert #include file – stm32f10x.h // Device header.

3. Далее, так, как показано в разделе 3, включить утилиту Manage Run-Time Environment и подключить библиотеки периферии: CMSIS – CORE, Device – GPIO, Startup.

4. Необходимо включить тактирование портов. Для определения регистра, ответственного за тактирование порта С обратимся к Reference Manual – раздел Reset and clock control – RCC register map. Находим в таблице IOPCEN и IOPAEN – за него отвечает регистр RCC APB2ENR. Устанавливаем биты 2 и 4 в единицу, таким образом, активируется тактирование портов PA и PC.

5. Теперь необходимо настроить выводы PC8 и PC9 как выходы. Для настройки выводов смотрим в Refrence Manual раздел General-purpose I/Os – GPIO registers. Здесь нам понадобятся регистры конфигурации GPIOx_CRH и GPIOx_CRL.

Задание:

1. Написать код программы для реализации заданного функционала.

2. Запрограммировать плату и продемонстрировать работу программы.

Лабораторная работа №2. Изучение настройки портов ввода/вывода с использованием библиотеки StdPeriph.

Цель работы: ознакомиться с созданием проектов для платы, рассмотреть структуру проекта, изучить принципы работы с портами ввода/вывода и организацией их взаимодействия с использованием библиотеки StdPeriph.

Оборудование и программное обеспечение: плата STM32VL Discovery, среда разработки Keil uVision 5, библиотека StdPeriph, справочное руководство Reference manual для микроконтроллера STM32F100RB.

Ход работы:

1. Создать новый проект в среде разработки Keil uVision 5.

2. Для создания программы необходимо подключить следующие файлы библиотек:

1. Основной файл программы – main.c необходимо создать самостоятельно.

2. Файл инициализации стека и таблицы векторов прерываний - startup_stm32f10x_md_vl.s. Для этого в файле main.c проекта необходимо набрать #include "stm32f10x.h". Либо кликнуть правой кнопкой мыши по пустой строчке в файле main.c, выбрать меню Insert #include file – stm32f10x.h // Device header.

3. В утилите Manage Run-Time Environment и подключить библиотеки периферии: CMSIS – CORE, Device –Startup, Device – StdPeriph Drivers – GPIO, RCC, Framework.

Для подключения указанных файлов следует нажать на кнопку Mange Run-Time Environment на панели (рис. 24)

Рис. 24 Вызов окна Manage Run-Time Environment

3. В файле stm32f10x_rcc.h нужно найти #define, отвечающий за

GPIOC (рис. 25)

Рис. 25 Поиск функции, отвечающей за тактирование порта С

Функция, отвечающая за тактирование порта С, будет начинаться c
RCC_APB2Periph. Найдем по этому ключу в этом же файле следующую
функцию: RCC_APB2PeriphResetCmd(uint32_t RCC_APB2Periph, FunctionalState NewState); и скопируем данную функцию в init.c. На первом месте в скобках пишем макроопределение #define, отвечающего за GPIO, найденный ранее, на втором месте – состояние: в данном случае – ENABLE. В итоге получим:
void LEDs_ini()//функция для инициализации диодов
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph _GPIOС, ENABLE);
}

4. Настроить работу портов С, А. В Библиотеке StdPeriph используются
готовые структуры, которые необходимо заполнить нужными значениями.
Соответствующую структуру для портов можно найти в файле:
stm32f1xx_gpio.c→ stm32f1xx_gpio.h (рис. 26)

Рисунок 26. Структура портов

Как видно, название структуры - GPIO_InitTypeDef (используется как
тип данных). В файле init.c создадим переменную Init_LEDs с таким типом:
GPIO_InitTypeDef Init_LEDs, причем, так как переменные определяются до
функций в которых они используются, объявлять эту переменную нужно до
включения тактирования. Далее, в конце функции инициализации диодов описываем структуру
Init_LEDs. Указываем выводы, на которых расположены диоды:
Init_LEDs.GPIO_Pin=GPIO_Pin_8|GPIO_Pin_9

устанавливаем скорость работы=2МГц :
Init_LEDs.GPIO_Speed=GPIO_Speed_2MHz;
устанавливаем режим работы – на выход:
Init_LEDs.GPIO_Mode=GPIO_Mode_OUT

После этого нужно инициализировать эту структуру. Функция инициализации GPIO_Init(GPIOC, &Init_LEDs); находится в stm32f1xx_gpio.h в самом конце. На первом месте пишется название порта, на втором – указатель на структуру.

5. Теперь нам нужно менять состояние светодиодов. В файле stm32f1xx_gpio.h описаны все необходимые для этого функции.
void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin); -
устанавливает 1 на указанной ножке;
void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);-
сбрасывает значение;
void GPIO_WriteBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin,
BitAction BitVal); - записывает определённое значение на выводе;
void GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal); -
записывает определённое значение на весь порт.

Задание:

1. Активировать тактирование порта А.

2. Самостоятельно провести настройку порта А на ввод.

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

4. Запрограммировать плату и продемонстрировать работу программы.

Лабораторная работа №3. Изучение контроллера внешних прерываний/событий с помощью библиотеки StdPeriph

Цель работы: ознакомиться с понятием прерывания, возможностями, которые они предоставляют, изучить контроллер внешних прерываний/событий - External interrupt/event controller (EXTI).

Оборудование и программное обеспечение: плата STM32VL Discovery, среда разработки Keil uVision 5, библиотека StdPeriph, справочное руководство Reference manual для микроконтроллера STM32F100RB.

Ход работы:

1. Создать проект в среде разработки Keil uVision 5.

2. С помощью утилиты Manage Run-Time Environment подключить библиотеки CMSIS – CORE, Device –Startup, Device – StdPeriph Drivers – GPIO, RCC, Framework, EXTI.

3. Настроить на вывод порт C, подать тактирование на порт А.

4. Настроить регистр Nested Vector Interrupt Controller (NVIC), встроенный контроллер вектора прерываний. Посмотреть таблицу векторов прерываний можно в файле startup_stm32f10x_md_vl.s (рис. 27)

Рис. 27 Таблица векторов прерываний в файле startup_stm32f10x_md_vl.s

Необходимо ,как и при настройке портов, задать название стрктуры для вектора прерывания (NVIC_InitTypeDef NVIC_Init_Button), разрешить глобальные прерывания NVIC_EnableIRQ (EXTI0_IRQn) – здесь указывается, что прерывания разрешены для нулевой линии, куда входят все нулевые пины всех портов ввода, вывода указать источник прерываний с помощью дефайна NVIC_Init_Button.NVIC_IRQChannel (указываем снова EXTI0_IRQn – внешнее событие по нулевому каналу). Далее, надо включить прерывания с помощью NVIC_Init_Button.NVIC_IRQChannelCmd = ENABLE и выставить приоритеты:

NVIC_Init_Button.NVIC_IRQChannelPreemptionPriority = 0x0F;

NVIC_Init_Button.NVIC_IRQChannelSubPriority = 0x0F.

5. Настройте дедктор внешних событий. Для этого задайте стрктуру для детектора событий EXTI_InitTypeDef EXTI_Init_Button; укажите канал отслеживания EXTI_Init_Button.EXTI_Line = … ; задайте режим работы EXTI_Init_Button.EXTI_Mode = … (здесь необходимо выбрать режим прерываний Interrupt), разрешите отслеживание внешних событий EXTI_Init_Button.EXTI_LineCmd = ENABLE; и укажите по какому внешнему событию будет происходить прерывание EXTI_Init_Button.EXTI_Trigger = …. (здесь есть несколько вариантов – по фронту импульса EXTI_Trigger_Rising, по спаду EXTI_Trigger_Rising, по фронту и спаду).

6. Не забудьте в конце блока инициализации заврешиь формирование всех структур.

GPIO_Init(GPIOC, &GPIO_Init_LED);

EXTI_Init(&EXTI_Init_Button);

NVIC_Init(&NVIC_Init_Button).

7. В ходе работы необходимо выполнить действия, которые произойдут по нажатию кнопки. Для этого необходимо описать функцию EXTI0_IRQHandler, которая будет автоматически вызываться, по нажатию кнопки. Функция должна проверять состояние специального регистра, фиксирующего прерывания, делается это с помощью структуры EXTI_GetITStatus(EXTI_Line0). Здесь EXTI_Line0 – указание на бит необходимого регистра для нулевого канала прерываний. После проверки состояние регистра необходимо написать программу прерывания и не забыть очистить искомый бит EXTI_ClearITPendingBit(EXTI_Line0);

Задания:

1. Настроить тактирование портов А, С, AFIO.

2. Настроить порт С – на вывод

3. Настроить контроллер внешних прерываний и регистр векторов прерываний.

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

5. Запрограммировать плату и продемонстрировать работу программы.

Лабораторная работа №4. Использование программной среды STM32CubeMX для настройки проекта и библиотеки HAL для программирования.

Цель работы: ознакомиться с конфигурацией проекта с помощью утилиты STM32CubeMX и элементами библиотеки HAL на примере платы STM32 F3 Discovery.

Оборудование и программное обеспечение: плата STM32 F3 Discovery, среда разработки Keil uVision 5, STM32CubeMX, библиотека HAL.

Ход работы:

1. Скачайте с официальносго сайта ST Microelectronics и установите STM32CubeMX. Убедитесь, что у вас установлены библиотеки для семейства F3, для этого запустите приложение и зайдидет в меню Help – Install New Libraries.

2. Создайте новый проект, нажав на кнопку New Project на главной странице приложения. Выберите микроконтроллер STM32F303VCTx (рис. 28)

Рис. 28 Выбор MCU

3. Установите пины PE8-PE15 в режим Output (для этого надо кликнуть на каждый левой кнопкой мыши), а пин PA0 – в режим Input. В левой колонке в меню SYS выставьте Debug – Serial Wire, а в меню RCC – High Spedd Clock (HSE) – BYPASS Clock Sourse. Сверьтесь с рис. 29.

Рис. 29 Настройка портов и периферии

4. Чтобы настроить тактирование портов, перейдите на вкладку Clock Configuration и настройте соответственно рис. 30. После этого нажмите кнопку Generate Code и установите настройки для проекта и пути его сохранения (рис. 31).

Рис. 30 Настройка тактирования

Рис. 31 Генерация проекта

Если вы не установили библиотеку для семейства F3, то программа попросит разрешения сделать это самостоятельно из интернета. Разрешите.

5. Созданный проект открываем в Keil uVision и ищем там строчки

while (1) {

/* USER CODE END WHILE */

/* USER CODE BEGIN 3 */

Здесь будет ваш код

}

/* USER CODE END 3 */

6. Для написания простейшей программы вам понадобятс следующие функции: HAL_GPIO_ReadPin (GPIOx, GPIO_PIN_y) читает состояние указанного бита (кнопки в нашем случае) – вместо x указываем порт, вместо y – номер пина; HAL_GPIO_TogglePin (GPIOx, GPIO_PIN_y) меняет состояние пина, настроенного на выход; HAL_Delay (xxx) – простая задержка, вместо xxx вставляем число тактовых импульсов; HAL_GPIO_WritePin (GPIOx, GPIO_PIN_y, GPIO_PIN_RESET) – запись конктретного значения в конкретные пины, в данном случае, сбрасывание этих пинов в 0.

Задание:

1. Создать проект в STM32CubeMX.

2. Написать программу с использованием кнопки, сведиодов и задержки времени на базе библиотеки HAL.

3. Запрограммировать плату и продемонстрировать работу программы.

СПИСОК ЛИТЕРАТУРЫ

1. ARM (архитектура) [Электронный ресурс] – Режим доступа : URL:
http://ru.wikipedia.org/wiki/ARM_(архитектура)/.

2. STM32F4DISCOVERY, Отладочный комплект на базе TM32F407VGT6 ARM CortexM4-F [Электронный ресурс] – Режим доступа : URL: http://www.chipdip.ru/product/stm32vldiscovery/

3. Лабораторный практикум по изучению микроконтроллеров архитектуры
ARM Cortex-M4 В. И. Бугаев, М. П. Мусиенко, Я. М. Крайнык Москва-
Николаев – 2013, 52c

4. Павловская Т.А. C/C++. Программирование на языке высокого уровня. — CПб.: Питер, 2001-2011. - 461 с.

5. Бородулин А. STM8 и STM32 – объединенное пространство 8- и 32-разрядных микроконтроллеров //Компоненты и технологии №10. – 2009. – с. 55-59.

6. Микропроцессорные системы управления в робототехнике и мехатронике [Электронный ресурс] – Режим доступа : URL: http://bigor.bmstu.ru/?cnt/?doc=MPSU/base.cou

7. Стандартные функции, структуры данных и алгоритмы системы программирования языка С [Электронный ресурс] – Режим доступа : URL: http://bigor.bmstu.ru/?cnt/?doc=PYAVU/base.cou

8. Знакомство с STM32VL Discovery [Электронный ресурс] – Режим доступа : URL: http://easystm32.ru/stm32vl-discovery

9. Микроконтроллеры. Начало. STM32 [Электронный ресурс] – Режим доступа : URL: http://radiokot.ru/articles/56/

10. STM32 ADC Примеры использования. Шаг 1 [Электронный ресурс] – Режим доступа : URL: http://mycontroller.ru/stm32-adc-primeryi-ispolzovaniya-shag-1/.

11. Начинаем изучать Cortex-M на примере STM32, часть 2[Электронный ресурс] – Режим доступа : URL: http://habrahabr.ru/post/218825/.

12. Программирование STM32F4. USART. Пример программы. [Электронный ресурс] – Режим доступа : URL:
http://microtechnics.ru/programmirovanie-stm32f4-usart-primer-programmy/.

13. STM32F4: INTERRUPT TIMER [Электронный ресурс] – Режим доступа : URL: http://amarkham.com/?p=29.

14. ST Visual Programmer for programming ST7, STM8 and STM3 2 [Электронный ресурс] – Режим доступа :
URL: http://www.st.com/web/catalog/tools/FM147/CL1794/SC961/SS1533/PF210568.

15. Brown J. Discovering the STM32 Microcontroller. January 8, 2013.

16. Reference manual. STM32F10xxx, advanced ARM-based 32-bit
MCUs. [Электронный ресурс] – Режим доступа : URL:
http://www.st.com/web/en/resource/technical/document/reference_manual/DM00031020.pdf.

17. STM32–Контроллер внешних прерываний (событий) [Электронный ресурс] – Режим доступа : URL: http://ziblog.ru/2011/05/18/stm32-ndash-kontroller-vneshnih-preryivaniy-sobyitiy.html

18. Ознакомление с техническими и программными средствами для микроконтроллеров семейства ARM [Электронный ресурс] – Режим доступа : URL : http://frela-mk.narod.ru/olderfiles/1/metodichka_lr2.pdf

19. Сравнительный анализ микроконтроллеров с ядром ARM [Электронный ресурс] – Режим доступа : URL : http://www.gaw.ru/html.cgi/txt/publ/micros/arm.htm

20. ARM. Учебный курс. Прерывания и NVIC – приоритетный контроллер прерываний [Электронный ресурс] – Режим доступа : URL : http://easyelectronics.ru/arm-uchebnyj-kurs-preryvaniya-i-nvic-prioritetnyj-kontroller-preryvanij.html

21. Появление и история развития микроконтроллеров [Электронный ресурс] – Режим доступа : URL : http://www.mrwolf.ru/Gadzhety_i_tehnologii/Pro4ee/7674

22. М. Предко Руководство по микроконтроллерам. Том II. .Москва: Постмаркет, 2001.- 488 с.

23. М. Предко Руководство по микроконтроллерам. Том I. Москва: Постмаркет, 2001. - 416 с.

24. MicroXplorer Eclipse plugin, graphical tool to configure STM32 microcontrollers. [Электронный ресурс] –
Режим доступа : URL: http://www.st.com/web/en/catalog/tools/PF257931.

Источник: портал www.KazEdu.kz

Каталог учебных материалов

Свежие работы в разделе

Наша кнопка

Разместить ссылку на наш сайт можно воспользовавшись следующим кодом:

Контакты

Если у вас возникли какие либо вопросы, обращайтесь на email администратора: admin@kazreferat.info