Arduino IDE + аддон от stm32

nik182
Offline
Зарегистрирован: 04.05.2015

Под ардуной можно писать короткие скетчи типа проверки модулей или моргания лампочкой. Т.е. то что укладывается в рамки ардуино. Если что то более сложное, надо знать CMSIS и мануал на процессор. Или писать в среде предназначенной для STM. Но это не отменяет мануала, и изучение HAL LL CMSIS или других надстроек над ARM. Всё зависит от решаемой задачи. Имея представление о задаче можно выбрать инструмент, который позволит решить задачу эффективно и в кратчайшие сроки.      

Morroc
Offline
Зарегистрирован: 24.10.2016

Однако и "в лоб" будет быстрее обычной ардуины. Неплохо для цветных дисплеев, атмега с ними справляется с трудом.

Чечако
Offline
Зарегистрирован: 15.06.2018

Мужики, у меня жесточайший приступ кретинизма. А где взять драйвер для Maple, коим прикидываются эти славные платы для винды при подключении по USB? Я нашел только это, но древность чутка смущает:

https://github.com/AiFrame/Maple-Windows7-driver

Windows 7, если что.

 

 

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

Чечако, в папке аддона подпапка drivers

Чечако
Offline
Зарегистрирован: 15.06.2018

dimax пишет:

Чечако, в папке аддона подпапка drivers

Смотрел там, но ничего подходящего по мнению винды не нашлось. Но у меня Arduino Core for STM32 1.9.0, а не чисто кларковский addon - может в этом дело?

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

Чечако, естессно.  Мапле-девайс в системе образует залитый в МК кларковкий бутлодырь.  STM-аддон к этому делу никакого отношения не имеет.

mir0tv0rec
Offline
Зарегистрирован: 19.09.2018

Все доброго дня! Подскажите есть ли у кого проблема с скачиванием софта с сайта st.com? Ошибка выше изложенная в Arduino IDE, но скачать ничего не получается - не приходят ссылки на почту. Ни https://www.st.com/en/development-tools/stm32cubeprog.html эта, ни другие (Cube MX, Flasher? Cude IDE)...

nik182
Offline
Зарегистрирован: 04.05.2015

После регистрации на st.com ссылки на скачивание доступны с сайта. Ничего на почту не приходит.

mir0tv0rec
Offline
Зарегистрирован: 19.09.2018
Тоже не получается, пишет такую ерунду и на этом тишина...
 
Thank you for registering
Thank you for registering with STMicroelectronics. A confirmation message has been sent to xxxxxx@gmail.com.
Please note, it may take several minutes to receive it.
 
To activate your account please click on the url address sent to you in your mailbox, this will allow you to access ST’s e-services
 
Ни одного письма так и не пришло, жду уже дня 3. Пробовал разные почтовые серверы: gmail.com, yandex, mail.
 
ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Buldakov пишет:

Еще замечание о программе STM32CubeProgrammer, которая была скачана с оф. сайта

Решил эту программу удалить с компьютера. Прекрасно удалилась. Только удалила всю папку D:\Program Files со всеми установленными программами. А по идее должна была удалить только содержимое D:\Program Files\STMicroelectronics

видимо кибер атака от STM прошла

b707
Offline
Зарегистрирован: 26.05.2017

mir0tv0rec пишет:

 
Ни одного письма так и не пришло, жду уже дня 3. Пробовал разные почтовые серверы: gmail.com, yandex, mail.
 

спам проверьте. СТМ после регистрации довольно прилично спамит разной рекламой, так что может ваш почтовый провайдер занес его в спам-список авансом :)

mir0tv0rec
Offline
Зарегистрирован: 19.09.2018

Какая-то хрень с этим сайтом, ни одного письма от них так и не пришло. Когда под стм8 скачивал, все нормально было, а тут вот так. Уже и на aol.com ящик завел, тоже не приходит.

b707
Offline
Зарегистрирован: 26.05.2017

mir0tv0rec пишет:
Какая-то хрень с этим сайтом, ни одного письма от них так и не пришло. Когда под стм8 скачивал, все нормально было, а тут вот так. Уже и на aol.com ящик завел, тоже не приходит.

ну может у них все упились, рождество же

mir0tv0rec
Offline
Зарегистрирован: 19.09.2018

Ну и ладно, подождем. Хотел хоть диодом поморгать, а тут вон че.

Sled
Offline
Зарегистрирован: 27.08.2017

мой выбор Аддона:
IDE Keil (или другая) + CMSIS
Нормальные статейки по CMSIS на ХабСтаб, например GPIO - https://hubstub.ru/stm32/65-stm32-gpio-ili-porty-vvoda-vyvoda.html

