Да, надо бы тему по STM32 поиметь. Контроллеры популярные, а для тех, кто хочет на них перейти, необходимы ответы на самые дилетантские вопросы.
Например, о выборе способа внутрисхемного программирования. Достаточно ли сигналов SWDIO и SWCLK, которые имеются на дешёвом ST-Link v2.
STM32_pgm.png
Мнения (https://www.drive2.ru/b/2228288/) разные (http://dimoon.ru/obuchalka/stm32f1/programmirovanie-stm32-chast-14-proshivaem-stm32-cherez-st-link.html), вот, например, одно из таких: Как прошить чип STM32 (https://blog.kvv213.com/2020/01/kak-proshit-chip-stm32/) ↓ спойлер ↓
Для подключения ST-LINK на STM32F103RB задействованы следующие выводы:
SWDIO (Serial Wire Data Input/Output) – PA13 SWCLK (Serial Wire Clock) – PA14 TRACESWO (Trace of Serial Wire Output, та самая SWO) – PB3
Для работы через SWIM/SWD нужно-то всего два проводка, не забываем про обязательное соединение земли по всем подключенным устройствам. TRACESWO можно не подключать, особенно если данной функцией вы не пользуетесь, да и для отладки она, а не для загрузки прошивки.
[свернуть]
BOOT1 на PB2, похоже, выведен, а BOOT0 - он отдельной ногой. Хотя вот, насколько я понимаю, он всего лишь область памяти подставляет под "старт", как это делали, например, Радио-86, Орион-128 и многие другие. Чтобы там стал быть загрузчик, его надо туда записать? Или что-то там есть? ↓ спойлер ↓
При загрузке микроконтроллера, необходимо на вывод Boot0 микроконтроллера подать высокий уровень (3.3 В), а на вывод Boot1 низкий (0 В, соединить с землей). При выполнении этих двух условий микроконтроллер запустит прошитый на заводе в чип загрузчик.
[свернуть]
Аппнот (https://www.st.com/content/ccc/resource/technical/document/application_note/b9/9b/16/3a/12/1e/40/0c/CD00167594.pdf/files/CD00167594.pdf/jcr:content/translations/en.CD00167594.pdf) говорит, что там что-то есть
Цитата: undefinedThe bootloader is stored in the internal boot ROM (system memory) of STM32 devices, and is programmed by ST during production.
А есть ли какое-то стандартизированное расположение пинов у разъёма программирования SWD/SWC
Также добавлю ссылку на простейший ликбез (https://mcucpu.ru/index.php/ucontrollers/mcu/113-mikrokontrollery-cortex-m0m3m4) о то, чем отличаются процессоры с индесами A, R, M, а также версии ядер 0, 3, 4 и 4F
Получается, наш вариант - это процики ветки M (микроконтроллеры), а версия ядра (скорее, набора исполняемых команд) 0.
зы. Не вытерпел, обзавёлся такой платой, самоё дешёвой, что была в магазине STM32_NUCLEO-F091RC.jpg На борту (https://www.st.com/content/st_com/en/products/evaluation-tools/product-evaluation-tools/mcu-mpu-eval-tools/stm32-mcu-mpu-eval-tools/stm32-nucleo-boards/nucleo-f091rc.html) STM32F091RCT6U (RAM:32k, Prog:256k - более чем достаточно для простых применений) + ST-Link, который можно юзать отдельно. Вот описательный даташит (https://www.st.com/resource/en/user_manual/dm00105823-stm32-nucleo64-boards-mb1136-stmicroelectronics.pdf) на эту серию плат - там расписаны коннекторы (на плате надписей недостаточно).
Похоже, это единственный вариант кузовов (32-ногие), у которых шаг вывода 0.8 Мне по-быстрому доступен только такой вариант (https://www.chipdip.ru/catalog/ic-microcontrollers?x.3725=sUaB&locid=tyumen-melnikayte-97&gq=stm32). Вопрос ещё в том, что пока я готовлю тот макет, никаких мыслей не пришло, где бы мог быть нужен именно STM... Лично мне хочется зацепить большой экранчик (точек на 400), например e-ink, но для вывода на такое надо всё-таки ОЗУ иметь значительных размеров. Ну или внешнее подцеплять, а для внешнего надо ноги, ноги... ATMega ведь тоже прекрасно умеет с внешним ОЗУ работать (64 или 100-ногие корпуса)
Сегодня попробовал поморгать через Куб, - блин почти 5 килобайт для дёрганья ногой... но отладка. Решил что надо копнуть. Вот в эту сторону (https://github.com/eddyem/stm32samples/tree/master/F1-nolib/led_blink). Для линукса там всё нативно, минимум изменять надо, только: Но у меня всё как не у людей, мне сейчас windows нужна, блин, ну и пришлось make flash сделать вот так: Ну и тулчейн arm конечно нужен. А так - собрал тот файл (https://github.com/eddyem/stm32samples/blob/master/F1-nolib/led_blink/main.c) - морзянкой мигает на PB3, 1130 байт, lss могу кинуть, нужен? make flash у меня прикручен в Geany к F5. Сборка F9... Остальное пока - тёмный лес :) :o
Всё туго пока... :) Сижу пытаюсь понять. Дело ещё в том, что на F030 примеров не так-то много. Использую CMSIS. Ну конечно ногодрыг первым делом. В общем вот так вышло, используя задержку, которая "dummy"... назвал её delay. В комментах немного расшифровал дефайны из stm32f030x6.h На PB3 частота 3,76 Hz. Надо SysTick_Handler задействовать и посмотреть как можно с ним общаться.
Блин, все грабли собрал, spi хардварный завёл только в кубе, и то - видеть его вижу на осциллографе - понять что он выводит - не могу... бред какой-то. Но я его добью. В итоге плюнул - написал всё ногодрыгом. :) Отправка восьмёрки выглядит так: ы. Инит забыл:
Про выбор IDE. Поставил System Workbench for STM32 (https://www.openstm32.org/System%2BWorkbench%2Bfor%2BSTM32). Основана на базе Eclipse. Посмотрю приживётся или нет.
Целые выходные читал ИзиЭлектроникс - там целая подборка про STM32 http://we.easyelectronics.ru/blog/STM32/page1/ Жаль, что пока ни к чему не пришёл...
В общем два варианта запуска TM1637 у меня получились, хард и софт. Хардверный отсюда (https://github.com/rogerdahl/stm32-tm1637). Софтверный вот тут (https://github.com/rogerdahl/stm32-tm1637). Естественно переделал чуть. Никакого open-drain как оказалось не надо, просто настроить пины как выход и скорость их работы. Чтение клавиатуры фэйковое, вот тут (https://github.com/zhaolianyang/TM1637-by-stm32/blob/master/STM32%20_%20TM1637/HARDWARE/TM1637/TM1637.c) есть ещё один вариант, но его перевести в читабельный вид не осилил. И ещё на HAL вариант (https://github.com/stDstm/Example_STM32F103/tree/master/TM1637_F103/Src). Вот софт вариант: При FDEL = 1 частота получилась 1.5 МГц - и оно таки работает на этой скорости. :) Для 100 кГц FDEL = 10 у меня, тут всё зависит от тактовой частоты. Видео (https://youtu.be/fJDJA4gs4cQ).
Цитата: undefinedпередача 8 бит данных от передатчика к приемнику завершаются дополнительным циклом (формированием 9-го тактового импульса линии SCL), при котором приемник выставляет низкий уровень сигнала на линии SDA, как признак успешного приема байта.
и даташит на TM о том же, страница 3
Цитата: undefinedTM1637 data transfer carries with answering signal ACK. For a right data transfer, an answering signal ACK is generated inside the chip to lower the DIO pin at the failing edge of the 8th clock. DIO interface wire is released at the end of the 9th clock.
Таким образом, оставляя высокий уровень на двутактном выходе в этот момент (а как его можно не оставлять?) можно получить в конце каждого байта короткое замыкание на линии SDA (DIO). Потому и используется открытый коллектор.
Выходов может быть несколько. Например, схемотехническое разделение направлений передачи сигнала на две ноги контроллера, примерно как здесь (https://5.imimg.com/data5/MA/OB/MY-1833510/tm1637-based-4-bits-red-digital-tube-led-display-module.pdf), либо перевод на время ожидания ACK вывода порта в состояние "вход с подтяжкой" (метод скользкий т.к. можно не успеть с переводом порта, да и лишние команды в цикле).
Дело в том, что если сконфигурировать порт как открытый сток нельзя подтянуть его к питанию (насколько я понял). И если делаю так: То получаю вот такую картинку, и естественно передача не работает.
Это говорит либо о наличии чрезмерной ёмкости на шине (SCL, SDA), либо о чрезмерности сопротивления резистора подтяжки. Ёмкости, которые есть на схеме, надо бы удалить. 100 пФ оптимальны для 400 кГц, не более (по спецификации ёмкости на шине не нужны, их установка преследует другие цели). Можно попробовать ткнуть измерителем ёмкости на линии шины (относительно Gnd) и посмотреть, сколько там. Если больше 20-25 пФ - это плохо. Можно (нужно бы) сделать опыт. 1. отцепить приёмник. 2. Установить православные резисторы подтяжки с вывода шины на Vcc питания STM, сопротивлением 2,2~4,7 кОм 3. Установить в качестве паразитных конденсаторы 100 пФ 4. Посмотреть осциллографом, что там будет происходить при попытке вывода туда чего-либо. Должна быть достаточно красивая картина со сглаженным передним фронтом вплоть до мегагерца. 5. Убрать конденсаторы, подключить TM и наблюдать, как изменится картинка. По результатам наблюдений делать выводы.
Да, согласен, опыт будет чуть позже. По ссылке - какой ужасный перевод, аж читать сложно.. :o И мысль пришла - мы же можем CLK сделать общую для двух линий, и повесить два модуля на три порта.
Можно. А шину данных нужно разделить. Но если делать нормальную шину, нужно выбирать чипы с адресацией (если конечно нет цели работать с периферией параллельно).
Подтянул к VCC 3 кОм, конденсаторы 68 пик только нашлись, следующий номинал 220 пик, поэтому взял меньший. Картинка 12 = 100 кГц без модуля, 13 тоже 100 кГц, но с подключенным модулем, работает нормально. 15-ая картинка - частота больше 500 кГц, модуль работает, от подключения/отключения модуля картинка не изменяется, фронты конечно похуже. В общем картинка стала больше похожей на хардверный i2c, у него фронты похуже чем на этих картинках, но работает же, может так и должно быть. При настройке портов в push-pull фронт конечно значительно лучше, прямоугольник отличный. ы. Забыл сказать - при измерениях на модуле конденсаторы на линиях убраны, резисторы (10 кОм) стоят, забыл про них.
Осталось выкинуть конденсаторы с шин SCL SDA и начать юзать (с резистором 3.3 кОм у STM) на типовой частоте 400 кГц. А прямоугольник для I2C не упёрся т.к. фиксация SDA присходит по спаду импульса.
Потому что собственная входная ёмкость TM заявляется 15 пФ, что для цифровой микросхемы вообще-то очень много. Плюс ёмкости монтажа и пр. А на "типовой схеме" ещё плюс сотня и 10 кОм, которые и делают ситуацию катастрофической. Именно поэтому I2C на больших скоростях не гоняют.
Переделанная функция инициализации для открытого стока: Едем дальше, сегодня мучал кнопку. Повесить решил её на прерывние по спаду, называется оно EXTI. Кнопка на PA0, подтянута к VCC через 10 кОм. Опять наткнулся на то, что для F1 куча примеров, для F0 - нет. Нашёл пример тут (https://radiokot.ru/forum/viewtopic.php?f=59&t=126219). Но грабли у меня продолжились - стандартное название обработчика EXTI0_1_IRQHandler() - у меня не заработало, тут надо учитывать, что у меня не стандартная CMSIS, и рабочая среда - Geany. В общем - решил, название обработчика у меня оказалось exti0_1_isr(). Вот такой получился рабочий вариант: Тут counter у меня считает на дисплее, при нажатии кнопки просто устанавливает другое значение. +++ Тут есть желание разобраться с IR пультом, насколько я понимаю тут тоже можно работать через это же прерывание? Нужен PWM input mode.
Добрался до libopencm3. Старт и мигалка из примеров, необходимые действия для stm32f030k6t6. Подготавливаем каталог для библиотек, пусть будет ~/stm32 и клонируем библиотеки и примеры. Линкуем каталог с библиотеками в каталог для библиотек с примерами, сначала удалив пустой libopencm3/ в примерах (можно скопировать, но нужно ли плодить?). Собираем библиотеку: Создаем каталог для нашего микроконтроллера и копируем каталог miniblink от stm32f0-discovery и линкер, который потом переименовываем. Открываем линкер: Изменяем rom и ram на наши (32К и 4K), те так: Все. Заходим в каталог miniblink, правим в Makefile строчку LDSCRIPT = ../stm32f030k6t6.ld, смотрим код, компилируем, прошиваем и радуемся... :)))
make V=1 - verbose output, можно опустить. make flash хочет сразу работать через openocd, пока вываливается с ошибкой у меня... make bin делает бинарник, make по умолчанию делает elf.
Прикрепляю рабочий вариант софт i2c для libopencm3, основное тут Makefile, в нём указывается путь для библиотеки и необходимые файлы... Выдергивал из официальных примеров. Документация тут (https://github.com/libopencm3/libopencm3/wiki) и тут (http://libopencm3.org/docs/latest/html/). Всё в одном каталоге, включая ld. По умолчанию хочет Black magic probe, надо бы его сделать и попробовать отладку. Как прошить в комментариях.
У них вроде конвертатор есть (фирмварь ST-link'а заменяют с возможностью восстановления обратно). https://www.segger.com/products/debug-probes/j-link/models/other-j-links/st-link-on-board/ Надо пробовать, но я завис на лабораторнике, а тянуть несколько дел одновременно не получается.
upd: у китайцев J-Link имеется, вполне вменяемо. https://sysadmin.link/?p=2522
Ну вот, только я засел на линукс... опять перегружаться... :) offtop: Я пока собрал вот так (пидб), на выходе 4хtip35с. ... получилась неплохая полочка на столе... сверху ещё кусок фанеры, брутально короче. :)))
Не, пока не могу/хочу ничего из того, что видел, да понимаю, что тыкаюсь в geany неэффективно... но нужна ли мне эффективность? Если мне всего-то и надо помигать, почитать ацп... Перешил в j-link - опять какие-то лицензии... да епрст. Мне надо, чтобы было просто и понятно, вот редактор, вот терминал, командная строка, make etc. Взглянув очередной раз на Hal, куб, эклипс понял что пока они у меня вызывают стойкое отвращение, может что-нибудь изменится... Вот например интерфейс ардуины - аж вздрагиваю, к тому, что на яве наверное никогда не привыкну. Но это сугубо моё отношение на данный момент. :))
Решил посмотреть как через чтение пина работать будет, и будет ли вообще... :) Источник (https://controllerstech.com/ir-remote-with-stm32/). Моё видео (https://youtu.be/SJL2UuyYyBY). Оно то конечно не для использования, так - побаловаться.
Решил бороться со своими привычками, они - зло. Ну сильная же штука segger, видно сразу, тут хоть часть от неё поиспользовать. ... и мимо usart никак не пройти, разбирался вчера и с тем и с тем, попутно освежив в памяти по диагонали разницу между uart и usart, опять-же плохая привычка оставлять разборки деталей на потом. В итоге в segger запустил usart? (или uart :) ) по-простому передачу и прерывание на приём, можно было сразу с dma выдрать - примеров предостаточно, но это не наш подход. Попробовал и в линукс и в вин, всё работает, терминал, дебаг etc. Не разобрался пока как переменные в отслеживание добавить... Код в процессе... лишних комментариев из разных мест много, не всё правильно. Передаёт в терминал символы, при приёме любого зажигает на чуть-чуть светодиод.
Вот ещё описание интересного инструмента от Segger https://habr.com/ru/post/259205/ и ссылка на официальную страничку https://www.segger.com/products/debug-probes/j-link/technology/about-real-time-transfer/ Насколько я понимаю, для использования нужно только включить библиотеку в код и пользоваться её функциями для вывода чего-то нужного для отладки.
зы: USART - более сложное устройство т.к. является синхронным. Краткий болтологический ликбез: https://www.rlocman.ru/review/article.html?di=164400
Кстати, SPI - это типичный USART, I2C - тоже, как и множество других. Самый прикольный пример USART - манчестерский код, который можно было просто записывать на магнитофон, чем и пользовались для хранения программ во времена Радио-86 (гы: Spectrum этот код не использовал, из-за чего вывод-ввод на магнитофон у него был более унылым).
p.s. и просто оставлю чуток ссылок в копилку ликбеза: как прошить STM32
https://blog.kvv213.com/2020/01/kak-proshit-chip-stm32/ http://dimoon.ru/obuchalka/stm32f1/programmirovanie-stm32-chast-14-proshivaem-stm32-cherez-st-link.html https://www.drive2.ru/b/2228288/ http://microsin.net/programming/arm/um1075-st-link-debugger-programmer-for-stm8-and-stm32.html Ну а что, пусть будет :)
Пытаюсь понять как назначаются альтернативные функции. Меня сейчас интересует таймер TIM1_CH1. Даташит тут (https://www.st.com/resource/en/datasheet/stm32f030f4.pdf). Reference manual (https://www.st.com/resource/en/reference_manual/dm00091010-stm32f030x4-x6-x8-xc-and-stm32f070x6-xb-advanced-arm-based-32-bit-mcus-stmicroelectronics.pdf). В сниппетсах это делается так: у меня получилось методом непонятным... вот так: Никак я с такими выкрутасами не разберусь... что и откуда берётся и как складываются две тетрады. Для PA8 TIM1_CH1 это AF2. Весь байт значит у нас находится в GPIOA->AFR[2] судя из даташита... почему в примере AFR[1]? И как получилось что он равен 0x02?
Эммм, начал искать vref у stm32f030, а его отдельного и нету. Он на vdda.
Цитата: undefinedVref- and Vref+ are only available as external pins on LQFP144, UFBGA132, LQFP100, UFBGA100, and TFBGA64 packages, otherwise they are bonded to Vssa and Vdda, respectively.
И куда же тогда точную опору ставить? На vdda/vssa? Какое напряжение тогда?
Если я правильно понимаю, VDDA ровно такой же, как и Vcc, просто питает он аналоговые цепи. Точность и "плывучесть" со всеми вытекающими напрямую зависит от точности и плывучести применённого стабилизатора питания (его можно индивидуально для VDDA забацать).
Для проведения точный измерений в таком случае всё-равно внешний АЦП с прецизионной опорой ставить, ну, или искать чип, где Ref выведен наружу...
Хм. Кнопки, может стоило в отдельнцю тему закинуть. Набрёл на вот такое решение (https://www.microchip.su/showthread.php?p=76885#post76885). Лучше конечно заранее один порт например отводить под кнопки, тогда его удобно целиком читать. Но у меня немного в разнобой вышло, но адаптировать под stm код получилось. button.h button.c
Использование вышло вот таким: Функция button_process вызывается в main, в аргументе передаётся задержка, сколько раз в миллисекундах выполнить опрос. Всё бы ничего, но вот как тут организовать повторы с инкриментом переменной при длительном удержании не могу понять... :)
Я вот несколько дней кручу-верчу этот код и... реально туплю (поди совсем старый стал). Мог бы ты пояснить, как именно он работает. Интересуют конечно не конкретные команды, а принцип. Вообще, тема опроса кнопок довольно обширна. ВО времена ДОСа и мелких компов я тоже писал работу опрос клавиатуры. Можно пообсуждать.
Ну, кроме объяснений, которые там (на микрочипе) сказать вряд-ли что смогу, я его просто адаптировал под stm. Сам не до конца понимаю как это работает. Да, дефайн (тоже где-то подсмотрен...) pin_read забыл. Вот так: Порт можно прочитать целиком так:
Ковыряю 1.77" TFT дисплей. Переделал вот этот вариант (https://forum.easyelectronics.ru/viewtopic.php?f=35&t=13281&start=50), который изначально был для F4 на F0. Проект тут (https://github.com/minamonra/my_stm_snippets/tree/main/F0/vitgo_st7735). С переферией разобрался, пытаюсь понять как со шрифтами работать, пока не понял. Вот интересная ссылка (http://www.rinkydinkelectronics.com/h_utft_fonts_101.php).