В одной из статей (вот), кстати обязательно ее посмотрите, было разобрано подключение и прошивка самой, наверное, популярной и доступной отладочной платы STM32VLDiscovery. Я вот подумал и решил, что было бы не лишним описать создание какого-нибудь простенького проекта для этой платки, другими словами описать процесс быстрого старта. Ну что-нибудь совсем банальное, вроде мигания диодом. В общем, приступим!
Не будем навешивать никаких внешних элементов, воспользуемся тем, что уже есть на плате. А есть там пара кнопок, да пара диодов, с этим давайте и поработаем. Для быстрого старта с STM32VLDiscovery подойдет как нельзя лучше.
Итак, имеем: большую синюю кнопку и два светодиода – синий и зеленый. Документация нам говорит, что зеленый светодиод подключен к PC9, синий к PC8, а кнопка висит на PA0. Давайте так: если кнопка нажата, то горит синий диод, если не нажата, то горит зеленый.
Время традиционной вставки: поскольку компания STMicroelectronics прекратила поддержку библиотеки SPL, которая использовалась в этом курсе, я создал новый, посвященный работе уже с новыми инструментами, так что буду рад видеть вас там - STM32CubeMx. Кроме того, вот глобальная рубрика по STM32.
Запускаем Keil, создаем новый проект и подключаем библиотеки – CMSIS и файлы из Standard Peripheral Library для работы c тактированием и портами. Об этом уже написано ранее (вот ссылка), так что останавливаться не этом не будем. Не забываем в 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 на плате (большая черная кнопка) и видим, что загорается зеленый светодиод, нажимаем синюю кнопку – зеленый гаснет, синий загорается. Собственно этот тот результат, который мы и хотели получить, то есть все отлично, все работает )
Помоогите плииз, не могу уйти в прерывание по DMA_Channel1
Вот ссылка на mail загрузчик
http://files.mail.ru/A2FE3FEF09C74A1EA501EC8B149D87BC тут проект main.c
Глобального разрешения прерываний вроде бы нету - __enable_irq ();
привет. где функция main в этой программе?
Тут написано все, что в ней должно быть, подразумевается, что все ее сами оформят ) Вот после этих слов идет тело main(): "В функции main() вызываем функцию инициализации и зажигаем зеленый диод (ножка PC9). Пусть по дефолту он у нас горит"
вопрос снят
...
а отчего инициализируется шина APB Periph когда порты GPIO в сидят на AHB Periph ?
Да не, они на APB2 висят
непойму тогда. пытаюсь запустить на плате вылетает куча ошибок. в файле 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
курить еще долго видимо
хм.. stm32f0xx_rcc.c? там на дискавери - stm32f100 какой то, SPL, соответственно, для stm32f10x нужна
на моей плате stm32f051r8 и плата называется stm32f0-discovery
аа, ну так пример то для другой платы)
Помогите разобраться пожалуйста. Первый раз собираю проект. Выдает в конце ошибку в виде (.\test.axf: Error: L6218E: Undefined symbol GPIO_Init (referred from test.o).) Вроде как не может найти соответствующих строк в stm32f10x_gpio.h хотя по факту они там есть, или я чего не так сделал?
Скорее всего файлы stm32f10x_gpio.h и stm32f10x_gpio.с в проект не включены, или пути к ним не прописаны в настройках.
Спасибо!!! Я по не опытности не включил файл stm32f10x_gpio.с Добавил его и все заработало и светодиоды засветились как надо 🙂
Еще раз большое спасибо.
=)
Привет )
смотри че пишет:
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
Что я не так сделал ?
stm32f10x_gpio.с в SPL еще добавил, проект собрался )
автору спасибо ))
вот первая прога под STM32 заработала, фундамент заложен.
Не успел даже ответить ничего =)
Здравствуйте. Подскажите пожалуйста, что нужно сделать. Проблема така: подключаю stm32F100 discovery к компьютеру, а он не видит ее. Т.е. не распознает как флешку, пишет - "USB-устройство не опознано" и ST-LINK пишет - "No ST-LINK detected". Получается, вообще компьтер плату не читает.
Слышал, что в таких случаях нужно путем нажатия кнопок на плате перезагрузить ее, сбросить. Но какая это комбинация - не извесно
Все решилось. накрылся защитный диод на плате
Как мне повторить программу для stm32f051, что изменится?
Надо в SPL посмотреть какие есть отличия от SPL для f10x и изменить в соответствии с ними.
День добрый что означает эта запись после инклудов GPIO_InitTypeDef port;
Объявление переменной port. А GPIO_InitTypeDef - это тип данных.
А где об этом почитать? Вообще где брать о таких "штуках" информацию?