Старт с STM32F3Discovery.

Итак, приступаем к работе с микроконтроллерами STM32F3. И в этой статье соберем все, что понадобится для начала работы с отладочной платой STM32F3Discovery, ну и небольшой примерчик, конечно же, набросаем 😉

В качестве среды разработки я буду использовать Keil, как, собственно, и для всех остальных контроллеров от ST. Просто он мне больше нравится )
Среда разработки Keil

Так что запускаем Keil и создаем новый проект. Для этого подойдет любая из инструкций с нашего сайта, поскольку все отличие будет только в выборе используемого микроконтроллера (выбираем STM32F303VC). Вот статьи по этой теме:

Создание проекта для STM32F10x
Создание проекта для STM32F4

Ну вот, проект создан, теперь необходимо добавить в него все библиотеки, которые мы будем использовать. И это, в первую очередь, библиотека CMSIS для микроконтроллеров STM32F3 и Standard Peripheral Library опять же для STM32F3. Скачать все библиотеки можно и нужно прямо сейчас 😉

Скачать CMSIS для STM32F3

Скачать SPL для STM32F3

Не забываем в настройках проекта на вкладке C/C++ в поле define указать USE_STDPERIPH_DRIVER — это нужно для использования библиотеки SPL в нашем проекте.

Казалось бы, все необходимые файлы на месте, но на самом деле это не совсем так. При сборке проекта Keil заругается из-за отсутствия файла stm32f30x_conf.h. Поэтому скачиваем его отдельно и добавляем в наш проект:

Скачать файл stm32f30x_conf.h

Вот, теперь все готово!

Давайте создадим теперь небольшой простой пример — будем по традиции зажигать светодиоды, которых на отладочной плате STM32F3Discovery целых 8 штук — 2 красных, 2 оранжевых, 2 зеленых и 2 синих. Давайте будем зажигать попарно светодиоды одинакового цвета, и для начала надо выяснить к каким выводам контроллера они подключены. Лезем в документацию на STM32F3Discovery и почти сразу находим то, что надо:

STM32F3Discovery

Итак, можно приступать к написанию кода. Подключаем все необходимые файлы:

/******************************************************/
#include "stm32f30x_gpio.h"
#include "stm32f30x_rcc.h"
#include "stm32f30x.h"
 
 
 
/******************************************************/

Объявим несколько переменных:

/******************************************************/
#define DELAY_TIME	    		60000
 
 
 
/******************************************************/
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);
	simpleDelay(DELAY_TIME);
	simpleDelay(DELAY_TIME);
 
	GPIO_ResetBits(GPIOE, GPIO_Pin_9 | GPIO_Pin_13);
	GPIO_SetBits(GPIOE, GPIO_Pin_10 | GPIO_Pin_14);
	simpleDelay(DELAY_TIME);
	simpleDelay(DELAY_TIME);
	simpleDelay(DELAY_TIME);
 
	GPIO_ResetBits(GPIOE, GPIO_Pin_10 | GPIO_Pin_14);
        GPIO_SetBits(GPIOE, GPIO_Pin_15 | GPIO_Pin_11);
	simpleDelay(DELAY_TIME);
	simpleDelay(DELAY_TIME);
	simpleDelay(DELAY_TIME);
 
	GPIO_ResetBits(GPIOE, GPIO_Pin_15 | GPIO_Pin_11);
	GPIO_SetBits(GPIOE, GPIO_Pin_12 | GPIO_Pin_8);
	simpleDelay(DELAY_TIME);	
	simpleDelay(DELAY_TIME);		
	simpleDelay(DELAY_TIME);
    }
}
 
 
 
/******************************************************/

Собираем проект, осталось лишь залить прошивку в контроллер! Для этого идем в пункт меню Flash->Configure Flash Tools:

Настройка Keil для работы с STM32F3

В появившемся окне выбираем ST-Link Debugger и нажимаем на кнопку Settings. Откроется еще одно окно, жмем Add и выбираем STM32F3xx Flash:

Настройка ST-Link

В этом же окне переходим на вкладку Debug и в поле Port выбираем SW. На этом настройка ST-Link закончена )

Теперь прямо из Keil’а, нажав на кнопку Load мы можем «засунуть» нашу программку в микроконтроллер! Что мы, собственно, и делаем ) В результате на плате STM32F3Discovery видим активное перемигивание светодиодов, то есть наша программа работает правильно. На этом на сегодня все, скоро продолжим работу с этой замечательной платой 😉

Понравилась статья? Поделись с друзьями!

