Keil stm32 как отключить библиотеки hal
Перейти к содержимому

Keil stm32 как отключить библиотеки hal

  • автор:

Русские Блоги

Метод непосредственного создания проекта STM32 с использованием библиотеки HAL в Keil MDK 5 (без использования STM32CubeMX)

В этой статье используется однокристальный компьютер STM32F030C8.

[Пример кода программы]

Примечание. Оператор «= » эквивалентен функции GPIO_StructInit в исходной стандартной библиотеке.

Глобальные переменные и статические локальные переменные были очищены по умолчанию, поэтому нет необходимости писать «= ». Значением по умолчанию для обычных локальных переменных являются случайные значения, поэтому необходимо написать «= ».

#include #include #include UART_HandleTypeDef huart1; static uint8_t uart_data; #ifdef USE_FULL_ASSERT void assert_failed(char *file, uint32_t line) < printf("%s: file %s on line %d\r\n", __FUNCTION__, file, line); while (1); >#endif int main(void) < int i = 0; GPIO_InitTypeDef gpio = ; HAL_Init(); __HAL_RCC_GPIOA_CLK_ENABLE(); __HAL_RCC_USART1_CLK_ENABLE(); gpio.Alternate = GPIO_AF1_USART1; gpio.Mode = GPIO_MODE_AF_PP; gpio.Pin = GPIO_PIN_9 | GPIO_PIN_10; gpio.Pull = GPIO_NOPULL; gpio.Speed = GPIO_SPEED_FREQ_HIGH; HAL_GPIO_Init(GPIOA, &gpio); huart1.Instance = USART1; huart1.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_RXOVERRUNDISABLE_INIT; huart1.AdvancedInit.OverrunDisable = UART_ADVFEATURE_OVERRUN_DISABLE; huart1.Init.BaudRate = 115200; huart1.Init.Mode = UART_MODE_TX_RX; HAL_UART_Init(&huart1); printf("STM32F030C8 USART1\n"); HAL_UART_Receive_IT(&huart1, &uart_data, 1); HAL_NVIC_EnableIRQ(USART1_IRQn); while (1) < printf("i=%d\n", i); i++; HAL_Delay(1000); >> / * Функция приема UART * / void USART1_IRQHandler(void) < HAL_UART_IRQHandler(&huart1); >void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) < if (isprint(uart_data)) printf("Received: %c\n", uart_data); else printf("Received: %#x\n", uart_data); // Продолжаем получать следующий символ HAL_UART_Receive_IT(&huart1, &uart_data, 1); >/ * Функция задержки в библиотеке HAL должна использовать это * / void SysTick_Handler(void) < HAL_IncTick(); >/ * Следующий код добавляет функцию последовательного вывода printf (без проверки Использовать MicroLIB в свойствах проекта) * / #pragma import(__use_no_semihosting) struct __FILE < int handle; >__stdout, __stderr; int fputc(int ch, FILE *fp) < if (fp == stdout || fp == stderr) < if (ch == '\n') HAL_UART_Transmit(&huart1, (uint8_t *)"\r\n", 2, HAL_MAX_DELAY); else HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, HAL_MAX_DELAY); >return ch; > void _sys_exit(int returncode)

[Метод 1] Проверьте библиотеку HAL непосредственно в проекте Keil, не добавляя файл библиотеки вручную

(1) Создайте новый пустой проект в Keil и выберите MCU для использования

(2) Затем появится это окно. В этом выберите Startup под Device, Затем вы должны выбрать Standalone в выпадающем меню справа

Это окно обычно можно открыть, щелкнув зеленый бриллиант на панели инструментов.

(3) Проверьте все зависимые элементы в соответствии с подсказкой «Вывод подтверждения» ниже. Также выберите используемую периферийную библиотеку HAL, например USART.

(4) После завершения проекта вы можете создать новый пустой исходный файл main.c и написать код.

(5) После написания кода свойства проекта должны быть настроены для успешной компиляции. Добавьте USE_HAL_DRIVER на вкладку C / C ++.

USE_FULL_ASSERT на рисунке может быть добавлен или не добавлен. Это определяет, следует ли включать вывод предупреждения HAL.

