Итак, приступаем к работе с микроконтроллерами STM32F3. И в этой статье соберем все, что понадобится для начала работы с отладочной платой STM32F3Discovery, ну и небольшой примерчик, конечно же, набросаем.
Время традиционной вставки: поскольку компания STMicroelectronics прекратила поддержку библиотеки SPL, которая использовалась в этом курсе, я создал новый, посвященный работе уже с новыми инструментами, так что буду рад видеть вас там - STM32CubeMx. Кроме того, вот глобальная рубрика по STM32, а также статья на смежную тему из нового курса: STM32. Быстрый старт с STM32CubeMx.
В качестве среды разработки я буду использовать Keil, как, собственно, и для всех остальных контроллеров от ST. Просто потому что он мне больше нравится ) Так что запускаем Keil и создаем новый проект. Для этого подойдет любая из инструкций с нашего сайта, поскольку все отличие будет только в выборе используемого микроконтроллера (выбираем STM32F303VC). Вот статьи по этой теме:
Ну вот, проект создан, теперь необходимо добавить в него все библиотеки, которые мы будем использовать. И это, в первую очередь, библиотека CMSIS для микроконтроллеров STM32F3 и SPL опять же для STM32F3. Скачать все библиотеки можно и нужно прямо сейчас:
Не забываем в настройках проекта на вкладке C/C++ в поле define указать USE_STDPERIPH_DRIVER - это нужно для использования SPL в проекте.
Казалось бы, все необходимые файлы на месте, но на самом деле это не совсем так. При сборке проекта Keil заругается из-за отсутствия файла stm32f30x_conf.h. Поэтому скачиваем его отдельно и добавляем в наш проект:
Вот теперь все готово!
Давайте создадим теперь небольшой простой пример - будем по традиции зажигать светодиоды, которых на отладочной плате STM32F3Discovery целых 8 штук - 2 красных, 2 оранжевых, 2 зеленых и 2 синих. Давайте будем зажигать попарно светодиоды одинакового цвета, и для начала надо выяснить к каким выводам контроллера они подключены. Лезем в документацию на STM32F3Discovery и почти сразу находим то, что надо:
Итак, можно приступать к написанию кода. Подключаем все необходимые файлы:
/***************************************************************************************/ #include "stm32f30x_gpio.h" #include "stm32f30x_rcc.h" #include "stm32f30x.h" /***************************************************************************************/
Объявим несколько переменных:
/***************************************************************************************/ #define DELAY_TIME 180000 /***************************************************************************************/ GPIO_InitTypeDef gpio; unsigned int i; /***************************************************************************************/
Нам понадобится вспомогательная функция для реализации задержки. Пусть это будет просто пустой цикл for(), чтобы не перегружать пример. Вообще для этого следует всегда использовать таймеры:
/***************************************************************************************/ void simpleDelay(unsigned int delayTime) { for (i = 0; i < delayTime; i++); } /***************************************************************************************/
Как вы помните, для использования любой периферии контроллеров STM32 необходимо произвести ее инициализацию и включить тактирование. Этим и займемся:
/***************************************************************************************/ void initAll() { RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOE, ENABLE); gpio.GPIO_Mode = GPIO_Mode_OUT; gpio.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_8 | GPIO_Pin_10 | GPIO_Pin_15 | GPIO_Pin_11 | GPIO_Pin_14 | GPIO_Pin_12 | GPIO_Pin_13; GPIO_Init(GPIOE, &gpio); } /***************************************************************************************/
Тут мы просто включили тактирование GPIOE и настроили все ножки контроллера, к которым подключены светодиоды на работу в качестве выхода. Все просто и понятно )
В функции main() мы вызовем нашу функцию инициализации и в цикле while(1) будем зажигать светодиоды одного цвета, затем некоторое время крутиться в функции задержки, потом гасить и снова зажигать диоды, но уже другого цвета. И так до бесконечности:
/***************************************************************************************/ int main() { initAll(); while(1) { GPIO_ResetBits(GPIOE, GPIO_Pin_12 | GPIO_Pin_8); GPIO_SetBits(GPIOE, GPIO_Pin_9 | GPIO_Pin_13); simpleDelay(DELAY_TIME); GPIO_ResetBits(GPIOE, GPIO_Pin_9 | GPIO_Pin_13); GPIO_SetBits(GPIOE, GPIO_Pin_10 | GPIO_Pin_14); simpleDelay(DELAY_TIME); GPIO_ResetBits(GPIOE, GPIO_Pin_10 | GPIO_Pin_14); GPIO_SetBits(GPIOE, GPIO_Pin_15 | GPIO_Pin_11); simpleDelay(DELAY_TIME); GPIO_ResetBits(GPIOE, GPIO_Pin_15 | GPIO_Pin_11); GPIO_SetBits(GPIOE, GPIO_Pin_12 | GPIO_Pin_8); simpleDelay(DELAY_TIME); } } /***************************************************************************************/
Собираем проект, осталось лишь залить прошивку в контроллер. Для этого идем в пункт меню Flash->Configure Flash Tools:
В появившемся окне выбираем ST-Link Debugger и нажимаем на кнопку Settings. Откроется еще одно окно, жмем Add и выбираем STM32F3xx Flash:
В этом же окне переходим на вкладку Debug и в поле Port выбираем SW. На этом настройка ST-Link закончена.
Теперь прямо из Keil'а, нажав на кнопку Load мы можем прошить нашу программку в микроконтроллер. Что мы, собственно, и делаем ) В результате на плате STM32F3Discovery видим активное перемигивание светодиодов, то есть наша программа работает правильно. На этом на сегодня все, скоро продолжим работу с этой платой!