Итак, приступаем к работе с микроконтроллерами 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 видим активное перемигивание светодиодов, то есть наша программа работает правильно. На этом на сегодня все, скоро продолжим работу с этой платой!
А можно список файлов которые надо подключить ???
а то я добавил все з примера про stm32f4 но для f3 и у меня проект не билдаетса - Error: C4065E
http://i023.radikal.ru/1309/69/0bbed67e74d3.png - вот все файлы
Если пишем
#include "stm32f30x.h"
и указываем USE_STDPERIPH_DRIVER в дефайне,
тогда нет необходимости писать
#include "stm32f30x_gpio.h"
#include "stm32f30x_rcc.h"
так как это прописано в stm32f30x_conf.h.
Я в conf.h все это закомментировал, там они все подряд подключаются, а мне в проект неохота все файлы добавлять каждый раз, но в принципе кому как удобнее)
очень хотелось бы продолжение данной темы...
Все будет, я просто улетал на неделю по работе )
не могу найти в CMSIS файл stm32f30x_conf.h
Вот он - http://rusfolder.com/38773502
спасибо, я не внимательно прочитал статью, а там оказывается все есть:)
=))
Добрый день!
При настройке программатора, в окне Cortex-M TargetDriver Setup на вкладке Debug у меня заблокировано поле выбора Port. Что делать?
Проблема решена)
Поменял
#define DELAY_TIME 600000
и начали попарно гореть
И в моем случае пришлось добавлять system_stm32f10x.c из \Keil\ARM\Startup\ST\STM32F10x и менять все настройки из STM32F3-Discovery_FW_V1.1.0
http://s017.radikal.ru/i431/1311/f1/52ca46e09d1d.png
Я уже с этими файлами 3 вечера не могу никак разобраться.
.\F303Guaranted.axf: Error: L6218E: Undefined symbol main (referred from rtentry2.o). Даже попробовал из SPL всё запхнуть. Попробовал как в скрине выше - не хватает STM32F3.c Как с последней картинки - тоже самое вышибает.
USE_STDPERIPH_DRIVER прописан.
Ну да, нету файла в котором была бы реализована функция main(), его надо создать
можно поподробнее?
Только в даташиты не отправляйте, я тут как бы ещё на самом первом уроке запнулся, хочется подставить то, что существует в реальном железе и под рукой. А сам лично main реализован в STM32F3.c , или его надо делать и подкладывать ?
Когда гуглил, написали вариант воспользоваться готовой библиотекой (.lib), они вообще существуют?
Попробовал вложить в uVision одну в качестве всего (Там пару файлов .lib есть)- не получилось.
Распаковываться тот же .lib не хочет.
P.S. У меня есть и MDK 5.0 , там при выборе контроллера, кажись, сразу можно и исходники подключать. Доводилось ли копаться в пятой версии? Был бы очень рад узнать что да как; может если не в 4-ой, то в 5-ой срастётся...
Не, 5 не пробовал.
В целом алгоритм такой - сначала создаем проект пустой, выбираем нужный контроллер. Добавляем все файлы (CMSIS, SPL, startup), прописываем в настройках пути ко всем этим файлам. Затем создаем новый пустой файл, пишем в нем функцию main(), добавляем его в дерево проекта, путь к нему прописываем в настройки. И должно работать
"Затем создаем новый пустой файл, пишем в нем функцию 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();
}
}
/*******************************************************************/"
Помогите пожалуйста. Появляется ошибка в Keil 5 файл main.c : unknown type name 'GPIO_InitTypeDef' при объявлений переменных (в строке GPIO_InitTypeDef gpio;)
Здравствуйте поделитесь функцией delay для STM32 F303 реализованной на таймере. Спасибо.
Подскажите пожалуйста в PIC и Atmel-овских контроллерах задержка осуществляется функцией delay_ms(); А есть ли этих контроллерах нечто подобное вместо:
void simpleDelay(unsigned int delayTime)
{
for (i = 0; i < delayTime; i++);
}
Да, самое оптимальное - на Systick таймере сделать задержку.
Странно, но диоды вовсе не горят....
Надо проверить тактирование в первую очередь, может в коде какая-нибудь мелкая опечатка..