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

Лабораторная работа №3. Изучение основ использования микроконтроллеров STM32, библиотеки STM32 Standard Peripherals Library и среды разработки Keil

Покупка
Основная коллекция
Артикул: 620032.01.99
Борисевич, А. В. Лабораторная работа №3. Изучение основ использования микроконтроллеров STM32, библиотеки STM32 Standard Peripherals Library и среды разработки Keil [Электронный ресурс] / А. В. Борисевич. - Москва : Инфра-М, 2014. - 17 с. - Текст : электронный. - URL: https://znanium.com/catalog/product/470097 (дата обращения: 24.04.2024). – Режим доступа: по подписке.
Фрагмент текстового слоя документа размещен для индексирующих роботов. Для полноценной работы с документом, пожалуйста, перейдите в ридер.
Лабораторная работа №3.
Изучение основ использования микроконтроллеров STM32, 

библиотеки STM32 Standard Peripherals Library и среды разработки Keil 

Ход работы
1. Изучить теоретические сведения к лабораторной работе.
2. Выполнить практическую часть лабораторной работы.
3. Модифицировать программу в соответствии со своим вариантом.
4. Подготовить отчет по работе.
5. Ответить на контрольные вопросы.

Теория

1. Микроконтроллер STM32 F1
STM32 – это микроконтроллер, построенный на ядре ARM Cortex-M3. 

Данное ядро имеет много преимуществ, которые будут перечислены ниже, но 
его основное преимущество на сегодняшний день – универсальность. За два 
года Cortex-M3 стал индустриальным стандартом. Об этом говорит 
количество производителей, присоединившихся к данной архитектуре. Все 
основные производители микроконтроллеров, которые присутствуют в 
России, кроме Microchip, имеют или развивают решения на основе этой 
архитектуры: STMicroelectronics, Texas Instrument, NXP, ATMEL, Analog 
Devices, Renesas и т.д. Компания ST одна из первых выпустила свои 
микроконтроллеры Cortex-M3 (2007 г.) и быстро стала доминирующим 
игроком на этом рынке.

Основная причина популярности данных микроконтроллеров на мировом 

рынке – низкая цена, которая сопоставима с 8-и битными 
микроконтроллерами, и лучшее соотношение цена/функционал. Простейший 
микроконтроллер семейства STM32F100C4T6 c 16 килобайтами на борту 
стоит меньше 1 евро, при этом по характеристикам и периферии опережает 
любую AVR ATMega, которая, кстати, все равно стоит дороже. Цена на 
микросхемы старшей линейки с аппаратным USB и Ethernet (STM32F103) 
порядка 3 евро.

Еще одна из причин распространения STM32 – возможность upgrade c

минимальными затратами: все микросхемы совместимы по выводам внутри 
семейства STM32, что позволяет менять объем памяти (флэш-память и ОЗУ) 
и периферию (Ethernet, USB, CAN, и т.д.), не трогая печатную плату.

Архитектура микроконтроллера показана на рисунке 

Параметры типичного микроконтроллера семейства STM32 F1 

перечислены ниже:

■ Ядро ARM 32-bit Cortex™-M3 CPU Core 
– 72 MHz тактовая частота,
– Индекс производительности 1.25 DMIPS/MHz (Dhrystone 2.1) 

– Аппаратное умножение и деление за один такт процессора 
■ Память
– 16 or 32 KB - энергонезависимая память программ (Flash memory)
– 6 or 10 Kbytes - оперативная память (SRAM)
■ Питание, тактовый генератора, сброс
– напряжение питания от 2.0 до 3.6 V
– автоматический сброс при понижении питания, программируемый 

детектор напряжения (PVD)

– генератор для работы с кварцевыми резонаторами от 4 до 16 MHz
– внутренний RC-генератор 8 MHz
– внутренний RC-генератор 40 kHz
– умножитель частоты (PLL) для тактовой частоты ядра
– генератор 32 kHz для часов с низким потреблением
■ Энергосберегающий режим
– Режимы Sleep, Stop и Standby
– отдельный вывод VBAT для подключения батарейки
■ Два АЦП разрядностью 12-бит, быстродействие 1 мкс, 16 каналов
– Измеряемое напряжение: 0 to 3.6 V
– Возможность параллельного включения АЦП для двукратного 

