STM Урок 4. Библиотека HAL. STM32 CUBE MX. Светодиоды и кнопка



Урок 4

Библиотека HAL. STM32 CUBE MX. Светодиоды и кнопка

 

Сегодня мы познакомимся с библиотекой HAL. Данная библиотека, в отличие от SPL, широко используется и поддерживается.

Также для более комфортного использования данной библиотеки мы будем пользоваться программой для первоначальной настройки и генерации кода для среды программирования — STM32CubeMX.

Скачиваем STM32CubeMX с st.com (для этого нужно заполнить форму и ссылочка придет на электронную почту.

Устанавливаем его (может потребоваться установка Java)

Запускаем куб, выбираем контроллер.

Настраиваем порты PA0, PD12, PD13, PD14, PD15

Включаем шину rcc->HSE

Переходим в Clock Configuration, включаем HSE

Применим следующие настройки:

Input Frequency 8

HSE

/8

X 336

/2

PLLCLK

AHB Prescaler 1

APB1 Prescaler 8

APB2 Prescaler 8

 

 

А можно и так как на рисунке (нажмите на картинку для увеличения размера)

 

image00_0500

 

Следующая вкладка Configuration.

Смотрим тут GPIO и ничего там не трогаем

 

 

Дальше идём в меню Project -> Generate Code

Настраиваем Toolchain IDE – MDK-ARM V5

Задаем имя проекта и расположение

Жмем ОК

Если нужно загрузить библиотеки, то загружаем.

Смотрим функции для управления портами в STM32F4HAL_User_manual.pdf, найти который можно введя на st.com в строке поиска «STM32F4xx»

Функции находятся HAL GPIO Generic Driver –> GPIO Firmware driver API description -> IO operation functions. Щелкаем по ссылке нужной функции и смотрим ее описание.

 

 

Добавляем в бесконечный цикл код

 

                HAL_GPIO_TogglePin(GPIOD, GPIO_PIN_12);

                HAL_Delay(500);

                HAL_GPIO_TogglePin(GPIOD, GPIO_PIN_12);

                HAL_GPIO_TogglePin(GPIOD, GPIO_PIN_13);

                HAL_Delay(500);

                HAL_GPIO_TogglePin(GPIOD, GPIO_PIN_13);

                HAL_GPIO_TogglePin(GPIOD, GPIO_PIN_14);

                HAL_Delay(500);

                HAL_GPIO_TogglePin(GPIOD, GPIO_PIN_14);

                HAL_GPIO_TogglePin(GPIOD, GPIO_PIN_15);

                HAL_Delay(500);

                HAL_GPIO_TogglePin(GPIOD, GPIO_PIN_15);

 

Затем задействуем кнопку следующим образом меняя код

 

                if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0)==GPIO_PIN_SET)

                {

                        HAL_GPIO_TogglePin(GPIOD, GPIO_PIN_12);

                        HAL_Delay(500);

                        HAL_GPIO_TogglePin(GPIOD, GPIO_PIN_12);

                        HAL_GPIO_TogglePin(GPIOD, GPIO_PIN_13);

                        HAL_Delay(500);

                        HAL_GPIO_TogglePin(GPIOD, GPIO_PIN_13);

                        HAL_GPIO_TogglePin(GPIOD, GPIO_PIN_14);

                        HAL_Delay(500);

                        HAL_GPIO_TogglePin(GPIOD, GPIO_PIN_14);

                        HAL_GPIO_TogglePin(GPIOD, GPIO_PIN_15);

                        HAL_Delay(500);

                        HAL_GPIO_TogglePin(GPIOD, GPIO_PIN_15);

                }

                else HAL_GPIO_WritePin(GPIOD, GPIO_PIN_12|GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15, GPIO_PIN_RESET);

  }

 

Прошиваем контроллер и смотрим результат.

 

 

Предыдущий урок Программирование МК STM32 Следующий урок

 

 

Купить плату можно здесь STM32F4-DISCOVERY

 

Смотреть ВИДЕОУРОК

 

STM32 CUBE MX. Светодиоды и кнопка

33 комментария на “STM Урок 4. Библиотека HAL. STM32 CUBE MX. Светодиоды и кнопка
  1. alex323:

    Добрый день. Первым делом хочу сказать вам спасибо за ваш титанический труд. Написать такую уйму уроков за короткий срок — это нечто. Надеюсь, вы не бросите проект, как большинство авторов.

    Теперь "ближе к телу, как говорил Ги Де Мопассан" (с) 🙂

    Подскажите пожалуйста, почему при использовании HAL в Кейле в отладке не виден ни один периферийный блок. В SPL все доступно, а тут нет. Хоть в четвертом Кейле, хоть в пятом. Спасибо.

    • Вам также спасибо за оценку ресурса!
      С этим делом не заморачивался. Тем более не знаю, какой именно блок не виден. И кейл у Вас лицензионный или бесплатный?

      • Игорь:

        Не понятно зачем показывать «Хитрости» с копированием прошлого урока. Можно просто сохранить прошлый урок под другим именем в другой папке и модифицировать копию для следующего урока.

  2. alex323:

    Четвертый Кейл крякнутый, пятый бесплатный. Поначалу в четвертом на SPL кое-что пописывал, отладка работала. Как перешел на Cube, отладки не стало. Ну, думаю, ST сейчас все примеры для пятого Кейла пишет, надо его попробовать. Попробовал — то же самое. 

    Не видится вся периферия. Таймеры, GPIO и т. д. 

     

    • alex323:

      Вот написал "Поначалу в четвертом на SPL кое-что пописывал", а потом подумал, что надо было написать "пытался кое-что пописывать". 🙂 Ибо на Си раньше не писал, много встрчается всяких непонятных вещей, которые редко где описываются. 

      Еще хочу вас попросить писать в статьях чуть поподробнее, что откуда берется. И, если можно, в каждой статье начинать проект заново. Процессоры, которые вы используете, есть не у каждого, поэтому приходится переделывать код под свой процессор. А если проект потом снова переделывать под новый проект, то можно совсем запутаться.

      • Если такая просьба приобретёт массовый характер, то так и буду делать, хотя мне это будет раз в 50 сложнее.

        А пока в каждой последней части урока выкладываю полный проект, который можно скачать. Хотя я также был противником выкладывания проекта. Иначе люди сами перестают думать и пользуются готовым проектом. Видимо, скоро надо будет и это прекращать. Так как, оказывается, на всех не угодить. Здесь ещё встречались такие, которые просили в каждой части промежуточные проекты выкладывать. Но хорошо, что их очень мало.

        • Игорь:

          Эта просьба увеличилась на 1. Конечно немного подробнее можно объяснять. И проект выкладывать надо. Иначе вообще неинформативно у вас получится. А то «это берем здесь, это сюда, это на ум пошло…»
          , более инженерным языком нужно. Но пока и на том неплохо.

        • Игорь:

          где скачать STM32F4HAL_User_manual.pd?

  3. Михаил:

    Извините за дилетантский вопрос Где физически располагается файл main.h? Почему его видно в Кейле и не видно, если просто открыть папку и смотреть проводником Windows? Я скачал Keil 5  3 дня назад, до этого были AVRки, там AVR Studio да Proteus.

     

  4. Ollovein:

    У меня nucleo F401RE. Написал все как сказо в уроке, но светодиоды просто в итоге мигаю по очереди. Светодиоды как и кнопка вынесены на макетку. Единственное что тактировал от внутреннего так как кварца на плате нет. Можете подсказать в чем проблема?

    • Не знаю даже в чём проблема, но кварц у Вас есть. Настраивайте так же как и у меня генератор. В подобных платаг тактирование используется от генератора ST-Link, в конечном счёте от кварцевого резонатора, подключенного к ST-Link на 8МГц

  5. alximed:

    Всем привет. Подскажите что не так . Светодиоды моргают, в программе добовляю или убираю светодиоды программа работает. А вот кнопка не работает . При том что при компиляции ошибок нет . Все сделал как у Вас .

    • alximed:

      Всем привет . Разобрался в чем дело . У меня есть маленькая плата stm32f303 к ней я приобрел добавочную плату open32f3. А там стояла перемычка на замыкание. Убрал её и кнопка стала работать. Начало есть двигаюсь дальше .

  6. Иван:

    Как дрыгать ногой понятно, WritePin, TogglePin, ResetPin. А вот как сделать выбор ножки в цикле, нигде найти не могу. Допустим, что-то подобное:
    for(i=0; i<16; ++i)
    {
    HAL_GPIO_TogglePin(GPIOD, GPIO_PIN_i);
    HAL_Delay(500);
    }

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

    char i=0;
    char c=1;

    for(i=0; i<8; ++i)
    {
    HAL_GPIO_WritePin(GPIOA, c, GPIO_PIN_SET);
    HAL_Delay(100);
    HAL_GPIO_WritePin(GPIOA, c, GPIO_PIN_RESET);
    c=c*2;
    }

  7. Огромное спасибо за ваш труд.

  8. ElectronHD:

    Пожалуйста подскажите где взять библиотеку. 2)Почему исходный код под 103 стмку

    • 1) Все библиотеки подгрузятся из шаблонов при генерации проекта.
      2) Простите, перепутал, спасибо! Пока убрал исходник, со временем попробую воспроизвести урок, пересобрать и выложить.

  9. demetrodon:

    Здравствуйте, что делать если на моей отладочной плате нет кнопки? чем можно ее заменить?

  10. Андрей:

    Не очень понял, как именно нужно настроить порты PA0, PD12, PD13, PD14, PD15. Когда их выбираешь на схеме мк справа, там куча вариантов их использования

    • Выбираем обычный выход.

      • Андрей:

        Спасибо за ответ. Я в итоге открыл видео и сделал все по примеру, но странная штука: когда я начинаю генерировать код, вываливается окно:

        «the code is successfully generated under but mdk-arm v5project generation have a problem»

        Если попробовать его перегенерировать, то окно будет уже с успешным завершением.
        При попытке сбилдить проект в uVision, компиляция валится с ошибкой

        «error: L6236E: No section matches selector — no section to be FIRST/LAST.»

        Я погуглил ее и вышел на то, что в проекте необходимо подключить Device-Startup.
        Но если попробовать добавить этот файл, то валится 8 ошибок о множественном объявлении, например:

        Error: L6200E: Symbol SystemInit multiply defined (by system_stm32f4xx_1.o and system_stm32f4xx.o).

        Как я понял, надо где-то убрать какие-то инклюды, но вот дальше так и не понял, где именно.
        Вообще, не будете ли вы против, если я свяжусь с вами как-то иначе, нежели через комментарии?
        Мои контактные данные:
        email: voultboy@yandex.ru
        vk: vk.com/voulty
        telegram: @hepoh

  11. Тимур:

    На 20-й минуте, вы добавляете файл main.h из старого проекта в новый проект, а именно в папку Inc. Но в ней у меня уже есть этот файл весом 4КБ. Его заменить нужно, чтобы дальше выполнять урок?

    • Нет, теперь немного не так. Если есть main.h, то его лучше не трогать, а добавить в него необходимые файлы из старого проекта, и в следующий раз при создании проекта из прошлого не перезаписывать main.h.

      • Тимур:

        Я так и сделал, добавил в него необходимые вещи согласно уроку. Но проект не собирается, он не может определить переменную tim6_counter.
        Поэтому я вернул main.h в исходное состояние, и добавил в папку Inc файл maink.h (добавил букву всего лишь) и внёс все то, что вы вписывали в своем уроке в файл main.h (мой maink.h соответствовал вашему main.h), после этого все заработало.
        Вопрос в том, не повлияет ли это на дальнейшие уроки, я к ним еще не приступал?

        приведу, внизу содержимое моего main.h, который я не стал трогать (может в него нельзя что-либо вносить)…

        * Define to prevent recursive inclusion ————————————-*/
        #ifndef __MAIN_H__
        #define __MAIN_H__

        /* Includes ——————————————————————*/

        /* USER CODE BEGIN Includes */

        /* USER CODE END Includes */

        /* Private define ————————————————————*/

        /* ########################## Assert Selection ############################## */
        /**
        * @brief Uncomment the line below to expanse the «assert_param» macro in the
        * HAL drivers code
        */
        /* #define USE_FULL_ASSERT 1U */

        /* USER CODE BEGIN Private defines */

        /* USER CODE END Private defines */

        #ifdef __cplusplus
        extern «C» {
        #endif
        void _Error_Handler(char *, int);

        #define Error_Handler() _Error_Handler(__FILE__, __LINE__)
        #ifdef __cplusplus
        }
        #endif

        #endif /* __MAIN_H__ */

  12. Peotr:

    Здравствуйте!
    Начинаю работать с STM32, решил для простоты использовать что-то готовое: NUCLEO-L452RE-P. Задался создать примитив, что-то вроде мигания встроенного светодиода от встроенной кнопки. Запустил CubeMX, всё по мануалам, но при команде GENERATE CODE получил по фейсу следующее:
    «The Firmware Package (STM32Cube BW_L4 V1.14.0) or one of its dependencies required by the Project is not available in your STM32CubeMX Repository. Do you want to download this now?»
    Соглашаюсь на доунлад. Но дальше опять в торец:
    «Error downloading the following files: stm32cube_fw_v1140.zip (Not available). For unavailable files, you can load them manually with the «From Local» button».
    Где искать эту секретную локаль буттон?
    Что посоветуете? Где спрятан выход, и как его найти?
    Спасибо

  13. Александр:

    Если ещё актуально, то посмотрите в следующей папке:
    «C:\Users\»Имя пользователя»\STM32Cube\Repository»
    Там должен быть скачанный архив (с именем что-то вроде «STM32Cube_FW_F0_V1.11.0»), который система не смогла разархивировать. Разархивируйте его вручную. Папка с библиотеками должна иметь имя «STM32Cube_FW_F0_V1.11.0».

  14. Тим:

    У вас для задержки в 500 мс вызывается HAL_Delay(500), а у меня приходится делать примерно HAL_Delay(128000) для той же задержки. При частоте SYSCLK 216 МГц. Почему так может быть, не подскажете?

  15. Андрей:

    Добрый день поскажите возможно ли в КубМХ поменять процессор с тем же колличеством ног но разной памятью в готовом проекте. Допустим STM32f103c8 на STM32f103cb или нужно создавать новый проект и туда переносить код.

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

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

*