STM32F0Discovery — Мигание светодиодом / Песочница / Хабр

Доставка синих ромашек в Москве (Antananarivo)

В прошлый раз не получилось восстановить старую запись полностью (Базовый шаблон [STM32, Часть 2]), но это и к лучшему.

Так как я попробовал в работе новые платы (STM32F0-Discovery и STM32F4-Discovery), а следовательно как я и обещал в конце статьи получим четыре базовых проекта.

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

Базовый проект

В первую очередь необходимо скачать стандартную библиотеку (Standard Peripherals Library Drivers) под выбранное семейство, я скачал все четыре:

  • STM32L1xx Standard Peripherals Library Drivers
  • STM32F0xx Standard Peripherals Library Drivers
  • STM32F1xx Standard Peripherals Library Drivers
  • STM32F4xx Standard Peripherals Library Drivers

Для простоты рассмотрим один проект для STM32F0.

Из библиотеки я взял следующие файлы:

  • stm32_flash.ld — сценарий для компоновщика (решил и его взять готовый)
  • startup_stm32f0xx.s — начальная инициализация
  • stm32f0xx.h — заголовочный файл с описанием периферии микроконтроллера
  • core_cm0.h, core_cmFunc.h, core_cmInstr.h — файлы с описанием ядра (cortex-M0)
  • stm32f0_stdperiph_lib — файлы самой библиотеки

Для проверки работоспособности кода используем простую программу:

Действия которой сводятся к включению светодиода при нажатии кнопки.

(На каждой из четырех плат имеется как минимум один светодиод и два кнопки: одна для сброса микроконтроллера, состояние другой можно контролировать из программы)

Как видно из кода выше, для работы с линиями ввода-вывода я не использую библиотечные функции, так как они очень не оптимальны.

А использую свои макросы.

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

Перед использованием линии ввода-вывода необходимо сделать объявление:

Примечание:

литера порта [A, B, C …]
номер линии [0-15]
активный уровень [HIGH, LOW]
режим работы (согласно документации) ANALOGINPUT_FLOATING INPUT_PULL_DOWN INPUT_PULL_UP GENERAL_OUTPUT_OPEN_DRAIN GENERAL_OUTPUT_PUSH_PULL ALTERNATE_OUTPUT_OPEN_DRAIN ALTERNATE_OUTPUT_PUSH_PULL
максимальная частота работы линии SPEED_2MHZSPEED_10MHZ SPEED_50MHZ

и перед использованием настроить линию:

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

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

В коде инициализации (файл startup_stm32f0xx.s) вызывается внешняя функция SystemInit, реализация которой представлена в файле system_stm32f0xx.с.

Решил не использовать её и написал вот такой код:

Т.е. сразу после кода инициализации (startup_stm32f0xx.s) и перед передачей управления основному коду (main), вызывается функция SystemInit.

Внутри которой настраивается татирование линий ввода-вывода:

и сами линии:

Для полноты картины структура проекта:

Сборку проекта можно сделать из командной строки, а можно как я использовать Eclipse.

Eclipse – в качестве редактора кода

Скачиваем сам Eclipse c офф сайта www.eclipse.org.

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

После запуска нам предлагают выбрать рабочее пространство:

Указываем место где будет располагаться наш проект.

Далее давим кнопочку и переходим к текущему рабочему пространству:

Качаем проект с примером.

Архив нужно распаковать в любую папку.

Создаем проект:

Задаем имя проекта и указываем каталог с исходниками:

Исходники будут добавлены в проект и автоматически собраны:


Базовые проекты:

Categories: МикроконтроллерыSTM32Tags: GPIO


comments powered by

Под платформы ПК первым уроком обычно является «Hello world», в нашем же случае, консольный вывод изначально не доступен. Поэтому для обучения простейшей программой выбрано управление светодиодом, т.к. не требует углубленных знаний.

Для начала необходимо разобраться в схеме макетной платы и выяснить к какой ноге МК подключен наш светодиод.

В моем случае для примера взята плата Open107V с MK STM32F107VCT

На плате имеется 4 светодиода: LED1-LED4. Для работы выберем LED1. Найдем его на схеме и проследим к какой ноге МК он подключен.

Из схемы видно, что LED1 подключен к порту B0. С ним то нам и предстоит работать.