увеличения скорости

– Внутренний датчик температуры
■ Прямой доступ к памяти
– 7-и канальный контроллер прямого доступа к памяти 
– прямой доступ к периферии: таймеры, АЦП, SPI, I2C и USART
■ Линии ввода-вывода
– до 51 программируемых ножек микроконтроллеров для логического входа 

и выхода

– прерывание по изменению сигналов на выводах
– толерантность к 5 В логическим уровням
■ Отладка
– Двухпроводной интерфейс SWD 
– стандартный интерфейс JTAG
■ Таймеры
– Два 16-битных таймера, каждый из которых с функциями ШИМ и входом 

квадратурного энкодера 

– 16-битный таймер с функцией генерации трехфазного ШИМ для 

управления электродвигателем, с генерацией мертвого времени и аппаратным 
аварийным отключением

– Два сторожевых таймера
– Таймер SysTick разрядностью 24 бита для формирования задержек в 

программе

■ Коммуникационные интерфейсы
– Два интерфейса I2C (SMBus/PMBus)
– Два интерфейса USART (УСАПП) (интерфейсы ISO 7816, LIN, IrDA)

– Интерфейс SPI (18 Mbit/s)
– Интерфейс CAN (2.0B Active)
– Интерфейс USB 2.0 (full-spee)
– Интерфейс Ethernet (10/100 Mbps, MII) 
■ Прочее
– аппаратный вычислитель CRC кода
– 96-битный уникальный серийный номер

2. Библиотека STM32 Standard Peripherals Library
STM32 Standard Peripherals Library (сокр. STM32 SPL) — это библиотека, 

созданная компанией STMicroelectronics на языке Си для своих 
микроконтроллеров семейства STM32F10x. Содержит функции, структуры и 
макросы для облегчения работы с периферией микроконтроллера. Библиотека 
документирована, включает примеры по каждому периферийному устройству, 
полностью поддерживает CMSIS и доступна для бесплатного скачивания. 
Последняя версия библиотеки: 3.5.0.

В библиотеке используются следующие соглашения об именах:

1. PPP — обозначение периферийного устройства, например ADC

(аналого-цифровой преобразователь)

2. Файлы исходного кода библиотеки начинаются с приставки 

stm32f10x_.

3. Имена констант прописаны заглавными буквами. Если константа 

используется в единственном файле, то она определяется в этом 
файле. Константа, используемая в более, чем одном файле, 
определяются в заголовочном файле.

4. Имена регистров, как и констант, прописаны заглавными буквами. 

Регистры именуются так же как в документации на 
микроконтроллеры.

5. Имена функций начинаются с PPP, после чего идет одно нижнее 

подчеркивание. Далее идут слитные слова, начинающиеся с 
заглавной буквы. Например: USART_SendData().

6. Для настройки периферии PPP используется функция PPP_Init(), в 

которую передается указатель на структуру типа PPP_InitTypeDef, 
содержащую настройки периферии.

7. Функция PPP_DeInit() сбрасывает регистры периферии в их 

начальное состояние.

8. Функция PPP_StructInit() заполняет поля структуры типа 

PPP_InitTypeDef значениями по умолчанию, которые описывают 
начальное состояние периферии (состояние после сброса).

9. Функция PPP_Cmd() включает или отключает периферию.
10.Функция PPP_ITConfig() включает или отключает прерывания.
11.Функция PPP_DMAConfig() включает или отключает DMA
интерфейс.

12.Функции, оканчивающиеся на Config, настраивают отдельные 

функции периферии. Например GPIO_PinRemapConfig().

13.Функция PPP_GetFlagStatus() служит для получения состояния 

флагов.

14.Функция PPP_ClearFlag() сбрасывает флаги.
15.Функция PPP_GetITStatus() сообщает о том произошло ли 