или монструозные статейки на Димун - http://dimoon.ru/obuchalka/stm32f1/programmirovanie-stm32-chast-5-portyi-vvoda-vyivoda-gpio.html

и для кайфу:
написание своих библиотек на препроцессоре, например - http://we.easyelectronics.ru/blog/STM32/3191.html

Sled
Offline
Зарегистрирован: 27.08.2017

mir0tv0rec пишет:
Ну и ладно, подождем. Хотел хоть диодом поморгать, а тут вон че.

мигай через STM32CubeMX + HAL (SLP/LL/CMSIS)

mir0tv0rec
Offline
Зарегистрирован: 19.09.2018

Да все замечательно, только где его взять? С сайта stm не скачивается ничего...

Sled
Offline
Зарегистрирован: 27.08.2017

mir0tv0rec пишет:
Да все замечательно, только где его взять? С сайта stm не скачивается ничего...

начни просто с Keil(ARM) + CMSIS и мигай.  Keil есть официальный с ограничением размера программы, а есть с РуТракера

Не качает отсюда? ты залогинился?

STM32CubeMX - https://my.st.com/content/my_st_com/en/products/development-tools/software-development-tools/stm32-software-development-tools/stm32-configurators-and-code-generators/stm32cubemx.html#

я только что скачал и поставил:

есть Eclipse (System Workbench for STM32) - https://www.st.com/en/development-tools/sw4stm32.html#overview

есть STM32CubeIDE (раньше он обязательно требовал обновить ПО в китайском свистке STLink, обновил - кирпич) - https://www.st.com/en/development-tools/stm32cubeide.html

все IDE (TrueSTUDIO, VisualGDB и тд) - https://www.st.com/en/development-tools/stm32-ides.html#products

mir0tv0rec
Offline
Зарегистрирован: 19.09.2018

Я не могу зарегистрироваться - не приходит письмо с подтверждением на почту.

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

Сегодня скачивал cube mx на попробовать, почта yandex, все гуд.

kolyn
Offline
Зарегистрирован: 18.01.2019

andycat пишет:
Сегодня скачивал cube mx на попробовать, почта yandex, все гуд.

Вы же не на сайте st.com регистрировались, а просто на странице почту вводили, и ссылка на скачивание пришла, правильно?

