Top.Mail.Ru

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

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

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

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

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

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

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

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

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

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

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

вопрос снят

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

...

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

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

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

непойму тогда. пытаюсь запустить на плате вылетает куча ошибок. в файле 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
27.goad
13 лет назад

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

Leo
Leo
12 лет назад

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

Leo
Leo
12 лет назад

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Иван
Иван
Ответ на комментарий  Aveal
10 лет назад

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

27
0
Оставьте комментарий! Напишите, что думаете по поводу статьи.x
Обзор конфиденциальности

На этом сайте используются файлы cookie, что позволяет нам обеспечить наилучшее качество обслуживания пользователей. Информация о файлах cookie хранится в вашем браузере и выполняет такие функции, как распознавание вас при возвращении на наш сайт и помощь нашей команде в понимании того, какие разделы сайта вы считаете наиболее интересными и полезными.