прерывание или нет.

16.Функция PPP_ClearITPendingBit() сбрасывает бит захвата 

прерывания.

Вся необходимая информация (на английском языке) содержится в 

Reference Manual stm32f10x_stdperiph_lib_um.chm, которая занимается 
большую часть объема архива библиотеки

В папке Project\STM32F10x_StdPeriph_Examples находятся примеры 

проектов для работы с каждым из периферийных устройств. 

Для того, чтобы откомпилировать примеры проектов необходимо

1. Скопировать файлы main.c, main.h (если существует), stm32f10x_it.c, 

system_stm32f10x.c, stm32f10x_it.h, stm32f10x_conf.h и любые другие 
файлы из папки примера в Project\STM32F10x_StdPeriph_Template. 

2. Открыть шаблон проекта в среде разработки. Для Keil это

Project\STM32F10x_StdPeriph_Template\MDK-ARM\Project.uvproj
Этот проект содержит все файлы и настройки для компиляции кода 
под микроконтроллеры STM32F10x.

3. Если необходимо, добавить все скопированные в п.1 файлы из папки 

с примером в проект (если некоторые из них не добавлены).

4. Откомпилировать проект
5. Прошить его в микроконтроллер для отладки.

3. Работа с библиотекой STM32 Standard Peripherals Library

Практически вся (если не вообще вся) периферия настраивается примерно 

одинаково, различия имеются только в специфических для каждого 
устройства параметрах и командах. Для примера рассмотрим настройку 
контакта 8 порта C (GPIOC) на выход и установку на нем логической 1.

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);

GPIO_InitTypeDef GPIO_InitStructure;

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_Init( GPIOC , &GPIO_InitStructure);

GPIO_WriteBit(GPIOB, GPIO_Pin_8, Bit_SET);

3.1. Включение тактирования периферийного устройства

Первым делом на порт подается тактовый сигнал: 

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);

Периферийные устройства тактируется либо от шины APB2, либо от APB1. 

От какой именно, можно узнать по названию константы. В нашем случае это 
RCC_APB2Periph_GPIOC, стало быть шина — APB2. Константа расположена 
в файле stm32f10x_rcc.h, давайте найдем ее. 

Вот что мы находим в stm32f10x_rcc.h: 

#define RCC_APB2Periph_AFIO              ((uint32_t)0x00000001)
#define RCC_APB2Periph_GPIOA             ((uint32_t)0x00000004)
#define RCC_APB2Periph_GPIOB             ((uint32_t)0x00000008)
#define RCC_APB2Periph_GPIOC             ((uint32_t)0x00000010)
#define RCC_APB2Periph_GPIOD             ((uint32_t)0x00000020)
......
#define RCC_APB1Periph_TIM13            ((uint32_t)0x00000080)
#define RCC_APB1Periph_TIM14             ((uint32_t)0x00000100)
#define RCC_APB1Periph_WWDG              ((uint32_t)0x00000800)
#define RCC_APB1Periph_SPI2              ((uint32_t)0x00004000)
#define RCC_APB1Periph_SPI3             ((uint32_t)0x00008000)
#define RCC_APB1Periph_USART2            ((uint32_t)0x00020000)
...

Поблизости можно найти все необходимые нам константы для запуска 

тактирования любого периферийного устройства. К примеру, если мы хотим 
воспользоваться USART2, мы воспользуемся константой 
RCC_APB1Periph_USART2, а поскольку из ее названия видно, что USART2 
тактируется от шины APB1, включение тактирования мы произведем 
следующим образом:

RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);

Заметим, что одним вызовом функции можно включить тактирование сразу 

несколько устройств, задав в параметре функции несколько констант через 
оператор побитовое ИЛИ:

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | 

RCC_APB2Periph_GPIOC 

| RCC_APB2Periph_ADC1, ENABLE);

Побитовое ИЛИ «соберет» все единички из перечисленных констант, а 

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

Обратите внимание, что в некоторых случаях может потребоваться 

дополнительная настройка, например, для АЦП необходимо выставить 
предделитель частоты:

