Быстрый старт с отладочной платой 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 реализованной на таймере. Спасибо.

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

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

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

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

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

Profile Profile Profile Profile Profile
Vkontakte
Twitter

Язык сайта

Июль 2020
Пн Вт Ср Чт Пт Сб Вс
« Июн    
 12345
6789101112
13141516171819
20212223242526
2728293031  

© 2013-2020 MicroTechnics.ru