(6) Установите флажок «Сбросить и запустить в режиме отладки», чтобы программа могла автоматически запускаться после загрузки, не нажимая кнопку сброса.

[Способ 2] Вместо проверки библиотеки HAL в окне «Управление средой выполнения» перейдите в Интернет, чтобы загрузить пакет сжатия библиотеки HAL, а затем вручную добавьте все файлы библиотеки в проект.

(1) При создании проекта не проверяйте ничего, чтобы убедиться, что проект полностью пустой.

(2) Зайдите на официальный сайт ST, чтобы загрузить сжатый пакет библиотеки HAL.

Например, имя сжатого пакета библиотеки HAL серии STM32F0 называется en.stm32cubef0.zip, а адрес загрузки -https://www.st.com/en/embedded-software/stm32cubef0.html。

(3) Создайте папку STM32F0xx_HAL_Driver в папке проекта.

Откройте сжатый пакет и разархивируйте папки Inc и Src в папке en.stm32cubef0.zip \ STM32Cube_FW_F0_V1.11.0 \ Drivers \ STM32F0xx_HAL_Driver в только что созданную папку STM32F0xx_HAL_Driver.

После декомпрессииВам нужно переименовать файл заголовка, заканчивающийся _template в папке Inc и удалить суффикс _template

К тому же,Также удалите все файлы c с _template в папке Src

(4) Разархивируйте следующие файлы в папку STM32F0xx_HAL_Driver:

cmsis_armcc.h, cmsis_compiler.h, cmsis_version.h и core_cm0.h в en.stm32cubef0.zip \ STM32Cube_FW_F0_V1.11.0 \ Drivers \ CMSIS \ Core \ Include \

Этот шаг определяется на основе компиляции кода. Когда файл отсутствует во время компиляции, файл распаковывается.

(5) Добавьте все файлы * .c и * .s в проект.(Не нужно добавлять в Src \ Legacy), Также напишите main.c. На этот раз вам нужно включить заголовочный файл .

(6) Добавьте путь включения файла заголовка в свойствах проекта и определите макрос USE_HAL_DRIVER

STM32 fast start. Часть 1 ПО, материалы, Cube MX

В последнее время все чаще сталкиваюсь с холиварами на тему Cube MX и HAL, применительно к контроллерам STM32.

С одной стороны — стоят защитники, которым нравится удобство конфигурирования и читаемость кода.

С другой — приверженцы писать все руками, которым важна скорость работы и бережное использование ресурсов.

Для того, чтобы расставить все точки над i — попробуем написать «Hello world» тремя наиболее часто используемыми путями CMSIS, LL, HAL. Оценим затраты (ресурсы контроллера, объем исполняемого файла, и конечно же время работы разработчика).

Статья будет состоять из нескольких частей:

STM32 fast start. Часть 1 ПО, материалы, Cube MX.
STM32 fast start. Часть 2 Hello World на HAL, настройка отладки в Atollic TrueSTUDIO
STM32 fast start. Часть 3 Hello World на LL
STM32 fast start. Часть 4 Hello World на CMSIS
STM32 fast start. Часть 5 Подведение итогов, сравнение HAL, LL, CMSIS.

Сначала давайте определимся с тем, что же мы собственно будем программировать, то есть найдем подходящее железо.

Идеальным вариантом будет бюджетная плата на STM32F103C8T6 микроконтроллере.

image

Данную плату можно найти на всем известном сайте по цене от 100 российских рублей.

Искать по ключевым словам: STM32F103C8T6 ARM STM32 Minimum

Для того, чтобы залить прошивку и поиграть с отладкой — так же потребуется программатор
Для начала, да и для дальнейшего использования идеально подойдет китайский клон программатора ST-LINK V2.

Купить можно на том же сайте по цене от 120 российских рублей.

image

Искать по ключевым словам ST LINK Stlink ST 252dLink V2 Mini STM8 STM32:

Для разработки ПО под STM32 можно использовать различные IDE.

Самые популярные — IAR, Keil, Coocox (Eclipse).

Мы же пойдем по пути, который с недавних пор абсолютно бесплатно и в полном объеме предоставляет сама ST.