RCC_ADCCLKConfig(RCC_PCLK2_Div6);

Максимальная тактовая частота для АЦП составляет 12 МГц, это 

необходимо учесть при выборе предделителя. 

3.2. Объявление и настройка структуры для инициализации

Следующий шаг — объявление некой инициализационной структуры 

(InitStructure), которая содержит все параметры для настройки периферийного 
устройства в виде переменных-членов (полей) структуры:

GPIO_InitTypeDef GPIO_InitStructure;

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

Структура описывается в заголовочном файле того устройства, к которому 

она относится. В данном примере мы инициализируем порты ввода-вывода
(GPIO), следовательно, структура GPIO_InitTypeDef описана в файле 
stm32f10x_gpio.h. Найдем ее:

typedef struct
{

uint16_t GPIO_Pin;             

/*!< Specifies the GPIO pins to be configured.

This parameter can be any value of @ref GPIO_pins_define */

GPIOSpeed_TypeDef GPIO_Speed;  

/*!< Specifies the speed for the selected pins.

This parameter can be a value of @ref GPIOSpeed_TypeDef */

GPIOMode_TypeDef GPIO_Mode;    

/*!< Specifies the operating mode for the selected pins.

This parameter can be a value of @ref GPIOMode_TypeDef */

} GPIO_InitTypeDef;

Большинство параметров структуры, как правило, имеет тип, схожий с 

названием параметра и добавлением суффикса "_TypeDef". Такие типы 
обычно определены как enum (перечисление). Для примера найдем
определения типа переменной GPIO_Mode (напоминаю, Ctrl + щелчок по 
GPIOMode_TypeDef):

typedef enum
{ GPIO_Mode_AIN = 0x0,

GPIO_Mode_IN_FLOATING = 0x04,
GPIO_Mode_IPD = 0x28,
GPIO_Mode_IPU = 0x48,
GPIO_Mode_Out_OD = 0x14,
GPIO_Mode_Out_PP = 0x10,
GPIO_Mode_AF_OD = 0x1C,
GPIO_Mode_AF_PP = 0x18

} GPIOMode_TypeDef;

Мы нашли все возможные значения для параметра GPIO_Mode. Описание 

значений в файлах stm32f10x_gpio.h и .c мне найти не удалось, так что 
придется лезть в Reference Manual, узнавать возможные режимы работы 
портов ввода-вывода и сопоставлять их со значениями. Но в данном случае 
здесь и так все понятно:

GPIO_Mode_AIN — аналоговый вход;
GPIO_Mode_IN_FLOATING — вход без подтяжки, болтающийся (англ. 

float) в воздухе

GPIO_Mode_IPD — вход с подтяжкой к земле (англ. Pull-down)
GPIO_Mode_IPU — вход с подтяжкой к питанию (англ. Pull-up)
GPIO_Mode_Out_OD — выход с открытым стоком (англ. Open Drain)
GPIO_Mode_Out_PP — выход двумя состояниями (англ. Push-Pull — туда
сюда)

GPIO_Mode_AF_OD — выход с открытым стоком для альтернативных 

функций (англ. Alternate Function). Используется в случаях, когда выводом 
должна управлять периферия, прикрепленная к данному разряду порта 
(например, вывод Tx USART и т.п.)

GPIO_Mode_AF_PP — то же самое, но с двумя состояниями

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

соответствующий раздел Reference Manual и сопоставив используемые 
режимы периферийного устройства с названием констант.

Кстати, перед заполнением структуры данными, рекомендуется вызвать 

функцию GPIO_DeInit(GPIOx), сбрасывающую текущие настройки в 
значения по умолчанию.

3.3. Инициализация

Самый простой пункт. Вызываем функцию инициализации, куда передаем 

указатель на сформированную в п.3.2 структуру:

GPIO_Init( GPIOC , &GPIO_InitStructure);

Для большинства устройств также требуется вызов команды «включение». 

Пример для включения USART1 и ADC: 

USART_Cmd(USART1, ENABLE);
ADC_Cmd(ADC1, ENABLE);

