Быстрый старт с отладочной платой STM32F3Discovery.

Среда разработки Keil

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

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

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

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

Казалось бы, все необходимые файлы на месте, но на самом деле это не совсем так. При сборке проекта Keil заругается из-за отсутствия файла 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                                               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:

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

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

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

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

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

Поделиться!

Подписаться
Уведомление о
guest
29 Комментарий
старее
новее большинство голосов
Inline Feedbacks
View all comments
Oleg
Oleg
6 лет назад

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

andries5
andries5
6 лет назад

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

Evgeny-s
Evgeny-s
6 лет назад

очень хотелось бы продолжение данной темы…

lex
lex
6 лет назад

не могу найти в CMSIS файл stm32f30x_conf.h

lex
lex
6 лет назад

спасибо, я не внимательно прочитал статью, а там оказывается все есть:)

Kingrai
6 лет назад

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

Kingrai
Reply to  Kingrai
6 лет назад

Проблема решена)

Михаил
Михаил
6 лет назад

Поменял
#define DELAY_TIME 600000
и начали попарно гореть

Михаил
Михаил
6 лет назад

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

Михаил
Михаил
6 лет назад
Игорь
Игорь
6 лет назад

Я уже с этими файлами 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-ой срастётся…

Игорь
Игорь
6 лет назад

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

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

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

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

Slava
Slava
6 лет назад

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

Дмитрий
Дмитрий
6 лет назад

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

Паша
Паша
6 лет назад

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

Григорий
Григорий
5 лет назад

Странно, но диоды вовсе не горят….

Присоединяйтесь!

Profile Profile Profile Profile Profile
Vkontakte
Twitter

Язык сайта

Август 2020
Пн Вт Ср Чт Пт Сб Вс
 12
3456789
10111213141516
17181920212223
24252627282930
31  

© 2013-2020 MicroTechnics.ru