Будем использовать Atollic TrueSTUDIO for STM32 или в простонародии «Толик».

Какие плюсы у данного ПО: абсолютно бесплатно, нет ограничения по размеру кода, есть неплохой отладчик, простая установка и настройка.

Минусы: нет авто дополнения кода.

Доступны версии под windows и linux.

Качаем здесь https://atollic.com/resources/download/
С установкой данного ПО проблем возникнуть не должно, все интуитивно понятно, выбираем куда ставить и жмем все время «далее».

После установки можно не запускать, так как помимо самой IDE нужно еще кое что.

Если все таки запустили — просто закрываем.

Так как TrueSTUDIO — это средство разработки и отладки, хотелось бы не собирать проект руками (подключая требуемые библиотеки и прописывая пути), а получить некий преднастроенный файл, в котором можно без лишних заморочек сразу же писать код.

Для этого применяется программа генератор кода Cube MX или в простонародии «Калокуб».
Данное ПО является первым камнем преткновения в холиварах на чем же писать под STM: на регистрах и CMSIS или на HAL.

Защитники первой идеологии приводят такие аргументы: Cube MX генерирует огромный, ненужный объем кода, который к тому же замедляет работу МК.

Защитники второй — заявляют, что автоматически сгенерированный код сокращает время разработки, позволяя разработчику быстрее переключится к сутевой части устройства (к основной логике), отдав рутинную настройку периферии на откуп специализированному ПО (Cube MX).

Как ни странно — обе эти идеологии правдивы и применимы на практике, но только каждая в своих условиях.

Давайте рассмотрим пару примеров:

Пример №1: Требуется разработать устройство, максимально дешевое, так как планируется производство партиями по 100500 шт ежегодно. Естественно, каждый лишний рубль цены устройства — выльется в сотни тысяч рублей затрат на финальном устройстве. При этом в планируемой разработке есть пара тяжелых расчетов и работа с периферией (ADC, SPI, UART) на максимальных скоростях.

Устройство является полностью автономным продуктом, в дальнейшем планируется минимальные изменения за весь срок производства данного оборудования. Срок разработки до получения готового образца — 1-2 года.

Пример №2: Требуется прототип устройства, который возможно заинтересует заказчика и он закажет 100 шт аналогичных устройств для переоборудования своего объекта. Первая планируемая партия должна быть отгружена заказчику через 2 месяца. Размер первой тестовой партии 10 шт.

Точное ТЗ будет корректироваться в процессе работы над проектом, но известно, что в дальнейшем планируется несколько переработок аппаратной части, под которую необходимо оперативно подстраивать всю прикладную логику.

В первом примере идеальным вариантом будет выбор максимально дешевого контроллера и написание аппаратно зависимого, но оптимального кода, где работа с периферией будет организована через обращение к соответствующим регистрам (CMSIS). Разработчик, который занимается данным проектом — должен обладать хорошими или отличными знаниями периферии конкретного семейства МК. В идеале — при попытке разбудить его ночью — должен сразу же назвать адрес требуемого вектора из таблицы векторов прерываний.

Во втором примере — выбор контроллера обусловлен имеющимся в наличии железом, а так же затратами времени для написания функционала требуемого заказчиком. Поэтому скорость работы и оптимизированность самого ПО отходит на второй план. Времени на ручную инициализацию нет, как нет времени и на проработку аппаратных зависимостей.

В таком случае выбирается контроллер, который можно быстро поставить в производство в текущем регионе, на нем делается инициализация с помощью Cube MX, пишется прикладная логика на HAL и прототип передается заказчику для тестирования. Такой проект может вести любой средний разработчик, который постиг навыки работы с целевым языком программирования. Вникание в тонкости работы периферии — практически не требуются.

Как бы это не печально звучало — в реалиях современной разработки устройств в России — пример №1 встречается все реже, передавая эстафету примеру №2.

К обсуждению примеров №1 и №2 вернемся в самом конце цикла статей, а сейчас продолжим с подготовкой рабочего пространства.