3.4. Использование

Для изменения значения на выводах микроконтроллера используются 

функция GPIO_WriteBit, параметрами которой является имя порта, номер 
контакта и устанавливаемое значение. В данном случае используется вызов

GPIO_WriteBit(GPIOB, GPIO_Pin_8, Bit_SET);

Для чтения используется функция GPIO_ReadInputDataBit.

Практическая часть: работа со средой Keil.

Рассмотрим основы работы со средой программирования 

микроконтроллеров Keil на примере создания и отладки кода из примера 
STM32 Standard Peripherals Library

1. Запустим Keil. В меню программы выберем Project\Open project... Далее 

откроем проект-заготовку из STM32 Standard Peripherals Library. Имя файла 
проекта:

Project\STM32F10x_StdPeriph_Template\MDK-ARM\Project.uvproj

2. Окно программы приобретет вид, показанный на рисунке

Справа находится основная часть среды разработки, с которой работает 

программист – редактор кода.

Слева находится дерево проекта (Project), в котором перечислены все 

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

Некоторые из файлов можно исключить из набора обрабатываемых 

компилятором, таким образом, формируется цель сборки (Target). Кроме того, 

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

Все сообщения об ошибках компиляции (error, warning), информации о 

занимаемой памяти, а также другой диагностический текст компилятора и 
отладчика выводятся в окне сообщений (Build Output) снизу.

3. Структура файлов проекта следующая
- Группа файлов User – файлы, реализующие пользовательский 

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

- Группа файлов StdPeriph_Driver – весь исходный код библиотеки STM32 

Standard Peripherals Library.

- Группа файлов CMSIS – файлы низкоуровневой библиотеки, 

описывающей системные ресурсы ядра процессора. Пользователь напрямую 
не работает с этой библиотекой.

- STM32_EVAL – группа файлов, содержащие функции для работы с 

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

- MDK-ARM – группа, содержащая файлы в машинно-зависимом коде 

(ассемблере), которые осуществляют самую первую инициализацию 
микроконтроллера. В зависимости от цели сборки активируется 
соответствующий своему микроконтроллеру файл.

- Группа Doc – любая документация к проекту.

4. По умолчанию цель сборки установлена как STM32100E-EVAL. Для 

правильной работы симулятора далее необходимо выбрать цель 
STM3210B-EVAL (последний вариант из выпадающего списка), что 
соответствует настройкам компилятора и необходимому набору библиотек 
для одноименной платы на основе микроконтроллера STM32F103. 

5. Конечной целью работы является создание программы, выводящей на 

выводы микроконтроллера заданную последовательность логических 
сигналов через определенные промежутки времени.

Удачным примером корректного формирования задержки является проект

Project\STM32F10x_StdPeriph_Examples\SysTick\TimeBase

Скопируем все файлы из данной папки в папку проекта 

Project\STM32F10x_StdPeriph_Template\ с заменой находящихся там файлов. 

Перечислим файлы, которые скопировались в результате:
- system_stm32f10x.c – содержит функции, вызываемые для настройки 

микроконтроллера (генератора тактовых частот),

- stm32f10x_it.c, stm32f10x_it.h – определение и объявление обработчиков 

прерываний (в данном примере используется прерывание от таймера SysTick),

- stm32f10x_conf.h – подключение заголовочных файлов функций 

библиотеки STM32 Standard Peripherals Library,

- main.c – собственно исходный код программы,
- main.h – заголовочный файл, используемый в main.h для подключения 

библиотеки и функций работы с платой.

Все необходимые файлы исходного кода уже были включены в шаблон 

проекта, поэтому никаких дополнительных действий не требуется. В общем 
случае, для добавления файла кода в группу файлов в дереве проекта, 
необходимо выбрать из контекстного меню группы (правой кнопкой) пункт 
Add Files to Group [группа]… и указать необходимые файлы. Только в таком 
случае они будут добавлены в проект и откомпилированы.

6. Для компиляции проекта необходимо в меню выбрать Project\Build target