Так как для линейки STM32F1xx Keil поставляет старые библиотеки Standard Peripherals Library, мы рассмотрим два варианта реализации проекта.

Вариант 1. Создаем проект для МК STM32F107VC с использованием поставляемой Keil библиотеки Standard Peripherals Library.

Как создать проект в Keil?

В Manager Run-Time Environment должны быть выбраны следующие пункты:

  • Device->Startup
  • Device->StdPeriph Driver->GPIO
  • Device->StdPeriph Driver->Framevork
  • Device->StdPeriph Driver->RCC
  • CMSIS->CORE

Перейдем к рассмотрению кода:

main.c

Теперь вкратце разберем что здесь и зачем.

Функция void LedInit(void) — инициализация ноги МК подключенной к светодиоду. В данной функции мы включаем тактирование порта BRCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE) и настраиваем ногу, заполнив структуру GPIO_InitStructure. Где GPIO_Pin = GPIO_Pin_0 соответствует номеру пина, а GPIO_Mode = GPIO_Mode_Out_PP режиму работы и производим инициализацию порта GPIO_Init(GPIOB, &GPIO_InitStructure), где указывается ранее заполненная структура и соответствующий порт. Т.е. если в вашем случае светодиод подключен к другой ноге МК, вам будет необходимо поменять эти параметры.

Функция void Delay(__IO uint32_t nTime) — организация задержки по времени в мс.

Функция void SysTick_Handler(void) — обработчик прерывания от системного таймера.

И так, мы инициализируем ногу контроллера для работы в режиме выхода, а так же системный таймер для организации задержки по времени. В цикле while, каждые 500 мс производится смена состояния выхода порта B0.

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

На этом первый вариант закончен, можно компилировать и зашивать.

Вариант 1.

Создаем проект для МК STM32F107VCT с использованием CubeMX.

Создадим проект для нашего МК выбрав соответствующую серию, линейку и корпус LQFP100.

В разделе Peripherals->RCC для High Speed Clock (HSE) выберем Crystal/Ceramic Resonator. Данным действием мы подключаем к МК внешний кварц.

На МК по ноге PB0 нажмем левой кнопкой мыши и выберем пункт GPIO_Output.

Перейдем во вкладку Clock Configuration. В Input frequency выставим 25 MHz, с таким номиналом кварц на моей плате, в вашем случае может быть другой.

Антананариву, Мадагаскар — точное время

В HCLK (MHz) выставим 72 MHz — тактовая частота контроллера. После CubeMX предложит пересчитать делители под конечную частоту. Соглашаемся, делители выставлены.

Теперь все готово и можно сгенерировать начальный код для Keil.

В меню Project выбираем Generate Code. В окне записываем имя проекта, выбираем путь к проекту и в Toolchain / IDE — MDK-ARM V5. Жмем OK и в появившемся окне Open Project.

CubeMX предоставил необходимы шаблоны, которые нам остается только дополнить двумя строчками:

HAL_Delay(500); — стандартная функция задержки по времени в библиотеке HAL.

HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_0); — функция смены состояния порта.

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

main.c

CubeMX создает код на основе библиотеки HAL. Разобравшись в CubeMX, что не так сложно, вы сможете с легкость подготавливать шаблоны с настроенной периферией. Что, в свою очередь, неплохо сократит время.

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

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

Компания ST раздаёт дешёвые отладочные платы для знакомства с их микроконтроллерами. Наверняка и вы начнёте с них — поэтому я рассмотрю основные платы Discovery, чтобы вы могли выбрать себе по вкусу.

STM32VLDiscovery

Самая первая плата семейства, раньше называлась просто STM32Discovery. Именно с неё началась экспансия ST на рынок дешёвых и мощных микроконтроллеров общего назначения, этим объясняется её неприлично низкая цена — демпинг цен на эту плату принёс ST прибыль в виде множества новых адептов.

Начинка

  • Отладчик — ST-Link, SWD-коннектор наружу
  • Процессор — STM32F100RBT6 (24МГц, 128кБ флеш, 48кБ RAM)
  • 2 кнопки — юзерская и резет
  • 2 светодиода
  • сменный (!) тактовый кварц
  • часовой кварц
  • 62 контакта на гребёнке выводов, из них 51 контакт ввода-вывода
  • перемычка для определения потребляемого тока

Как видим, довольно мощная плата. Вкупе с низкой ценой (а многие, как и я, получили её бесплатно на семинарах) она произвела настоящий фурор.

