Top.Mail.Ru

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

Компания STMicroelectronics прекратила поддержку библиотеки SPL, которая использовалась в этом курсе. Поэтому я создал новую рубрику, посвященную работе уже с новыми инструментами, так что буду рад видеть вас там - STM32CubeMx. Также вот глобальная рубрика по STM32 - ссылка.

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

В качестве среды разработки я буду использовать 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 и почти сразу находим то, что надо:

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 комментариев
Старые
Новые
Межтекстовые Отзывы
Посмотреть все комментарии
Oleg
Oleg
9 лет назад

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

andries5
andries5
9 лет назад

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

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

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

lex
lex
8 лет назад

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

lex
lex
8 лет назад

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

Kingrai
8 лет назад

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

Kingrai
Ответ на комментарий  Kingrai
8 лет назад

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Slava
Slava
8 лет назад

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

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

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

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

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

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

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

29
0
Оставьте комментарий! Напишите, что думаете по поводу статьи.x