Быстрый старт с STM32 Discovery.

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

Не будем навешивать никаких внешних элементов, воспользуемся тем, что уже есть на плате. А есть там пара кнопок, да пара диодов, с этим давайте и поработаем. Для быстрого старта с STM32 Discovery покатит 😉 Итак, имеем: большую синюю кнопку и два светодиода – синий и зеленый. Документация нам говорит, что зеленый светодиод подключен к 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 на плате (большая черная кнопка) и видим, что загорается зеленый светодиод, нажимаем синюю кнопку – зеленый гаснет, синий загорается. Собственно этот тот результат, который мы и хотели получить, то есть все отлично, все работает 😉 До скорых встреч, наверняка, еще не раз мы будем ковырять эту платку в будущем )

Понравилась статья? Поделись с друзьями!

Быстрый старт с STM32 Discovery.: 27 комментариев
    • Тут написано все, что в ней должно быть, подразумевается, что все ее сами оформят ) Вот после этих слов идет тело main(): «В функции main() вызываем функцию инициализации и зажигаем зеленый диод (ножка PC9). Пусть по дефолту он у нас горит»

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

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

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

    • Скорее всего файлы stm32f10x_gpio.h и stm32f10x_gpio.с в проект не включены, или пути к ним не прописаны в настройках.

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

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

    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

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

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

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

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *