В прошлый раз мы осваивали создание нового проекта при помощи STM CubeMX первую часть можно найти здесь.
Для тех, кому лень перечитывать — закончилось все тем, что пустой проект успешно собрался.
![](https://habrastorage.org/webt/xu/oq/n_/xuoqn_ph-6skvfodoupmtub0jg0.jpeg)
В данной части напишем простейший пример Hello World на HAL, посмотрим как запускать и пользоваться отладчиком, ну и выясним, сколько же памяти кушает наша программа, которая в этой части будет написана на HAL.
За основу берем все тот же пустой проект, который инициализировали в прошлой части.
Для того, чтобы помигать светодиодом — нам необходимо придерживаться следующего алгоритма:
Для того чтобы выполнить первый пункт — нам необходимо указать компилятору к какому пину и порту подключен светодиод и какой функцией делать инверсию его состояния.
Сначала найдем, куда мы подключили светодиод.
В файле main.c, сразу после вступительных комментариев, которые нам любезно написала компания ST — имеется строчка, для подключения заголовочного файл main.h
![](https://habrastorage.org/webt/yi/wa/lk/yiwalkkgc4lydurug0jq1sze9dk.png)
Нажимаем на эту строку правой кнопкой и находим пункт Open Declaration
![](https://habrastorage.org/webt/xm/wo/-i/xmwo-i7wjz_a0alqjayeozngbu0.png)
Нажав на него — мы переместимся в файл main.h
Где найдем наши декларированные названия пинов и портов.
![](https://habrastorage.org/webt/zq/c3/vx/zqc3vxprbol_sfvqvxmk7ddn6mg.png)
Помните, в первой части при инициализации вывода светодиода PC13 — мы заполняли поле User Label и вписывали туда CLOCK_LED?
STM32CubeMX при генерации проекта учел наши пожелания и теперь вместо абстрактных GPIO_PIN_13 и GPIOC мы можем обращаться к своему светодиоду через более понятные для восприятия CLOCK_LED_Pin и CLOCK_LED_GPIO_Port.
С тем — чем будем управлять — разобрались.
Теперь ищем функцию, которая умеет менять состояние нашего GPIO на противоположное.
Для этого в дереве проекта в левой части экрана — находим файл:
Drivers -> STM32F1xx_HAL_Driver -> Inc -> stm32f1xx_hal_gpio.h
В нем очень много всего, но нам нужны описания функций, которые идут в блоке /* Exported functions */
Находим там функцию
void HAL_GPIO_TogglePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin);
Это как раз то, что нам необходимо.
![](https://habrastorage.org/webt/oz/2s/dt/oz2sdtylehcpjcezlkh1m_ku_re.png)
Чтобы светодиод мигал постоянно — необходимо разместить вызов нашей функции в main в теле основного цикла программы.
А для того, чтобы различать мигания — добавить после этого задержку при помощи функции HAL_Delay(500);
В данном случае задержка будет 500мс.
![](https://habrastorage.org/webt/kd/7w/yr/kd7wyrhrom3xaqhfdn1shvgdpvu.png)
Кстати, функция HAL_Delay описана так же в
Drivers -> STM32F1xx_HAL_Driver -> Inc
только в файле stm32f1xx_hal.h
То есть чтобы помигать светодиодом — нам потребовалось написать всего 2 строчки кода.
Если мы сделали все правильно — можно попробовать запустить отладчик и посмотреть как выполняется программа.
![](https://habrastorage.org/webt/wt/kl/jm/wtkljm9yczdbqjgl3qogmbkexzm.png)
![](https://habrastorage.org/webt/2i/5y/of/2i5yofnug7lsqn45tpyprohhg2q.png)
Перемещаться по коду программы можно при помощи кнопок F5 и F6
При этом кнопка F6 шагает только по вызовам функций, а кнопка F5 позволяет зайти в вызываемую функцию и посмотреть что же происходит внутри.
![](https://habrastorage.org/webt/li/ri/2s/liri2sqfgk_ha0a6ygqwqc4d9u4.gif)
Единственное, если вы не хотите наловить глюков при отладке — советую отключить оптимизацию. Делается это через меню Project -> Properties
Значение Optimization Level необходимо установить в None(-O0)
![](https://habrastorage.org/webt/z1/8w/ai/z18waicrgoc6t9s3ytb6mv22fig.png)
После остановки отладки — контроллер перезапустит код еще раз и будет выполнять его циклически.
По итогу должна получится примерно такая картина
![](https://habrastorage.org/webt/gj/ku/x7/gjkux7d4y-q_xdxjyqbrfhzfmpo.gif)
Подведем итоги
Использование HAL позволило реализовать данную задачу путем написания всего 2-х строчек кода.
Но за упрощение работы пришлось заплатить памятью
![](https://habrastorage.org/webt/xj/mw/fa/xjmwfaw-cwgg-7fdcchrxw9qvgw.png)
1.54 КБ оперативы и 4.69 КБ флеша.
Напомню, оптимизация отключена, то есть «-O0»
Много это или мало?
На этот вопрос можно будет с уверенностью ответить только в следующих частях статьи.
Оригинал статьи как всегда в моем блоге
Для тех, кому лень перечитывать — закончилось все тем, что пустой проект успешно собрался.
![](https://habrastorage.org/webt/xu/oq/n_/xuoqn_ph-6skvfodoupmtub0jg0.jpeg)
В данной части напишем простейший пример Hello World на HAL, посмотрим как запускать и пользоваться отладчиком, ну и выясним, сколько же памяти кушает наша программа, которая в этой части будет написана на HAL.
За основу берем все тот же пустой проект, который инициализировали в прошлой части.
Для того, чтобы помигать светодиодом — нам необходимо придерживаться следующего алгоритма:
- Установить на ножке микроконтроллера состояние, инверсное текущему. То есть был 0 — ставим 1, был 1 — ставим 0 и тд.
- Подождать N количество микросекунд и вернутся к шагу 1.
Для того чтобы выполнить первый пункт — нам необходимо указать компилятору к какому пину и порту подключен светодиод и какой функцией делать инверсию его состояния.
Сначала найдем, куда мы подключили светодиод.
В файле main.c, сразу после вступительных комментариев, которые нам любезно написала компания ST — имеется строчка, для подключения заголовочного файл main.h
![](https://habrastorage.org/webt/yi/wa/lk/yiwalkkgc4lydurug0jq1sze9dk.png)
Нажимаем на эту строку правой кнопкой и находим пункт Open Declaration
![](https://habrastorage.org/webt/xm/wo/-i/xmwo-i7wjz_a0alqjayeozngbu0.png)
Нажав на него — мы переместимся в файл main.h
Где найдем наши декларированные названия пинов и портов.
![](https://habrastorage.org/webt/zq/c3/vx/zqc3vxprbol_sfvqvxmk7ddn6mg.png)
Помните, в первой части при инициализации вывода светодиода PC13 — мы заполняли поле User Label и вписывали туда CLOCK_LED?
STM32CubeMX при генерации проекта учел наши пожелания и теперь вместо абстрактных GPIO_PIN_13 и GPIOC мы можем обращаться к своему светодиоду через более понятные для восприятия CLOCK_LED_Pin и CLOCK_LED_GPIO_Port.
С тем — чем будем управлять — разобрались.
Теперь ищем функцию, которая умеет менять состояние нашего GPIO на противоположное.
Для этого в дереве проекта в левой части экрана — находим файл:
Drivers -> STM32F1xx_HAL_Driver -> Inc -> stm32f1xx_hal_gpio.h
В нем очень много всего, но нам нужны описания функций, которые идут в блоке /* Exported functions */
Находим там функцию
void HAL_GPIO_TogglePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin);
Это как раз то, что нам необходимо.
![](https://habrastorage.org/webt/oz/2s/dt/oz2sdtylehcpjcezlkh1m_ku_re.png)
Чтобы светодиод мигал постоянно — необходимо разместить вызов нашей функции в main в теле основного цикла программы.
А для того, чтобы различать мигания — добавить после этого задержку при помощи функции HAL_Delay(500);
В данном случае задержка будет 500мс.
![](https://habrastorage.org/webt/kd/7w/yr/kd7wyrhrom3xaqhfdn1shvgdpvu.png)
Кстати, функция HAL_Delay описана так же в
Drivers -> STM32F1xx_HAL_Driver -> Inc
только в файле stm32f1xx_hal.h
То есть чтобы помигать светодиодом — нам потребовалось написать всего 2 строчки кода.
Если мы сделали все правильно — можно попробовать запустить отладчик и посмотреть как выполняется программа.
![](https://habrastorage.org/webt/wt/kl/jm/wtkljm9yczdbqjgl3qogmbkexzm.png)
![](https://habrastorage.org/webt/2i/5y/of/2i5yofnug7lsqn45tpyprohhg2q.png)
Перемещаться по коду программы можно при помощи кнопок F5 и F6
При этом кнопка F6 шагает только по вызовам функций, а кнопка F5 позволяет зайти в вызываемую функцию и посмотреть что же происходит внутри.
![](https://habrastorage.org/webt/li/ri/2s/liri2sqfgk_ha0a6ygqwqc4d9u4.gif)
Единственное, если вы не хотите наловить глюков при отладке — советую отключить оптимизацию. Делается это через меню Project -> Properties
Значение Optimization Level необходимо установить в None(-O0)
![](https://habrastorage.org/webt/z1/8w/ai/z18waicrgoc6t9s3ytb6mv22fig.png)
После остановки отладки — контроллер перезапустит код еще раз и будет выполнять его циклически.
По итогу должна получится примерно такая картина
![](https://habrastorage.org/webt/gj/ku/x7/gjkux7d4y-q_xdxjyqbrfhzfmpo.gif)
Подведем итоги
Использование HAL позволило реализовать данную задачу путем написания всего 2-х строчек кода.
Но за упрощение работы пришлось заплатить памятью
![](https://habrastorage.org/webt/xj/mw/fa/xjmwfaw-cwgg-7fdcchrxw9qvgw.png)
1.54 КБ оперативы и 4.69 КБ флеша.
Напомню, оптимизация отключена, то есть «-O0»
Много это или мало?
На этот вопрос можно будет с уверенностью ответить только в следующих частях статьи.
Оригинал статьи как всегда в моем блоге