А попытки зарегистрироваться именно на st.com не проходят - нет письма-подтверждения. Пробовал и яндекс и жмаил((

mir0tv0rec
Offline
Зарегистрирован: 19.09.2018

С 5 разных ящиков пробовал, ни на один ничего не пришло. Ни при регистрации, ни при просто указании имени и почты. Попросил друга сегодня - у него тоже не вышло. Может скинет кто ссыль в личку на какой-нибудь диск?

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

На st.com похоже заморозили российские аккаунты. Мой старый мейлрушный не работает. Ругается на пароль, при попытке восстановления пароля письмо на почту не приходит. Зарегился на st с почтой @gmail.com -всё ок, письмо с подтверждением моментально прилетело. Страну кажется Польшу выбрал. Скачал последний STM32CubePrg-W64 (v 2.6.0), выложил на яндексдиск

PS: просьба придерживаться топика (обсуждаем ардуину IDE и стм-овский аддон) 

Sled
Offline
Зарегистрирован: 27.08.2017

dimax пишет:

На st.com похоже заморозили российские аккаунты. Мой старый мейлрушный не работает. Ругается на пароль, при попытке восстановления пароля письмо на почту не приходит. Зарегился на st с почтой @gmail.com -всё ок, письмо с подтверждением моментально прилетело. Страну кажется Польшу выбрал. Скачал последний STM32CubePrg-W64 (v 2.6.0), выложил на яндексдиск

PS: просьба придерживаться топика (обсуждаем ардуину IDE и стм-овский аддон) 

 

Вот, только что зашел. Логин - ***@mail.ru.

Серьезно, все работает. Странно что у вас не получается зайти.

"придерживаться топика" - сорри! может кто-то захочет поплыть рядом

mir0tv0rec
Offline
Зарегистрирован: 19.09.2018

Да, все норм. На @aol.com ссылки пришли. Обновил stlink v2( не хотел шится, сказал обновить нужно), помигал диодом на всех 3х платах (сегодня как раз f030 и f411 пришли). 411 уже даже запороть успел, прошил, как 401. Компилируется правда под стм очень долго...

b707
Offline
Зарегистрирован: 26.05.2017

Подниму старую ветку.

Простите, если вопрос глупый - что-то не могу понять, на blackpill  F401СС кларковский бутлоадер ставится? Если да. то какой выбирать?

 

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

b707, а там разве есть выбор 401-ых? Только один blackpill и есть.   https://github.com/rogerclarkmelbourne/Arduino_STM32/tree/master/STM32F4/variants

b707
Offline
Зарегистрирован: 26.05.2017

dimax пишет:

b707, а там разве есть выбор 401-ых? Только один blackpill и есть.   https://github.com/rogerclarkmelbourne/Arduino_STM32/tree/master/STM32F4/variants

Димакс, чувствую себя полным идиотом... Причем тут файл variants? Я про бутлоадер вроде...

На блюпилл, чтобы можно было шить плату через USB прямо в Ардуино IDE - мы прошиваем файл generic_boot20_pc13.bin вот отсюда:

https://github.com/rogerclarkmelbourne/STM32duino-bootloader/tree/master/binaries

А к блэкпилл какой тут выбрать?

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

b707, да , я не правильно понял :). Для 401го похоже пока нет возможности. Т.е. либо штатный DFU либо stlink
Я его с кларковским аддоном и не пробовал ещё..

nik182
Offline
Зарегистрирован: 04.05.2015

https://github.com/rogerclarkmelbourne/STM32duino-bootloader

Прочитай внимательно описание. Написано, что даже не со всеми stm32f103 работает, нe то что c f4xx. 

b707
Offline
Зарегистрирован: 26.05.2017

Отвечаю сам по поводу бутлоадера в blackpill STM32F401

Кларковского бута для него нет, потому что он и не нужен. Штатный DFU залитый в чипе с завода - отлично справляется с теми же задачами - то есть позволяет прошивать плату прямо из Ардуино ИДЕ через USB порт, не пользуясь ни STM32CubePrg, ни StLink-ом.

Все, что для этого нужно сделать (описание для Винды)

1. подключаем плату к USB
2. переводим в DFU-режим (для этого - нажимаем и держим кнопку BOOT0 и коротко жмакаем NRST)
3. ждем чтобы виндоуз определила устройство и установила драйвера - устройство должно называться "STM32 Bootloader"
4. Не отключая платы, открываем утилиту Zadig, находим в списке наше устройство и меняем драйвер на нем на стандартный WinUSB

Эти действия нужно проделать один раз и...

ВСЕ! После этого прошивки в плату уже можно загружать утилиткой dfu-util, которая есть в комплекте Кларковского аддона. А если чуть заморочится и прописать ее как метод загрузки в файлах boards и platform  - Ардуино ИДЕ будет запускать загрузку сама по стандартной кнопке в ИДЕ

Прошу прощения, если сообщаю что-то банальное - у меня на выкапывание этого знания в инете ушел полный воскресный вечер с 9 вечера до 2х часов ночи :)

Не понимаю, почему этот метод загрузки не прописан в ардуино ИДЕ из коробки.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

b707 пишет:

Прошу прощения, если сообщаю что-то банальное - у меня на выкапывание этого знания в инете ушел полный воскресный вечер с 9 вечера до 2х часов ночи :)

Не понимаю, почему этот метод загрузки не прописан в ардуино ИДЕ из коробки.

Не думаю, что это что-то банальное. Как раз то, что бывает очень нужно и при этом трудно найти в упорядоченном виде.

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

b707
Offline
Зарегистрирован: 26.05.2017

andriano пишет:

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

Не заметил, чтобы в Песочнице были закреплены какие-то темы про СТМ32. Где там?

Кста, поскольку Димакс просил не оффтопить в ветке и писать только про аддон от СТМ - отмечу, что описанный выше способ загрузки не зависит от аддона и подойдет не только для работы с аддоном Кларка, но и стм-овским

Feofan
Offline
Зарегистрирован: 28.05.2017

Цитата:
Не заметил, чтобы в Песочнице были закреплены какие-то темы про СТМ32. Где там?
Может создать? А то затеряется.

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

b707 пишет:

отмечу, что описанный выше способ загрузки не зависит от аддона и подойдет не только для работы с аддоном Кларка, но и стм-овским

Ну так я про это в самом начале писал :) А вот вживить для 401-го метод загрузки через DFU в сам аддон -скорее всего дело не простое. Но мне например через программатор удобнее загружать. А по умолчанию там как раз загрузка через программатор.

b707
Offline
Зарегистрирован: 26.05.2017

dimax пишет:

вживить для 401-го метод загрузки через DFU в сам аддон -скорее всего дело не простое.

сделал для Кларковского, думаю подойдет и для СТМ. Если кто готов проверить - могу выложить , но вечером, файлы дома, а я на работе

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

b707, что подойдёт для стм? Там этот метод загрузки уже есть в штатном меню. Если интегрировал в меню для клаковского аддона, выкладывай. Тема эта конечно не про него, но тут бывают заинтересованные.

b707
Offline
Зарегистрирован: 26.05.2017