К плате прилагается множество примеров использования разной периферии, и неплохой «Master project», прошитый по умолчанию.

Скачать примеры для STM32VLDiscovery.

STM32F4Discovery

Очень сильная плата, как по мощности процессора так и по количеству периферийного оборудования. Процессор класса STM32F4 имеет высокую скорость работы, множество периферии вроде контроллеров памяти/дисплеев/камеры и всевозможными USB, CAN и прочими интерфейсами, а также полноценные модули FPU и DSP. Замечательный процессор, на нём сделано довольно много из моих приборов.

Начинка

  • Отладчик — ST-Link/V2 с расширенным SWD-коннектором
  • Процессор — STM32F407VGT6 (168МГц, 1МБ флеш, 192кБ RAM)
  • 2 кнопки — юзерская и резет
  • 4 светодиода
  • сменный тактовый кварц
  • 100 контактов на гребёнке, из них 80 контактов ввода-вывода
  • перемычка для измерения тока
  • MEMS-акселерометр LIS302DL
  • Цифровой микрофон MP45DT02
  • Аудио-АЦП CS43L22 с усилителем D-класса
  • micro-USB-коннектор

Конечно, стоит дороже — но и возможностей имеет куда больше. Прекрасная плата, удобная и мощная. В основном на ней я проводил эксперименты со звуком, с шинами CAN и USB, и акселерометром.

Антананариву

Наличие DSP-ядра даёт возможность производить цифровую обработку аудиосигналов и навигации. Помимо перечисленной периферии, на кристалле присутствуют также модули вычисления CRC (контрольные суммы), HASH (хеш данных), CRYPT (криптография) и RNG (генератор случайных чисел).

Список прилагающихся примеров так же обширен. Из минусов — разве что не очень удобный micro-USB.

Скачать примеры для STM32F4Discovery.

STM32F3Discovery

Столь же хорошая плата, но с ещё более новым процессором серии STM32F3, и явной направленностью на навигационные применения и Sensor Fusion. Похоже, её сделали на росте популярности квадрокоптеров, которым нужен как раз такой набор датчиков положения. Также, видимо, инженеры услышали просьбы разработчиков и сделали USB в виде обычного mini-USB.

Начинка

  • Отладчик — ST-Link/V2 с расширенным SWD-коннектором
  • Процессор — STM32F303VCT6 (72МГц, 256кБ флеш, 48кБ RAM)
  • 2 кнопки — юзерская и резет
  • 8 светодиодов
  • 100 контактов на гребёнке, из них 86 контактов ввода-вывода
  • перемычка для измерения тока
  • MEMS-акселерометр/магнитометр LSM303DLHC
  • MEMS-гироскоп L3GD20
  • mini-USB-коннектор

По умолчанию прошит довольно интересный пример — магнитный компас, отображающий направление на север на светодиодном круге.

К возможностям процессора стоит добавить умножение за 1 такт и железное деление, модули вычисления CRC (контрольные суммы), HASH (хеш данных), CRYPT (криптография) и RNG (генератор случайных чисел), а также расширенные аналоговые возможности — 4 ОУ с изменяемым коэффициентом усиления, увеличенное количество (4 штуки) 12-бит АЦП и 7 компараторов. Это делает STM32F3 настоящим DSP, с отличным аналоговым интерфейсом.

На этой плате я также сделал довольно много приборов.

Скачать примеры для STM32F3Discovery.

STM32F0Discovery

Самая свежая отладочная плата — на младшем процессоре серии STM32F0.

Начинка

  • Отладчик — ST-Link/V2 с расширенным SWD-коннектором
  • Процессор — STM32F051R8T6 (48МГц, 64кБ флеш, 8кб RAM)
  • 2 кнопки — юзерская и резет
  • 2 светодиода
  • 66 контактов на гребёнке, из них 55 контактов ввода-вывода
  • перемычка для измерения тока

Эта плата интересна в первую очередь своей дешевизной и применением процессора из младшего семейства. Ведь даже самый слабый процессор ST/ARM всё равно во много раз мощнее привычных AVR и PIC, а стоит даже дешевле. Более того, здесь есть модули CRC, аналоговые компараторы и контроллер сенсорных кнопок.

Скачать примеры для STM32F0Discovery.

Добавить комментарий

Закрыть меню