На данном этапе сделаем небольшую паузу, зайдем на сайт my.st.com и зарегистрируем на нем учетную запись, так как политика компании ST не позволяет скачивать необходимые материалы без регистрации.

После того, как у нас появился доступ к сайту — скачиваем STM32 Cube MX.

В самом низу страницы есть кнопка выбора версии, нам нужна версия 5.0.0

image

Попутно, пока мы не ушли отсюда, качаем еще две вещи, которые пригодятся в дальнейшем
https://www.st.com/en/development-tools/stsw-link008.html

Драйвер ST-LINK V2

image

image

Установка драйвера, прошивальщика и самого Cub’a не вызывают затруднений, просто соглашаемся со всем и жмем далее.

После полной установки необходимого ПО — можем приступать к созданию проекта.
Для этого запустим Cube MX.

В появившемся окне нажмем на кнопку «ACCESS TO MCU SELECTOR».

image

На нашей целевой плате установлен микроконтроллер STM32F103C8T6.

Введем его название в строке поиска и двойным щелчком выберем единственный найденный вариант.

В этой же таблице видно основную начинку нашего МК (64 килобайт флеша, 20 килобайт оперативы и пр).

image

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

На данном этапе необходимо обязательно выбрать способ подключения отладчика.

Для этого на вкладке Pinout & Configuration в левом меню выбираем пункт SYS а в нем в выпадающем списке под названием «Debug» устанавливаем значение Serial Wire.

При этом краем глаза замечаем, что программа зарезервировала для отладочных целей два пина на мнемосхеме контроллера.

image

Еще раз вспоминаем, что мы хотим помигать светодиодом на нашей плате.

Для этого необходимо сначала узнать, к какой именно ножке он подключен.

В этом нам поможет схема электрическая принципиальная:

image

или более красочная и простая для понимания распиновка платы

image

Искомый светодиод находится на ножке PC13.

Соответственно, необходимо настроить данный вывод для работы в режиме выхода.

image

  1. Находим вывод на мнемосхеме
  2. Нажимаем на него правой кнопкой мыши, из выпадающего меню выбираем пункт «GPIO_Output»
  3. Переходим в меню GPIO,
  4. В списке выбираем PC13
  5. Заполняем таблицу PC13-TAMPER-RTC Configuration в соответствии со скриншотом, особенно нас интересуют параметры GPIO mode и User Label

Продолжаем настройку проекта, переходим к вкладке Clock Configuration.

На самом деле это одна из важнейших вкладок, которая позволяет настроить параметры тактирования периферии, но пока не будем здесь ничего трогать, так как главная цель на данный момент не в этом.

image

Переходим к вкладке Project Manager, под вкладка Project.

Обязательно заполняем следующие параметры:

image

  1. Имя проекта (лучше использовать только латинские буквы)
  2. Директорию, в которой будет создан проект (так же лучше использовать только латиницу)
  3. IDE, в которой планируется работа над проектом (мы планируем использовать TrueSTUDIO)

Спускаемся ниже, под вкладка Code Generator.

Здесь обязательно отмечаем опцию Generate peripheral initialization as pair…

Таким образом получим более структурированный проект, в котором для каждого типа периферии имеется своя пара C и H файлов.

image

Остался последний шаг. Подвкладка Advanced Settings.

image

  1. Выбираем тип библиотеки HAL для всех периферийных модулей
  2. Собираем проект с текущими настройками

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

Даем свое согласие на скачивание файлов:

image

Идем греть чайник или готовить кофе:

image

После окончания работы кодо-генератора — сразу же открываем его:

image

Выбираем любую папку, где Atollic будет хранить рабочее пространство:

image

При успешном открытии — перед нами предстанет главное окно Atollic TrueSTUDIO for STM.

Общая информация нас мало интересует, поэтому сразу перейдем к дереву файлов.

image

Найдем там файл main.c и функцию int main(void):

image

Для самопроверки — попробуем собрать пустой проект

image

  1. В меню Project -> Rebuild Project
  2. Внизу выбрать вкладку Console
  3. При успешной сборке — должны получить надпись Build Finished

Продолжение — в следующей части.

P.S.: Ранее статью публиковал в своем личном блоге .

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

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

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

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

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

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

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

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

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

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

Input Frequency 8

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. Щелкаем по ссылке нужной функции и смотрим ее описание.

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

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

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

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

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

Post Views: 15 419

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

Добрый день. Первым делом хочу сказать вам спасибо за ваш титанический труд. Написать такую уйму уроков за короткий срок — это нечто. Надеюсь, вы не бросите проект, как большинство авторов. Теперь «ближе к телу, как говорил Ги Де Мопассан» (с) �� Подскажите пожалуйста, почему при использовании HAL в Кейле в отладке не виден ни один периферийный блок. В SPL все доступно, а тут нет. Хоть в четвертом Кейле, хоть в пятом. Спасибо.

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

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

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

Вот написал «Поначалу в четвертом на SPL кое-что пописывал», а потом подумал, что надо было написать «пытался кое-что пописывать». �� Ибо на Си раньше не писал, много встрчается всяких непонятных вещей, которые редко где описываются. Еще хочу вас попросить писать в статьях чуть поподробнее, что откуда берется. И, если можно, в каждой статье начинать проект заново. Процессоры, которые вы используете, есть не у каждого, поэтому приходится переделывать код под свой процессор. А если проект потом снова переделывать под новый проект, то можно совсем запутаться.

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

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

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

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

Заголовчные файлы обычно располагаются в папке Inc проекта.

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

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

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

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

Как дрыгать ногой понятно, WritePin, TogglePin, ResetPin. А вот как сделать выбор ножки в цикле, нигде найти не могу. Допустим, что-то подобное:
for(i=0; i HAL_GPIO_TogglePin(GPIOD, GPIO_PIN_i);
HAL_Delay(500);
> И как бы сдвинуть регистр, описывающий состояние ног? К примеру, для того, чтобы прогнать горящий светодиодик по всем ножкам регистра последовательно, хочется просто сдвигать регистр в цикле целиком, но вот инструкцию для этого никак не могу найти. Реализовал просто удвоением значения, заносимого в порт, но чувствую, что это не самое правильное решение: char i=0;
char c=1; for(i=0; i HAL_GPIO_WritePin(GPIOA, c, GPIO_PIN_SET);
HAL_Delay(100);
HAL_GPIO_WritePin(GPIOA, c, GPIO_PIN_RESET);
c=c*2;
>

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

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

demetrodon :
Здравствуйте, что делать если на моей отладочной плате нет кнопки? чем можно ее заменить?
Здравствуйте!
Подключить внешнюю кнопку.

Не очень понял, как именно нужно настроить порты 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

У меня такое было когда в пути проекта были кириллические символы.
У меня такая же проблема. Никак не удается решить.

На 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__ */

Здравствуйте!
Начинаю работать с 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».
Где искать эту секретную локаль буттон?
Что посоветуете? Где спрятан выход, и как его найти?
Спасибо

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

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

Отбой. Работает нормально после нажатия на кнопку Reset на плате. Хотя галка «Reset and Run» стоит в настройках.

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

Библиотека HAL. STM32 CUBE MX. Таймеры

Сегодня мы попробуем поработать с таймерами также с помощью библиотеки HAL.

У нашего контроллера STM32F407 таймеров много.

Открываем reference manual и перейдём в главу 17 — Advanced-control timers (TIM1&TIM8).

Данные таймеры — это таймеры с расширенным управлением. Таких таймеров всего два

image00

Далее открываем следующий пункт 19 — General-purpose timers (TIM9 to TIM14).

Это таймеры общего назначения. У них функционал очень ограничен, зато их у нас целых шесть

image02

Далее идем в пункт 20.2 TIM6&TIM7 main features

Данные таймеры — базовые. Функционал немного расширен

image01

Также надо отметить особо таймеры 2 и 5, которые являются 32-битными, что не может не заинтересовать разработчика.

Во-первых в силу своего высокого разрешения они могут считать до более 4 миллиардов, а также у них очень широкий функционал.

image04

Теперь мы научимся делать из предыдущего проекта следующий, чтобы заново не настраивать все в Cube и не потерять наш рукописный код в проекте Keil.

Для этого создадим папку TEST02.

Скопируем туда файлы .mxproject и TEST001.ioc

Исправим имя файла TEST001.ioc на TEST002.ioc

Внутри файлов также везде меняем TEST001 на TEST002 (получится в 5 местах).

Также копируем со старого проекта папки src и inc с содержимым. Всё!

Проект готов. Запускаем TEST002.ioc

Давайте пока воспользуемся базовыми таймерами, а вернее одним из них – таймером 6

В Cube MX ставим TIM6 -> Activated

image03

Пройдем в мануал и посмотрим (стр. 65-66), на какой шине какой таймер находится — это APB1 и настроим ее в Clock Configuration. Здесь главное не превысить граничную частоту (42 МГц).

image05

Давайте поставим делитель APB1 prescaler равным 8,частота получится 21 мГц, а для таймера будет 42. Нам этого вполне хватит.

Затем идем в закладку Configuration и настраиваем там таймер.

В закладке Parameter Settings выставляем следующие значения

Prescaler (PSC – 16 bit value) – 20999

Counter Period – 499

Trigger Event Selection – Update Event

image08

В закладке NVIC Settings включаем глобальные прерывания таймера 6

image09

Жмем Apply

Генерируем проект Keil5 таким же образом как и на прошлом занятии

Собираем проект в кейле. Открываем main.c – как видим ничего не пропало никуда.

Попробуем прошить и запустить. Удивительно. Все работает.

Далее подключаем таймер.

Откроем там раздел 61.3.3 Time Base functions

Найдем фукцию, запускающую таймер HAL_TIM_Base_Start

image06

Вставляем код в main.c

/* USER CODE BEGIN 2 */

/* USER CODE END 2 */

Также запускаем прерывания от таймера

Для этого есть аналогичная функция HAL_TIM_Base_Start_IT

image07

Вставляем ее сюда же

/* USER CODE BEGIN 2 */

/* USER CODE END 2 */

В файле stm32f4xx_it.c находим функцию прерывания от таймера и добавляем туда код

/* USER CODE BEGIN TIM6_DAC_IRQn 0 */

/* USER CODE END TIM6_DAC_IRQn 0 */

/* USER CODE BEGIN TIM6_DAC_IRQn 1 */

/* USER CODE END TIM6_DAC_IRQn 1 */

Из бесконечного цикла уберем вот эту строку, чтобы не мешала работать таймеру

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

Теперь попробуем разнообразить

Файл main.h из старого проекта положим в папку inc и подключим его в главном модуле main.c

/* USER CODE BEGIN Includes */

/* USER CODE END Includes */

Очистим его, оставив только директивы и добавим туда глобальную переменную

Проинициализируем ее в функции main

/* USER CODE BEGIN 2 */

/* USER CODE END 2 */

Проэкстерналим в файле stm32f4xx_it.c

/* USER CODE BEGIN 0 */

extern uint8_t tim6_counter;

/* USER CODE END 0 */

Изменим код в функции прерывания в этом же файле

/* USER CODE BEGIN TIM6_DAC_IRQn 0 */

/* USER CODE END TIM6_DAC_IRQn 0 */

/* USER CODE BEGIN TIM6_DAC_IRQn 1 */

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

HAL_GPIO_WritePin(GPIOD, GPIO_PIN_12, GPIO_PIN_SET);

HAL_GPIO_WritePin(GPIOD, GPIO_PIN_12, GPIO_PIN_RESET);

HAL_GPIO_WritePin(GPIOD, GPIO_PIN_13, GPIO_PIN_SET);

HAL_GPIO_WritePin(GPIOD, GPIO_PIN_13, GPIO_PIN_RESET);

HAL_GPIO_WritePin(GPIOD, GPIO_PIN_14, GPIO_PIN_SET);

HAL_GPIO_WritePin(GPIOD, GPIO_PIN_14, GPIO_PIN_RESET);

HAL_GPIO_WritePin(GPIOD, GPIO_PIN_15, GPIO_PIN_SET);

/* USER CODE END TIM6_DAC_IRQn 1 */

В файле main.c уберем запуск таймера

А в бесконечном цикле код изменим следующим образом

/* USER CODE END WHILE */

/* USER CODE BEGIN 3 */

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

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

STM32 HAL. STM32 CUBE MX. Таймеры

Post Views: 14 275

39 комментариев на “ STM Урок 5. Библиотека HAL. STM32 CUBE MX. Таймеры ”

Как сделать так, что бы прерывание возникало при нажатии на кнопку?
Можно будет использовать внешние прерывания. Очень скоро будет урок.

Спасибо огромное за изложенный материал , но в данном посте не могу найти stm32f4xx_it.c в исходниках .

А разве в папке Src его нет?
Нету , его вообще нигде нету .

а имеет ли смысл вызывать два раза функцию HAL_TIM_Base_Start(&htim6); HAL_TIM_Base_Start_IT(&htim6); ? кажется вполне достаточно одного вызова HAL_TIM_Base_Start_IT(&htim6); Не даны пояснения, в чем разница между двумя этими функциями

Ну да, достаточно. Давно писал урок. Разница в том, что если прерывания используются, то _IT, если нет — то без _IT

У меня как раз если обе строки, то светодиод не мигает совсем, а если оставить только строку с вызовом прерывания — то все супер

Спасибо. Вы мне очень помогли. Тоже заработало только после того как инициализацию произвёл через _IT не используя другую

Тоже часа 2 убил пока допёрло что надо одной строкой с IT делать .

У меня прерывание (использую таймер 6) срабатывает сразу как только запускается таймер.Как сделать так чтобы прерывание срабатывало только по периоду(То есть запускается таймер, проходит период и запускается прерывание)?

Здравствуйте! Спасибо за Ваши уроки, очень помогают в освоении STM32! Вопрос следующий- нужно ли очищать флаги прерываний или HAL делает это сам? У меня возникает проблема с ложным вызовом прерывания от кнопки, хотя кнопка подтянута и программно и резистором к + питания, возможно прерывания от других модулей дают такой эфект? Спасибо!

Здравствуйте! Флаги очищать не надо. Если Вы откроете автообработчик включенных в Cube глобавльных прерываний, то увидите там сброс флага.

Спасибо, понятно! А вот что вызывает ложное срабатывание на внешнем прерывании я так и не разобрался, у меня 2 USARTA 1 I2C, SDIO и EXTI. Обработчик написан только для EXTI и раз в час на нем происходит ложный вызов. При двойной проверки внутри обработчика на низкий уровень пина проблема вроде-как решилась. Может у кого то была подобная проблема? И Как грамотно распределить приоритеты прерываний? я их не трогал — везде 0.

делаю так как написано. выбивает ошибку: ../Src/main.c(247): error: #159: declaration is incompatible with previous «_Error_Handler» (declared at line 150) что не так? хотя прикреплённый архив с исходниками запускается нормально

Обновите полностью репозиторий, Cube и Keil. Что-то не сходится у Вас

сразу же отвечу: _Error_Handler(__FILE__, __LINE__); переименовал в Error_Handler(); — ещё небыло декларации, сделал: void SystemClock_Config(void);
void Error_Handler(void);
static void MX_GPIO_Init(void);
static void MX_TIM6_Init(void); А также сыпало ошибки в других файлах, … Error: L6200E: Symbol tim6_counter multiply defined … решение — в файле main.h делаем extern uint8_t tim6_counter; , а в файле stm32f4xx_it.c — просто uint8_t tim6_counter; Источник — http://forum.easyelectronics.ru/viewtopic.php?f=35&t=24247

Спасибо за решение ошибки Error: L6200E: Symbol tim6_counter multiply defined. Помогло.
Thank you much, I’m was sitting since 4 hours on this problem…
Спасибо! Теперь все ок)

Если мы откроем reference manual и перейдём в главу 17, а именно на страницу 519, то увидим диаграммы. Из которых следует что если мы хотим разделить частоту шины на 2, то prescaler нужно установить 2, если на 4, то 4. а если 21000, то 21000. И единицу отнимать не нужно. А вот в Counter Period единицу отнимать нужно. Это видно на диаграмме и написано в reference manual. Цитата: «If the repetition counter is used, the update event (UEV) is generated after upcounting is repeated for the number of times programmed in the repetition counter register plus one (TIMx_RCR+1).»

Только знакомлюсь с микроконтроллерами, не подскажите, где именно в reference manual такое написано, просмотрел с 518 страницы, что-то не увидел. А в диаграммах пока не очень разбираюсь.

С Counter Period понятно, что надо -1, т.к. счет с 0 начинается. А вот с предделителем действительно интересно, почему везде его на -1 уменьшают.

В документе AN4776 «STM32 Timer cookbook» можно найти истину:
/* Set the Timer prescaler to get 8MHz as counter clock */
Prescaler = (uint16_t) (SystemCoreClock / 8000000) — 1; в HAL таким же образом нужно отнимать единицу, он сам нигде это не делает.

Здравствуйте. Подскажите, пожалуйста, в каких случаях срабатывают прерывания TIM2_IRQHandler? Т.е. если я использую данный таймер с прерываниями (как у Вас в статье), необходимо ли мне производить доп. проверку в функции TIM2_IRQHandler или у таймеров только по одному событию формируется прерывание?
Например, как в АЦП, есть общие прерывания (HAL_ADC_IRQHandler), а есть отдельная функция HAL_ADC_ConvCpltCallback(), которую более предпочтительнее использовать. Есть ли аналогично в таймерах? Спасибо.

Здравствуйте!
Не нужно никаких проверок. Урок уже сравнительно не новый, поэтому используется такая обработка. Лучше использовать коллбэки и ничего в этом файле не проверять. Если Вы посмотрите дальнейшие уроки, то мы давно уже так и делаем.

Подскажите, а какая функция коллбэк для таймеров? Для АЦП HAL_ADC_ConvCpltCallback(), а какая для таймера?

Нашёл у Вас в 21-м уроке функцию HAL_TIM_PeriodElapsedCallback(). Подскажите, а в чём преимущества перед обычным обработчиком прерывания? И как определять какой таймер вызвал данную колбэк функцию, сравнивать в данной функции указатели?

Большое спасибо на уроки!
Скажите пожалуйста, никак не могу написать свой ГУИ для управления светодиодами и опроса кнопок.
Юзаю libUSB для C# Какие ID должны быть в посылках со стороны ПК на МК ?

Здравствуйте, nordstream, спасибо большое за ваши видео, которые я пробовал пару раз, чтобы сделать это упражнение, без успеха дает мне ряд ошибок, когда я создаю переменную uint8_t, вы можете мне помочь. спасибо

Здравствуйте
подключите библиотеку stdint.h

Та же ошибка с unit8_t. Искал в ваших исходниках, где подключается данная библиотека — не нашел ни в одном из файлов — stdint.h нет нигде. Команда подключения библиотеки #include «stdint.h» тоже не исправляет ошибку. Хотя, видно, что файл stdint.h присутствует в Keil в раскрывающимся списке файла main.c. Видимо, вы что-то недорассказали в этом уроке.

Все застопорилось на ошибке с unit8_t. Может, из-за 5-го куба?

это не урок, а лишь представление о том, что нужно тыкнуть, чтобы что-то работало. Урок состоит в объяснении принципов работы. А тут если в Кубе лень нажать пару портов на выход и написании дергании ножек и из-за этого заниматься ******** с перекидыванием файлов из одной папки в другу и переименовыванием названий…это сильно!

Я старался по максимуму на первых порах объяснять что и почём. Если Вы считаете, что это для Вас «низко», то переходите сразу к последним урокам.
И в следующий раз прошу воздерживаться от слов-паразитов в комментариях, глобальная публичная сеть всё-таки, а не базар.

Здравствуйте! Извините, только начал изучать stm,
можно ли изменить sounter period во время работы программы?

Для глобального счётчика надо подписывать модификатор volatile, у меня без него оптимизатор ломал остановку таймера в цикле по условию. (F103/CubeIDE)

Надо в main.h добавить директиву #include «stdint.h»

C новым годом !
Спасибо за великолепные уроки
повторил на Stm32f103c8t6
В качестве таймера TIM2 HAL_TIM_Base_Start_IT(&htim2);

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

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