Компания STMicroelectronics прекратила поддержку библиотеки SPL, которая использовалась в этом курсе. Поэтому я создал новую рубрику, посвященную работе уже с новыми инструментами, так что буду рад видеть вас там - STM32CubeMx. Также вот глобальная рубрика по STM32 - ссылка.
В одной из статей (вот), кстати обязательно ее посмотрите, было разобрано подключение и прошивка самой, наверное, популярной и доступной отладочной платы STM32VLDiscovery. Я вот подумал и решил, что было бы не лишним описать создание какого-нибудь простенького проекта для этой платки, другими словами описать процесс быстрого старта. Ну что-нибудь совсем банальное, вроде мигания диодом. В общем, приступим!
Не будем навешивать никаких внешних элементов, воспользуемся тем, что уже есть на плате. А есть там пара кнопок, да пара диодов, с этим давайте и поработаем. Для быстрого старта с STM32VLDiscovery подойдет как нельзя лучше.
Итак, имеем: большую синюю кнопку и два светодиода – синий и зеленый. Документация нам говорит, что зеленый светодиод подключен к PC9, синий к PC8, а кнопка висит на PA0. Давайте так: если кнопка нажата, то горит синий диод, если не нажата, то горит зеленый.
Запускаем 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 на плате (большая черная кнопка) и видим, что загорается зеленый светодиод, нажимаем синюю кнопку – зеленый гаснет, синий загорается. Собственно этот тот результат, который мы и хотели получить, то есть все отлично, все работает )