Старт с STM32F3Discovery.: 29 комментариев
  1. А можно список файлов которые надо подключить ???
    а то я добавил все з примера про stm32f4 но для f3 и у меня проект не билдаетса — Error: C4065E

  2. Если пишем
    #include «stm32f30x.h»
    и указываем USE_STDPERIPH_DRIVER в дефайне,
    тогда нет необходимости писать
    #include «stm32f30x_gpio.h»
    #include «stm32f30x_rcc.h»
    так как это прописано в stm32f30x_conf.h.

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

  3. Добрый день!
    При настройке программатора, в окне Cortex-M TargetDriver Setup на вкладке Debug у меня заблокировано поле выбора Port. Что делать?

  4. И в моем случае пришлось добавлять system_stm32f10x.c из \Keil\ARM\Startup\ST\STM32F10x и менять все настройки из STM32F3-Discovery_FW_V1.1.0

  5. Я уже с этими файлами 3 вечера не могу никак разобраться.
    .\F303Guaranted.axf: Error: L6218E: Undefined symbol main (referred from rtentry2.o). Даже попробовал из SPL всё запхнуть. Попробовал как в скрине выше — не хватает STM32F3.c Как с последней картинки — тоже самое вышибает.
    USE_STDPERIPH_DRIVER прописан.

  6. можно поподробнее?
    Только в даташиты не отправляйте, я тут как бы ещё на самом первом уроке запнулся, хочется подставить то, что существует в реальном железе и под рукой. А сам лично main реализован в STM32F3.c , или его надо делать и подкладывать ?
    Когда гуглил, написали вариант воспользоваться готовой библиотекой (.lib), они вообще существуют?
    Попробовал вложить в uVision одну в качестве всего (Там пару файлов .lib есть)- не получилось.
    Распаковываться тот же .lib не хочет.

    P.S. У меня есть и MDK 5.0 , там при выборе контроллера, кажись, сразу можно и исходники подключать. Доводилось ли копаться в пятой версии? Был бы очень рад узнать что да как; может если не в 4-ой, то в 5-ой срастётся…

    • Не, 5 не пробовал.
      В целом алгоритм такой — сначала создаем проект пустой, выбираем нужный контроллер. Добавляем все файлы (CMSIS, SPL, startup), прописываем в настройках пути ко всем этим файлам. Затем создаем новый пустой файл, пишем в нем функцию main(), добавляем его в дерево проекта, путь к нему прописываем в настройки. И должно работать

  7. «Затем создаем новый пустой файл, пишем в нем функцию main(),
    Что там писать, если в «STM32 С нуля» в статье ничего о main не говорится….

    «Добавляем его в дерево проекта, путь к нему прописываем в настройки. И должно работать»

    Как Main добавить в дерево проекта?
    то что путь прописывается там где и все пути понятно.

    Заранее Спасибо!

    • «Затем создаем новый пустой файл, пишем в нем функцию main(), добавляем его в дерево проекта» — добавляем ЕГО (файл, содержащий main())

    • Из статьи «STM32 с нуля» :
      Создадим пустой файл .c:

      File -> New

      Появляется пустой файл, жмем File -> Save As и обзываем наш первый файл test.c.
      В файл test.c закинем следующий тестовый код, который абсолютно ничего не делает.

      #include «stm32f10x.h»
      #include «stm32f10x_rcc.h»
      int main()
      {
      while(1);
      }

    • Вот из статьи про F4:
      «Идем в File->New, в Keil’е открывается пустой файл, жмем File->Save as и сохраняем его под именем test.c, например. Не забываем при сохранении указать расширение файла (.c). Файл создали, отлично, но надо его еще и в проект наш добавить. Ну, собственно, в этом ничего сложного нету 😉 В этот файл запишем тестовую пустую программу:

      /*******************************************************************/
      #include «stm32f4xx.h»
      #include «stm32f4xx_rcc.h»
      #include «stm32f4xx_gpio.h»

      /*******************************************************************/
      int main()
      {
      while(1)
      {
      __NOP();
      }
      }

      /*******************************************************************/»

  8. Помогите пожалуйста. Появляется ошибка в Keil 5 файл main.c : unknown type name ‘GPIO_InitTypeDef’ при объявлений переменных (в строке GPIO_InitTypeDef gpio;)

  9. Здравствуйте поделитесь функцией delay для STM32 F303 реализованной на таймере. Спасибо.

  10. Подскажите пожалуйста в PIC и Atmel-овских контроллерах задержка осуществляется функцией delay_ms(); А есть ли этих контроллерах нечто подобное вместо:
    void simpleDelay(unsigned int delayTime)
    {
    for (i = 0; i < delayTime; i++);
    }

    • Надо проверить тактирование в первую очередь, может в коде какая-нибудь мелкая опечатка..

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

Ваш e-mail не будет опубликован. Обязательные поля помечены *