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

В одной из статей (вот), кстати обязательно ее посмотрите, было разобрано подключение и прошивка самой, наверное, популярной и доступной отладочной платы STM32VLDiscovery. Я вот подумал и решил, что было бы не лишним описать создание какого-нибудь простенького проекта для этой платки, другими словами описать процесс быстрого старта. Ну что-нибудь совсем банальное, вроде мигания диодом. В общем, приступим!

Не будем навешивать никаких внешних элементов, воспользуемся тем, что уже есть на плате. А есть там пара кнопок, да пара диодов, с этим давайте и поработаем. Для быстрого старта с STM32VLDiscovery подойдет как нельзя лучше 🙂

Итак, имеем: большую синюю кнопку и два светодиода – синий и зеленый. Документация нам говорит, что зеленый светодиод подключен к PC9, синий к PC8, а кнопка висит на PA0. Давайте так: если кнопка нажата, то горит синий диод, если не нажата, то горит зеленый. Приступим к реализации!

Запускаем Keil, создаем новый проект и подключаем библиотеки – CMSIS и файлы из Standard Peripheral Library для работы c тактированием и портами. Об этом уже написано ранее (вот ссылка), так что останавливаться не этом не будем. Не забываем в Keil’е выбрать наш контроллер:

Создание проекта в Keil

Сразу же, пока не забыли, открываем файл stm32f10x.h и находим строки:

#if !defined (STM32F10X_LD) && !defined (STM32F10X_LD_VL) && !defined (STM32F10X_MD) && !defined (STM32F10X_MD_VL) && !defined (STM32F10X_HD) && !defined (STM32F10X_XL) && !defined (STM32F10X_CL) 
	/* #define STM32F10X_LD */
	/* #define STM32F10X_LD_VL */
	/* #define STM32F10X_MD */
	#define STM32F10X_MD_VL
	/* #define STM32F10X_HD */
	/* #define STM32F10X_XL */
	/* #define STM32F10X_CL */
#endif

Тут должна быть раскомментирована строка #define STM32F10X_MD_VL и закомментированы все остальные. Теперь подключаем необходимые файлы и объявляем переменные:

/***************************************************************************************/
#include "stm32f10x.h"
#include "stm32f10x_rcc.h"
#include "stm32f10x_gpio.h"
#include "stm32f10x_conf.h"


/***************************************************************************************/
GPIO_InitTypeDef port;
uint8_t buttonState;


/***************************************************************************************/

Надо настроить порты, нам нужны PC9 и PC8 – выходы для диодов и вход PA0 для кнопки. Пусть вся инициализация будет в отдельной функции:

/***************************************************************************************/
void initialization()
{
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
	port.GPIO_Mode = GPIO_Mode_Out_PP;
	port.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9;
	port.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOC, &port);
	port.GPIO_Mode = GPIO_Mode_IPD;
	port.GPIO_Pin = GPIO_Pin_0;
	port.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &port);
}


/***************************************************************************************/

Итак, тут мы сначала включаем тактирование портов GPIOA и GPIOC, ну и, собственно, настраиваем нужные нам пины нужным нам образом. В функции main() вызываем функцию инициализации и зажигаем зеленый диод (ножка PC9). Пусть по умолчанию он у нас горит:

initialization();
GPIO_SetBits(GPIOC, GPIO_Pin_9);

А дальше привычный вечный цикл:

while(1)
{
	buttonState = GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0);
	
	if(buttonState == 1)
	{
		GPIO_SetBits(GPIOC, GPIO_Pin_8);
		GPIO_ResetBits(GPIOC, GPIO_Pin_9);
	}
	else
	{
		GPIO_ResetBits(GPIOC, GPIO_Pin_8);
		GPIO_SetBits(GPIOC, GPIO_Pin_9);
	}
}

Для начала опрашиваем кнопку и сохраняем ее состояние в переменной buttonState. Если кнопка нажата – зажигаем синий и гасим зеленый:

GPIO_SetBits(GPIOC, GPIO_Pin_8);
GPIO_ResetBits(GPIOC, GPIO_Pin_9);

Если не нажата, то наоборот:

GPIO_ResetBits(GPIOC, GPIO_Pin_8);
GPIO_SetBits(GPIOC, GPIO_Pin_9);

Настраиваем Keil, чтобы прошить наш контроллер (это не нужно для тех, кто шьет утилитой от ST) и жмем “Download”. Бегают строчки, микроконтроллер прошивается…

Когда прошивка завершилась, нажимаем Reset на плате (большая черная кнопка) и видим, что загорается зеленый светодиод, нажимаем синюю кнопку – зеленый гаснет, синий загорается. Собственно этот тот результат, который мы и хотели получить, то есть все отлично, все работает 🙂 До скорых встреч, в будущем мы еще не раз вернемся к этой плате!

Поделиться!

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

Помоогите плииз, не могу уйти в прерывание по DMA_Channel1

Вот ссылка на mail загрузчик
http://files.mail.ru/A2FE3FEF09C74A1EA501EC8B149D87BC тут проект main.c

27.goad
7 лет назад

привет. где функция main в этой программе?

27.goad
7 лет назад

вопрос снят

27.goad
7 лет назад

27.goad
7 лет назад

а отчего инициализируется шина APB Periph когда порты GPIO в сидят на AHB Periph ?

27.goad
7 лет назад

непойму тогда. пытаюсь запустить на плате вылетает куча ошибок. в файле stm32f0xx_rcc.c английским по белому написано

@param RCC_APB2Periph: specifies the APB2 peripheral to gates its clock.
* This parameter can be any combination of the following values:
* @arg RCC_APB2Periph_SYSCFG: SYSCFG clock
* @arg RCC_APB2Periph_ADC1: ADC1 clock
и в том же духе

а для ahb

RCC_AHBPeriph: specifies the AHB peripheral to reset.
* This parameter can be any combination of the following values:
* @arg RCC_AHBPeriph_GPIOA: GPIOA clock
* @arg RCC_AHBPeriph_GPIOB: GPIOB clock

курить еще долго видимо

27.goad
7 лет назад

на моей плате stm32f051r8 и плата называется stm32f0-discovery

Leo
Leo
6 лет назад

Помогите разобраться пожалуйста. Первый раз собираю проект. Выдает в конце ошибку в виде (.\test.axf: Error: L6218E: Undefined symbol GPIO_Init (referred from test.o).) Вроде как не может найти соответствующих строк в stm32f10x_gpio.h хотя по факту они там есть, или я чего не так сделал?

Leo
Leo
6 лет назад

Спасибо!!! Я по не опытности не включил файл stm32f10x_gpio.с Добавил его и все заработало и светодиоды засветились как надо 🙂
Еще раз большое спасибо.

Богдан
Богдан
6 лет назад

Привет )
смотри че пишет:

Build target ‘STM32’
compiling 1st_proj.c…
1st_proj.c(51): warning: #1-D: last line of file ends without a newline
}
linking…
.\1st_proj.axf: Error: L6218E: Undefined symbol GPIO_Init (referred from 1st_proj.o).
.\1st_proj.axf: Error: L6218E: Undefined symbol GPIO_ReadInputDataBit (referred from 1st_proj.o).
.\1st_proj.axf: Error: L6218E: Undefined symbol GPIO_ResetBits (referred from 1st_proj.o).
.\1st_proj.axf: Error: L6218E: Undefined symbol GPIO_SetBits (referred from 1st_proj.o).
Not enough information to list image symbols.
Finished: 1 information, 0 warning and 4 error messages.
“.\1st_proj.axf” – 4 Error(s), 1 Warning(s).
Target not created

Что я не так сделал ?

Богдан
Богдан
6 лет назад

stm32f10x_gpio.с в SPL еще добавил, проект собрался )

Богдан
Богдан
6 лет назад

автору спасибо ))
вот первая прога под STM32 заработала, фундамент заложен.

Николай
Николай
6 лет назад

Здравствуйте. Подскажите пожалуйста, что нужно сделать. Проблема така: подключаю stm32F100 discovery к компьютеру, а он не видит ее. Т.е. не распознает как флешку, пишет – “USB-устройство не опознано” и ST-LINK пишет – “No ST-LINK detected”. Получается, вообще компьтер плату не читает.
Слышал, что в таких случаях нужно путем нажатия кнопок на плате перезагрузить ее, сбросить. Но какая это комбинация – не извесно

Николай
Николай
6 лет назад

Все решилось. накрылся защитный диод на плате

Максим
Максим
5 лет назад

Как мне повторить программу для stm32f051, что изменится?

Иван
Иван
4 лет назад

День добрый что означает эта запись после инклудов GPIO_InitTypeDef port;

Иван
Иван
Reply to  Aveal
4 лет назад

А где об этом почитать? Вообще где брать о таких “штуках” информацию?

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

Profile Profile Profile Profile Profile
Vkontakte
Twitter

Язык сайта

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

© 2013-2020 MicroTechnics.ru