dimax пишет:

b707, что подойдёт для стм? Там этот метод загрузки уже есть в штатном меню.

там этот метод загрузки идет через STM32CubeProgrammer, а у меня через dfu-util. Хотя по сути это, наверно, одно и тоже.

 

И не совсем понял, если метод загрузки через DFU уже есть в аддоне, о чем Вы тогда писали тут:

dimax пишет:

А вот вживить для 401-го метод загрузки через DFU в сам аддон -скорее всего дело не простое.

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

b707 пишет:

И не совсем понял, если метод загрузки через DFU уже есть в аддоне, о чем Вы тогда писали тут:

Загрузка через DFU eсть в  STM-аддоне, и нет в кларковском. Я про кларковский говорю, что не просто интегрировать. 

b707
Offline
Зарегистрирован: 26.05.2017

Добавляем DFU загрузку для платы STM32F401CC blackpill в Ардуино ИДЕ

Чтобы добавить новый метод загрузки в ИДЕ, по минимуму надо сделать две вещи :
1)описать саму команду прошивки и параметры в файле platform.txt  
2) прописать ссылки на новое средство загрузки в загрузочные меню соответвующих МК в файле boards.txt

Будем делать по аналогии с вызовом мапловского загрузчика для блюпилл, прописанный в аддоне Кларка. У Кларка мапловский загрузчик вызывается через командный файл, для простоты делаем также, так что добавляется еще третья стадия - создание бат-файла. С нее и начнем.

А.Создание бат-файла.

Немного самообразования :) Строчка вызова dfu-util для прошивки выглядит вот так:
 

dfu-util -d {usbID} -a {altID} -s {dfuse_addr} -D "{build.path}/{build.project_name}.bin"

например:
 

dfu-util -d 0483:df11 -a 0 -s 0x08000000:leave -D D:\Users\DDU\AppData\Local\Temp\arduino_build_235308/sketch_may24a.ino.bin

первые три параметра - это ID платы, DFU-раздел для прошивки и адрес загрузки в памяти МК. Они у всех блек-пилл одинаковы. Последний параметр - путь к файлу прошивки, которую надо вгрузить - этот путь нам даст Ардуино ИДЕ.

Образование закончили, переходим к файлу. Идем в каталог, где лежит аддон Кларка, переходим в папку \tools\win\, находим файл maple_upload.bat и создаем его копию под именем dfu_upload.bat. Внутри файла выкидываем запуск маплелоадера и вставляем dfu-util, получается так:

@echo off
rem: Note %~dp0 get path of this batch file
rem: Need to change drive if My Documents is on a drive other than C:
set driverLetter=%~dp0
set driverLetter=%driverLetter:~0,2%
%driverLetter%
cd %~dp0
dfu-util-static -d %2 -a %3 -s %4 -D %5

for /l %%x in (1, 1, 40) do (
  ping -w 50 -n 1 192.0.2.1 > nul
  mode %1 > nul
  if ERRORLEVEL 0 goto comPortFound
)

echo timeout waiting for %1 serial

:comPortFound

дополнительно нужно скопировать файл \tools\win\dfu-util-0.9-win64\dfu-util-static.exe в каталог, где лежит бат-файл - то есть в \tools\win\

В. Редактирование platform.txt

Редактировать нужно файл, лежажий в дереве STM32F4, в аддоне Кларка это STM32F4\platform.txt
Проматываем строчки до раздела # Uploader tools (это примерно сотня строчек от начала) и вставляем такую секцию:

# Upload using Generic STM32 bootloader over DFU
tools.dfu_upload.cmd=dfu_upload
tools.dfu_upload.cmd.windows=dfu_upload.bat
tools.dfu_upload.path.windows={runtime.hardware.path}/tools/win
tools.dfu_upload.path.macosx={runtime.hardware.path}/tools/macosx
tools.dfu_upload.path.linux={runtime.hardware.path}/tools/linux
tools.dfu_upload.path.linux64={runtime.hardware.path}/tools/linux64
tools.dfu_upload.upload.params.verbose=
tools.dfu_upload.upload.params.quiet=
tools.dfu_upload.upload.pattern="{path}/{cmd}" {serial.port.file} {upload.usbID} {upload.altID} {upload.dfuse_addr} "{build.path}/{build.project_name}.bin" 

 

С. Редактирование boards.txt

Редактируем файл по относительному пути  STM32F4\boards.txt
Ищем секцию, посвященную блек-пилу, она начинается как
################################
blackpill_f401.name=Blackpill STM32F401CCU6

удаляем эти 2 строки:

blackpill_f401.upload.tool=stlink_upload
blackpill_f401.upload.protocol=stlink

и вставляем такие строчки:

blackpill_f401.menu.upload_method.DFUUploadMethod=DFU bootloader
blackpill_f401.menu.upload_method.DFUUploadMethod.upload.protocol=generic_dfu
blackpill_f401.menu.upload_method.DFUUploadMethod.upload.tool=dfu_upload
blackpill_f401.menu.upload_method.DFUUploadMethod.upload.usbID=0483:df11
blackpill_f401.menu.upload_method.DFUUploadMethod.upload.altID=0
blackpill_f401.menu.upload_method.DFUUploadMethod.upload.dfuse_addr=0x08000000:leave

blackpill_f401.menu.upload_method.STLinkMethod=STLink
blackpill_f401.menu.upload_method.STLinkMethod.upload.protocol=STLink
blackpill_f401.menu.upload_method.STLinkMethod.upload.tool=stlink_upload

ВСЕ!
Перезапускаете Ардуино ИДЕ и видите такую картину:

Запускаем кнопку "загрузить" и наслаждаемся:

dfu-util 0.9

Copyright 2005-2009 Weston Schmidt, Harald Welte and OpenMoko Inc.
Copyright 2010-2016 Tormod Volden and Stefan Schmidt
This program is Free Software and has ABSOLUTELY NO WARRANTY
Please report bugs to http://sourceforge.net/p/dfu-util/tickets/

Opening DFU capable USB device...
ID 0483:df11
Run-time device DFU version 011a
Claiming USB DFU Interface...
Setting Alternate Setting #0 ...
Determining device status: state = dfuERROR, status = 10
dfuERROR, clearing status
Determining device status: state = dfuIDLE, status = 0
dfuIDLE, continuing
DFU mode device DFU version 011a
Device returned transfer size 2048
DfuSe interface name: "Internal Flash  "
Downloading to address = 0x08000000, size = 19612

Download	[                         ]   0%            0 bytes
Download	[==                       ]  10%         2048 bytes
Download	[=====                    ]  20%         4096 bytes
Download	[=======                  ]  31%         6144 bytes
Download	[==========               ]  41%         8192 bytes
Download	[=============            ]  52%        10240 bytes
Download	[===============          ]  62%        12288 bytes
Download	[==================       ]  73%        14336 bytes
Download	[====================     ]  83%        16384 bytes
Download	[=======================  ]  93%        18432 bytes
Download	[=========================] 100%        19612 bytes
Download done.
File downloaded successfully

 

b707
Offline
Зарегистрирован: 26.05.2017

Да, забыл описать саму процедуру загрузки скетча в плату новым методом.

1. Подключаем плату к USB, выбираем в ИДЕ нужный порт.
2. Переводим в DFU-mode - для этого держим кнопку BOOT0 и коротко жмем NRST, через секунду отпускаем BOOT0
3. Загружаем
4. После успешной загрузки плата сама выходит из DFU-режима в режим обычного USB

USB-порт, который мы выбираем в настройках Ардуино ИДЕ перед загрузкой - для самой DFU-загрузки не важен, он нужен для того. чтобы ИДЕ могло определить окончание загрузки по возвращению в систему нормального USB-порта

Важное замечание - в момент загрузки к компу должна быть подключена ТОЛЬКО ОДНА плата блекпилл в режиме DFU - иначе утилита не будет знать, какую выбрать и может прошить не ту :) Но не думаю, что у вас будут одновременно подключены к компу целые гирлянды блекпиллов, еще и в DFU режиме :)

 

 

ЗЫ

Что-то дохрена получилось... сорри, не умею писать коротко.

Не пугайтесь, на самом деле делов-то - создать один батфайл и добавить по десятку строчек в boards и platform.txt

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

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

b707
Offline
Зарегистрирован: 26.05.2017

andriano пишет:

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

Да, перед загрузкой плата должна быть переведена в DFUmode

VE3OWW
Offline
Зарегистрирован: 14.12.2021

Всем здравствуйте, я только что зарегистрировался на этом форуме, потому,

что мне нужен совет знающих людей. Моя ситуация:

Я использую среду Arduino с надстройкой от STM для экспериментов с Blue Pill -STM32F103C8.

Я начинающий любитель, хотя имею техническое образование, но я не программист. Начинаю с малого, пытаюсь освоить STM HAL в среде Arduino.

 

Мой первый скетч (Blink) работает без вопросов.

Вот он:


/* USER CODE BEGIN Header */
/**
  ******************************************************************************
  * File Name          : my_blink_HAL_000.ino
  * Description        : Main program body
  ******************************************************************************
  *
  * A blink sketch for a "Blue Pill" Board (STM32F103C8) in STM32DUINO (STM Core)
  * Arduino 1.8.16
  * Скетч использует 21684 байт (66%) памяти устройства. Всего доступно 32768 байт.
  * Глобальные переменные используют 3524 байт (34%) динамической памяти, оставляя 6716 байт для локальных переменных. Максимум: 10240 байт.
  *
  ******************************************************************************
  */
/* USER CODE END Header */

/* Includes ------------------------------------------------------------------*/
/* USER CODE BEGIN Includes */
/* USER CODE END Includes */

/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */
/* USER CODE END PTD */

/* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */
#define LED_PIN GPIO_PIN_13
#define LED_GPIO_PORT GPIOC
/* USER CODE END PD */

/* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM */
/* USER CODE END PM */

/* Private variables ---------------------------------------------------------*/
/* USER CODE BEGIN PV */
/* USER CODE END PV */

/* Private function prototypes -----------------------------------------------*/
/* USER CODE BEGIN PFP */
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
/* USER CODE END PFP */

/* System Clock Configuration */
extern "C" void SystemClock_Config(void)
{
  RCC_OscInitTypeDef RCC_OscInitStruct = {0};
  RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};

    /**Initializes the CPU, AHB and APB busses clocks 
    */
  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
  RCC_OscInitStruct.HSEState = RCC_HSE_ON;
  RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1;
  RCC_OscInitStruct.HSIState = RCC_HSI_ON;
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
  RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL2;
  if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  {
    Error_Handler();
  }

    /**Initializes the CPU, AHB and APB busses clocks 
    */
  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
                              |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;

  if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK)
  {
    Error_Handler();
  }

    /**Enables the Clock Security System 
    */
  HAL_RCC_EnableCSS();

    /**Configure the Systick interrupt time 
    */
  HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000);

    /**Configure the Systick 
    */
  HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);

  /* SysTick_IRQn interrupt configuration */
  HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);
}

/** Configure pins as 
        * Analog 
        * Input 
        * Output
        * EVENT_OUT
        * EXTI
*/
static void MX_GPIO_Init(void)
{
  GPIO_InitTypeDef GPIO_InitStruct;
  
  /* GPIO Ports Clock Enable */
  __HAL_RCC_GPIOC_CLK_ENABLE();  

  /*Configure GPIO pin Output Level */
  HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_RESET);

  /*Configure GPIO pin : PC13 - on-board LED_PIN */
  GPIO_InitStruct.Pin = GPIO_PIN_13;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
}

void setup() {
  // put your setup code here, to run once:
  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();
  /* USER CODE BEGIN Init */
  /* USER CODE END Init */
  
  /* Configure the system clock */
  SystemClock_Config();
  /* USER CODE BEGIN SysInit */
  /* USER CODE END SysInit */
  
  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  /* USER CODE BEGIN 2 */
  HAL_Delay(500);
  /* USER CODE END 2 */
}

  /* Infinite loop */
void loop() {
  // put your main code here, to run repeatedly:
  HAL_GPIO_TogglePin(LED_GPIO_PORT, LED_PIN);
  HAL_Delay(1000);
}

 

Но я бы хотел измнить его так, чтобы не использовать loop, а использовать прерывания и немного изменил его:


/* USER CODE BEGIN Header */
/**
  ******************************************************************************
  * File Name          : my_blink_HAL_001.ino
  * Description        : Main program body
  ******************************************************************************
  *
  * A blink sketch for a "Blue Pill" Board (STM32F103C8) in STM32DUINO (STM Core)
  * Arduino 1.8.16
  * 
  * TRYING LED BLINKING WITH TIMER INTERRUPT
  * https://www.mepits.com/tutorial/551/arm/how-to-interface-arm-with-led-timer-interrupt
  *
  ******************************************************************************
  */
/* USER CODE END Header */

/* Includes ------------------------------------------------------------------*/
/* USER CODE BEGIN Includes */
/* USER CODE END Includes */

/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */
/* USER CODE END PTD */

/* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */
#define LED_PIN GPIO_PIN_13
#define LED_GPIO_PORT GPIOC
/* USER CODE END PD */

/* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM */
/* USER CODE END PM */

/* Private variables ---------------------------------------------------------*/
/* USER CODE BEGIN PV */
TIM_HandleTypeDef htim1;
/* USER CODE END PV */

/* Private function prototypes -----------------------------------------------*/
/* USER CODE BEGIN PFP */
void SystemClock_Config(void);
//void Error_Handler(void);
static void MX_GPIO_Init(void);
static void MX_TIM1_Init(void);
void TIM1_UP_IRQHandler(void);
/* USER CODE END PFP */

/* USER CODE BEGIN 0 */
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
  if(htim->Instance == TIM1) //check if the interrupt comes from TIM1
  {
    HAL_GPIO_TogglePin(LED_GPIO_PORT, LED_PIN);
  }
}
/* USER CODE END 0 */















//void TIM3_IRQHandler(void)
//{
    /* USER CODE BEGIN TIM3_IRQn 0 */
    /* USER CODE END TIM3_IRQn 0 */
    //HAL_TIM_IRQHandler(&htim3);
    /* USER CODE BEGIN TIM3_IRQn 1 */
    //HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_13);
    /* USER CODE END TIM3_IRQn 1 */
//}





















/* System Clock Configuration */
extern "C" void SystemClock_Config(void)
{
  RCC_OscInitTypeDef RCC_OscInitStruct = {0};
  RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};

    /**Initializes the CPU, AHB and APB busses clocks 
    */
  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
  RCC_OscInitStruct.HSEState = RCC_HSE_ON;
  RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1;
  RCC_OscInitStruct.HSIState = RCC_HSI_ON;
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
  RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL2;
  if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  {
    Error_Handler();
  }

    /**Initializes the CPU, AHB and APB busses clocks 
    */
  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
                              |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;

  if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK)
  {
    Error_Handler();
  }

    /**Enables the Clock Security System 
    */
  HAL_RCC_EnableCSS();

    /**Configure the Systick interrupt time 
    */
  HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000);

    /**Configure the Systick 
    */
  HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);

  /* SysTick_IRQn interrupt configuration */
  HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);
}

void TIM1_UP_IRQHandler(void) {
    /* USER CODE BEGIN TIM1_UP_IRQn 0 */
    /* USER CODE END TIM1_UP_IRQn 0 */

    HAL_TIM_IRQHandler(&htim1);

    /* USER CODE BEGIN TIM1_UP_IRQn 1 */
    /* USER CODE END TIM1_UP_IRQn 1 */
}

/* TIM1 init function */
static void MX_TIM1_Init(void)
{
  TIM_ClockConfigTypeDef sClockSourceConfig;
  TIM_MasterConfigTypeDef sMasterConfig;
  htim1.Instance = TIM1;
  htim1.Init.Prescaler = 64000;
  htim1.Init.CounterMode = TIM_COUNTERMODE_UP;
  htim1.Init.Period = 1;
  htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  htim1.Init.RepetitionCounter = 0;
  if (HAL_TIM_Base_Init(&htim1) != HAL_OK)
  {
    Error_Handler();
  }
  sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
  if (HAL_TIM_ConfigClockSource(&htim1, &sClockSourceConfig) != HAL_OK)
  {
    Error_Handler();
  }
  sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
  sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
  if (HAL_TIMEx_MasterConfigSynchronization(&htim1, &sMasterConfig) != HAL_OK)
  {
    Error_Handler();
  }
  HAL_TIM_Base_Start_IT(&htim1); // запуск таймера
}

/*
static uint32_t counter = 0;
if (counter >= 500)
{
    //HAL_GPIO_TogglePin(LED_GPIO_PORT, LED_PIN);
    counter = 0;
 }
 counter++;
*/

void TIM1_UP_IRQHandler(void) // Timer Interrupt Handler
{
  void timer1_init(int frequency) {              // Set up Timer (device specific)
  NVIC_SetPriority (TIM1_UP_IRQn, 1);            // Set Timer priority
  NVIC_EnableIRQ (TIM1_UP_IRQn);                 // Enable Timer Interrupt
  /* USER CODE BEGIN TIM1_UP_IRQn 0 */
  HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_13);
  /* USER CODE END TIM1_UP_IRQn 0 */
}


/** Configure pins as 
        * Analog 
        * Input 
        * Output
        * EVENT_OUT
        * EXTI
*/
static void MX_GPIO_Init(void)
{
  GPIO_InitTypeDef GPIO_InitStruct;
  
  /* GPIO Ports Clock Enable */
  __HAL_RCC_GPIOC_CLK_ENABLE();  

  /*Configure GPIO pin Output Level */
  HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_RESET);

  /*Configure GPIO pin : PC13 - on-board LED_PIN */
  GPIO_InitStruct.Pin = GPIO_PIN_13;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
}

void setup() {
  // put your setup code here, to run once:
  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();
  /* USER CODE BEGIN Init */
  /* USER CODE END Init */
  
  /* Configure the system clock */
  SystemClock_Config();
  /* USER CODE BEGIN SysInit */
  /* USER CODE END SysInit */
  
  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_TIM1_Init();
  /* USER CODE BEGIN 2 */
  HAL_Delay(500);
  HAL_TIM_Base_Start_IT(&htim1); //START TIMER 1 IN INTERRUPT MODE
  /* USER CODE END 2 */
}

  /* Infinite loop */
void loop() {
  // put your main code here, to run repeatedly:
  //HAL_GPIO_TogglePin(LED_GPIO_PORT, LED_PIN);
  //HAL_Delay(1000);
}

 

Однако, теперь при компиляции появляются сообщения об ошибках:

my_blink_HAL_001:204:6: error: redefinition of 'void TIM1_UP_IRQHandler()'
  204 | void TIM1_UP_IRQHandler(void) // Timer Interrupt Handler
      |      ^~~~~~~~~~~~~~~~~~
D:\Portable\arduino-1.8.16\portable\sketchbook\BLUEPILL\Blink_HAL\my_blink_HAL_001\my_blink_HAL_001.ino:155:6: note: 'void TIM1_UP_IRQHandler()' previously defined here
  155 | void TIM1_UP_IRQHandler(void) {
      |      ^~~~~~~~~~~~~~~~~~
D:\Portable\arduino-1.8.16\portable\sketchbook\BLUEPILL\Blink_HAL\my_blink_HAL_001\my_blink_HAL_001.ino: In function 'void TIM1_UP_IRQHandler()':
my_blink_HAL_001:206:35: error: a function-definition is not allowed here before '{' token
  206 |   void timer1_init(int frequency) {              // Set up Timer (device specific)
      |                                   ^
my_blink_HAL_001:223:1: error: a function-definition is not allowed here before '{' token
  223 | {
      | ^
my_blink_HAL_001:239:14: error: a function-definition is not allowed here before '{' token
  239 | void setup() {
      |              ^
my_blink_HAL_001:261:13: error: a function-definition is not allowed here before '{' token
  261 | void loop() {
      |             ^
my_blink_HAL_001:265:1: error: expected '}' at end of input
  265 | }
      | ^
D:\Portable\arduino-1.8.16\portable\sketchbook\BLUEPILL\Blink_HAL\my_blink_HAL_001\my_blink_HAL_001.ino:205:1: note: to match this '{'
  205 | {
      | ^
exit status 1
redefinition of 'void TIM1_UP_IRQHandler()'
 
 
Насколько я понимаю, происходит "задвоение" поределений 'void TIM1_UP_IRQHandler()' в скетче и в ядре SM32DUINO. Я изучал ресурс stm32duino.com, там в общем случае рекомендуют использовать файл build.opt для устранения подобных проблем, но я не имею достаточночной квалификации, чтобы понять, что именно там прописать в моем случае...
 
Буду весьма признателен за любой совет по теме....
 

 

 

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

Что в нем вашего ??? Хоть одна запятая то есть ? Arduino не может быть без setup и loop !

Зачем у вас две функции с одним именем ?

VE3OWW
Offline
Зарегистрирован: 14.12.2021

Уважаемый Komandir

Если Вы отвечаете мне:

то

1) приведенной код написан не мной и не кем либо еще, а собран в одно целое из различных источников мною лично.

2) насчет запятых - будьте любезны, развернуть вопрос....

3)  Arduino не может быть без setup и loop, но, насколько я знаю, таймеры могут обрабатываться и вне loop - и в этом состоит часть моего вопроса.

4) Зачем у вас две функции с одним именем ? Если Вас не сильно затруднит, конкретезируйте, о каких функциях речь?

 

rkit
Offline
Зарегистрирован: 23.11.2016

Вот либо ты пишешь на платформе ардуино, либо на платформе stm32cube. Одно из двух. Смешивать не получится.

 

VE3OWW
Offline
Зарегистрирован: 14.12.2021

Уважаемый rkit

Не уверен, что Вы прАвы, и тому есть пример:

https://www.stm32duino.com/viewtopic.php?t=110

 

Тем более, что мой первый пример, с использованием HAL в среде  STM3ARDUINO компилирутся и работает, как и предполагалось, без ошибок!

Однако, мне не хватает знаний, чтобы решить МОЙ вопрос! :)

rkit
Offline
Зарегистрирован: 23.11.2016

Тебе не хватает скромности, чтобы слушать что тебе говорят, а не совать не имеющую отношения вещь как какое-то доказательство, когда ты сам же говоришь, что нифига не знаешь.

VE3OWW
Offline
Зарегистрирован: 14.12.2021

Уважаемый rkit

Мне очень жаль, что вместо ответа по существу вопроса, Вы переходите на личности и даете оценку моим знаниям и возможностям, хотя мы не знакомы... 

Полагаю, что продолжение диалога с Вами не имеет смысла... Всего Вам наилучшего и с наступающими Новогодними праздиками!

p.s. Если, вдруг, в этой теме найдутся люди, владеющие вопросом, прошу ИХ подсказать, как настроить мой скетч с возможностями build.opt?