STM32. CMSIS. Урок#00: Настройка: RCC, GPIO, MCO, SysTick, Delay_ms, аналог HAL_GetTick().
Вставка
- Опубліковано 23 лип 2024
- Привет друзья! Вот уже 2 года, как я изучаю STM32.
Самое время, после опыта работы с библиотекой HAL, когда мы уже более менее ознакомились с периферией микроконтроллера, начать осваивать его на низкоуровневой библиотеке CMSIS.
В первом уроке мы подключим кварцевый резонатор, настроим МК на 72 МГц, узнаем как делать инициализацию GPIO, узнаем, как подключить выход с ножки Master Clock Output, настроим системный таймер, моргнем светодиодом, напишем свою функцию задержки и параллельно увидим аналог HAL_GetTick().
00:00 Введение
01:47 Что понадобится для разработки
02:39 Разбор проекта в CubeMX
03:51 Управление GPIO на выход. Регистр BSRR
08:09 Инициализация порта и настройка GPIO
16:26 Настройка RCC
43:32 Настройка SysTick(Создаем Delay_ms и аналог HAL_GetTick())
01:00:39 Настройка MCO
Материалы из урока: github.com/Solderingironspb/S...
Мои заметки по CMSIS: github.com/Solderingironspb/S...
Группа вконтакте: solderingiron.stm32
Настройки для VisualGDB: solderingiron.stm32?w=...
ЯндексДзен: zen.yandex.ru/id/622208eed2eb... - Наука та технологія
Знаете. Ваш урок подтолкнул меня дальше продолжить изучение СТМ32.
Спасибо!!!
Олег молодец, большую работу проделал и понятным языком все изложил.
Вот вот оно наконец - то.Надеюсь вы будете и дальше выпускать видео по CMSIS.Очень крутое и полезное видео.👍
Благодарен Автору видео. Пожимаю руку.
Ищешь ищешь.. А это пожалуй лучший урок по stm32.
Великолепно! Просто. Не спеша.
Спасибо большое за твой труд друг!
Люто плюсую ! Действительно самое понятное объяснение на просторах интернета, сугубо моё личное мнение ...
Очень здорово, что тема CMSIS освещается все бОльшим количеством электронщиков) Вот пара рекомендаций:
- Регистры BRR BSRR работают как триггеры установки соответствующих бит в ODR и считывать их не требуется (скорее даже противопоказано)
- Включать HSI при старте не требуется, он уже включен по умолчанию (иначе откуда МК будет тактироваться в startup и начале main)
- HSEBYP используется для подключения внешнего тактового генератора (не резонатора)
- Не есть гуд подключать системную линию тактирования к отключенному PLL (да и к другим отключенным источникам тактирования)
- В регистре RCC_CFGR поле SWS является статусом и доступно только на чтение, записывать туда не требуется.
- Настроек SysTick в RefMan нет, так как он относится к ядру контроллера Cortex-M3, соответственно его описание будет в другом документе.
А в целом начинание хорошее, удачи!
Спасибо!)
по поводу "Не есть гуд подключать системную линию тактирования к отключенному PLL (да и к другим отключенным источникам тактирования)" отдельное, жирное СПАСИБО!) Ух и долго же я мучался с поднятием китайского-китайского GD32F103CBT6. Ни в какую дебажиться не хотел. Хотя оригинальный STM32F103C8T6 и оригинальный GD32F103CBT6 хавали и так. Помогло)
@@Solderingironspb 👍👍👍
Вообще порядок действий по установке именно для проверки себя, можно посмотреть открыв CubeMX, выбрать конфигурацию и посмотреть сгенерированный код в LL.
И еще сравнить для проверки значения регистров после инита свои и что сделал код CubeMX по желаемой конфигурации. Так же позволяет оценить где накосячил (или нет). Сейчас новичкам проще, есть CubeMX для проверки, подсказке.
а на счет буфера флеша? его ведь нужно включать только когда делитель шины отличено от 1?
У меня STM32F030, смотрю ваше видео, вникаю в свой даташит, регистры у них разные, но общий смысл понятен. Спасибо за труды!!!
У меня сейчас тоже самое, только на G030)
вау. спасибо) очень крутой видос
Круто, спасибо, отличное видео! 👍
Спасибо за видео.
Спасибо вам за урок!
Спасибо Добрый человек! :))
просто шик. спасибо)
Молодчина!
Понравилось, лайк ))
Однозначно лайк!
так, стопе, я еще атмегу8 не изучил))
Спасибо за ваш труд.
Спасибо за замечательный урок! Искал как раз как раскурить arm как раз на bluepill. Прошелся вместе с автором по шагам. Очень нравится такой подход - сначала генерируем что-то работающее, когда не знаешь даже за что взяться сначала. Потом шаримся по нужным докам вместе, и постепенно переписываем на что-то более глубокое, низкоуовневое. Пришло понимание структуры - где заканчивается stm32 и начинается cortex. Спасибо что поделились в таком подробном виде!
PS. В некоторых регистрах RCC были биты статуса (от какого источника тактирование), которые только на чтение - писать в них не нужно.
Только F103 давно устарел. Я не понимаю этот лаг в 15+ лет (столько уж F103). Одну и ту же инфу тянут друг у друга из года в год, хотя все менялось с годами и появлялись интереснее МК. Новички продолжают брать и изучать старье, т.к. им его предлагают к изучению и передавая дальше, замыкая круг. И если уж с нуля изучать то что-то актуальное, а не то что давно умерло с появлением более актуального.
Если на платке и нужен камень посовременнее и сравнимо флеша, то бери и начинай изучать F401, это уже Cortex M4F с поддержкой плавающей точки и при этом потребление в полтора раза меньше F103. А если нужно что попроще есть современный Cortex M0+ STM32G030 (есть даже 32бит и 128МГц таймер, у g030 есть все что у g031 если что, фишка st одна маска, это какой ШИМ можно замутить, бгг)).с потреблением ~4.6мА на 64МГц, это как у древнего 8бит дна AVR только на 16МГц.
Самый древний Cortex это M3, тот что F103. Потом появились M0 и M4 с переосмыслением некоторых вещей. И как бы разделение ядро M4 посложнее и камни для задач посложнее и M0 аналогично наоборот. У них кое что по своему. Например регистры GPIO у M0/M4 свои, полностью отличные от M3.
Соответственно эти уроки не подойдут. Но ты задайся вопросом, нужно ли начиная тебе брать самый первый Cortex - M3 и самый первый камень - F103 по тех процессу, которые уж несколько раз сменились. Мы ж уже не в каком нибудь 2010 году. Когда есть современнее МК, а последняя серия у ST это STM32G0/G4 на M0/M4 и M3 там даже уже нет.
Но от китайцев есть интересные современные, где знания регистров F103 не пропадут. Есть 55р энергоэффективные HC32V203. Я вот прям в данным момент с ними играюсь. Потребляет ~4.6ма на 72МГц, когда как F103 порядка 30ма при одинаковых условиях. Не хилая разница, да? И работают до 144МГц. И даже в мелком tssop20 есть и CAN и USB. Перефирия скопирована с F103, только ядро riscv, а не cortex, но если не программировать на ассемблере, то разницы нет. И свой программатор для riscv за ~150р.
Но они продаются в виде микросхем, нужно уметь сделать свою платку под МК. Может конечно это уже для кого то проблема, но имхо кто решил увлекаться сделать для себя и платку для МК должно быть частью.
У меня хобби и проекты часто не требующие много ног, поэтому интересуют чтоб в серии были корпуса tssop20 и чтоб были энергоэффективными (по этому параметру хуже f103 просто нет), соответственно такими и интересуюсь. tssop20 размер сопоставим с soic8, но 20 ног. И всегда можно перейти на мелкий QFN, если нужно еще меньше размер или на LQFP если больше ног все в рамках одного МК. stm32g030 привел, hc32v203 привел. Цена порядка 60р. Есть еще сопоставимый им gd32e220 на Cortex M23 в tssop20 и у него QFN 3x3мм, этим мог похвастаться только stm8s. Я раньше на QFN3x3 на stm8s тоже делал платки :).
Из жирных... За 300р уже можно купить "жирного" китайца AT32F403A, Cortex M4F, 1МБ флеша, 200кБ ОЗУ, 240МГц. И замутить не стесняясь что-то операционкой с цветным дисплеем с анимацией и контролами, где все будет просто летать. В AT32 все камни они делают только Cortex M4.
А на готовой платке я привел пример для старта для задач посложнее или по принципу "для всего" F401, для попроще, G030(или 31). Или уж делать свою платку для HC32V203 если хочется именно F103 изучать. Но мамонта STM32F103 жрущего как не в себя (которому ардуинщики не дают покоя и китайцы удовлетворяют их спрос клонами) на синих платках пора забыть.
@@dekus80 Я, так понимаю, эту длинную тираду ты писал в преддверье открытия канала с уроками по новым МК? А может это и есть первый урок? Когда следующий? У меня сложилось впечатление, что это писал человек под кайфом. Почитай свою писанину сам. Какой то бред.
@@dekus80ну ты выдал речь....😮 Даже не знаю что тебе сказать. А ничего что учебники математики начинаются с того, что Пифагор напридумывал? Цель этого ролика научить людей, а не управлять полетом БПЛА.
спасибо Вам!
Я для себя такую же библиотеку написал для Mega168 и Mega328. То есть не макросами ща которыми адреса регистров, а прямо реализовал шаблонный класс Register_basic, а с него уже реализовал регистры контроллера. Позапихал их в соответствующие namespace например Core, GPIO, TIMER, ADC итп. И в каждом namespace сделал функции, с названиями, соотвествующими действию битов.
копаю тут потихоньку и у меня возник вопрос. вот допустим мы пишем GPIOC->BSRR = GPIO_BSRR_13; получается мы инициализируем структуру, но она ведь нигде не объявлена, как так? Переходил по файлам, пока не дошёл до #define GPIOC ((GPIO_TypeDef *)GPIOC_BASE) это какие то корни, но не пойму что значит эта строчка((
Кстати SysTick можно настроить одной строчкой, вызвав функцию SysTick_Config(передав необходимое значение), она живет в файле от конкретного ядра, в вашем случае core_cm1.h
Доброго времени суток! Подскажите пожалуйста, вот Вы уже как с опытом, как считаете писать код на языке С++ возможно или есть какие то трудности в написании на нём ?
Уважаемый лектор, Output push-pull - не тяни талкай, а двухтактный режим выхода GPIO
👍👍👍👍👍
👍👍
👍👍👍👍
Инфа крайне полезна. Но как-то все сумбурно, человек который писал только на hal не совсем догоняет наверно че там куда сдвигать, че за чем и в какой последовательности надо делать, как-то наверно надо пустой проект создать для начала. Может лучше от hal совсем отойти, а то у вас получилось что что-то работает там что-то тут, например вы не включили порты а13,14 на отладку а значит их инит прошел где-то при помощи hal. Не сочтите за упреки просто мысли, ценность вашей работы очень велика, сам смотрел ваши видео когда бился с lcd. Еще бы добавил что в keil можно избежать процедуры инита там это само генерируется, но systick все равно писать надо. Еще если кто думает что возможно hal-а ему хватит то немного разочарую их, нет не хватит. Пример недавно на 373 мк пытался запустить adc ижекционные каналы(для своего ЛБП) на hal или LL и вы знаете бился очень долго и все равно не вышло, там в процедуре инета какая-то ошибка но найти ее в хале... во общем несколько строчек инета регистров все решило! Спасибо за труды в наше время весьма полезно!
Пустой проект я думал делать, но потом. Сделал в таком порядке, потому что, как иначе себя проверить, представьте, час программируем и потом у нас ничего не работает, потому, что в коде где-то ошибка(какой-то бит не туда поставили). А тут мы сначала моргнули светодиодом, точно знаем, что этот кусок правильный, настроили порт, проверили, и так постепенно удалили все HAL функции, оставив CMSIS. На VisualGDB режим дебага внутрях зашит, как и в keil, настраивать не нужно. Человек, после HAL вполне может не знать про битовые операции, НО, если он топает по моим урокам и просмотрел все видео, то у него вообще не должно возникать вопросов, т.к. я стараюсь все вопросы в видео освещать. А последовательность я делаю специально по битам, с 0 и на возрастание. Чтоб опять же не было вопросов, как в видео у тех, кто расскажет, а потом просто накопирует функции. Посмотрим, как будет) потихонечку разберемся)
Что нужно нажать, чтобы перейти в библиотек, где хранится указанная функция? 04:33 например
F12
1) 19:42, вместо HSION у тебя HSEON.
2) 27:38, регистр SWS, это регистр-индикатор, его не устанавливать нужно, его считывать можно/нужно.
В конечном итоге ничего не заработло....
Подскажите, как в CubeIde вкл окно с автоподстановкой когда печатаешь?
Добрый день!) если Вы про автоподстановку в дефайны, когда пишешь SET_BIT(…. То тут я сам не понимаю, почему куб не видит автоподстановку в них. И где это включить тоже не знаю…
@@Solderingironspb У меня он ее вообще не делает)
Например у вас на 4:54 появилось окно с разными GPIO_BSRR_BR.. У меня он даже его не выводит
Ну вот я про это и говорю, что в дефайн не работает автоподстановка в кубе. Пока так и не понял, где это включать.
Супер! Но если заранее подготовить код и пройтись по нему с объяснениями, то видео не будет так затянуто, а смотреть будет интересней и количество полученной инфы будет то же.
Заранее подготовить код тоже не всегда хорошо, т.к. бывает скакать приходится по рефмануалу, а просто копировать и вставлять функции - это далеко не всем понятно. Многие блогеры этим грешат. Расскажут все по порядку и все вроде хорошо, а потом просто влепят кусок кода, где порядок выполнения команд нарушен, а почему так - блогер уже не говорит. В итоге человек, смотрящий это все - теряется. Кстати, у меня заранее подготовлен код, можете даже глянуть заметки по cmsis. Ссылка под видео. Я там единый файл с комментами бомблю потихонечку. Комментов миллион)
@@Solderingironspb Есть такой блогер Александр Писанец микроконтроллеры AVR ,так я по его урокам учился.Считаю именно такой формат преподавания очень эффективным.
все хорошо ,только ля работы на регистрах было бы лучше на Keil или IAR писать - там все от первой и до последней буквы можно на низком уровне настраивать.
Так тут тоже. Разницы нет совершенно никакой)
@@Solderingironspb настройка в Кубе тактирования тоже съедает память) ну это так -в общем отличная работа!
Регистр BSRR по идее доступен только для записи, макрос setbit - это чтение/модификация/запись. То есть, для того, чтобы записать в регистр, мы его должны с начала считать. Если сейчас все работает, то в будущем, по этому адресу могут свободно жить какие-то данные, например статусы, доступные только для чтения, и результаты работы будут крайне интересны...
Чего?)
#define SET_BIT(REG, BIT) ((REG) | = (BIT))
Мы просто добавляем в регистр 1. Все.
Олег, выражение reg|=bit буквально обозначает reg = reg | bit, то есть в начале процессор читает регистр...
@@stepanovvictor9307 ну тогда WRITE_REG использовать?
В данном случае да. Ошибка вообще типовая. Подобное некогда давал студентам в практике поиска ошибок для at94, в софтовой переферии можно накрутить что угодно ;-)
@@stepanovvictor9307 хм, а как же тогда если там уже есть какие то данные, и нам нужно изменить только один бит, а записью = мы перепишем все...
А почему вы статусные регистры задаете , разве они не устанавливаются аппаратно?
Укажите минуту видео, пожалуйста, чтоб мне соориентировать по Вашему вопросу.
@@SolderingironspbНу например 26:14 там регистр sws вы его задали , хотя там написано что он указывает что sw установился, или например на уроке про usart вы вместо того чтобы проверить txe вы проверяете txeie
В плане обучения запрограммировал RCC через регистры, а потом думаю и нафига я это делал, включил в МХ вместо HAL, LL и все дела. Но главное даже не в этом, если нужно добавить еще периферию, уже в процессе кодинга, то только руками, MX все снесет, если где то лоханешься и чего нибудь не туда перенесешь. Приведите примеры, где программирование на CMSIS крайне необходимо.
Подняв однажды всю периферию на CMSIS - пропадет проблема с кодингом других микроконтроллеров, т.к. основы уже будут. Я так спокойно теперь программирую RISC-V на RVMSIS. А там нет CubeMX. Пример, где программирование на CMSIS крайне необходимо - вывод информации на дисплей по тому же spi интерфейсу.
Ну в принципе я потому и начал это смотреть, поскольку сейчас как раз экран по spi надо подключить, но начал на G474, смотрел как это сделано на 103, а потом переносил на 474. Беда в том, что общего там меньше чем отличий, вот и возник вопрос: а зачем так углубляться? Я это сделал и через день уже ничего не помню, а если возьму H743, который на полке пока лежит, то там наверняка будет море новых сюжетов. Так что в раздумиях, а надо ли это и если надо, то где.
что самое печальное, так это то что такие ролики набирают крайне мало просмотров. Давайте запилим совместный ролик ну или вы каким то образом мне поможете или подскажите с проектом. А я в своем ролике сделаю рекламную вставку...
Привет!) Я, как в таковой рекламе не нуждаюсь, т.к. себя за блогера-то не считаю). Все видео на канале - это побочка от моих занятий (Расскажи будущему себе, что ты тут делал, чтоб не забыть). Всегда считал, что кому надо - тот найдет и посмотрит). Совместные проекты можно делать, главное, чтоб интересные были)
@@Solderingironspb я понял. тогда если что нибудь придумаю, напишу)
Договорились 🤝
Там один бит наверное должен называтся HSION ато вы HSEON включили два раза
Сначало ушли с stdperif на HAl, а теперь на сmsis.
Конечно спасибо, но для чего это все нужно? Всегда же можно пойти во внутрь hal и посмотреть как оно там все через регистры работает
Насчет уроков.... narod stream и sappise и NR.electronics достаточно много сделали на эту тему.
Для чего это нужно: мой канал о самообучении. Я сам учусь и с другими делюсь. Вообще не ориентируюсь на то, кто и что пишет). Если бы HAL внутри был такой очевидный и простой, то конечно, я бы не читал рефмануал, т.к. итак все понятно было бы, но это не так.
Еще бы ll библиотеки....
Оказывается что это не слова управляют микроконтроллером!))))))))))))))))) Во ты программист мощный . Ну хорошо хоть сейчас понял. Это все называется макросы и они делаются чтоб ты не писал цифры а писал обстракции а не цифры, а так ты должен прописывать адреса памяти и значение которое ты туда хошь занести все в hex ну или bin как пожелаешь))
hal это как C, cmsis как ассемблер, уровень регистров. Если слабый контроллер и использовать по максимуму но cmsis, hal для всего остального
А ассемблер в данном случае как машинный код получается?
@@micromaster4405 Забудьте о нем! Кроме супер-быстрых микросекунды - прерываний - он не нужен. А еще больше не нужны прерывания с такой частотой
@@vicgreen1413 ну 10-20 кГц прерывания очень даже нужны в определенных случаях, а с помощью дизассемблера удобно работу fpu как минимум проверять
@@vitgo Написание на ASM, на мой взгляд, это полное неуважение к решению поставленной задачи, презрительное отношение к качеству выполняемого решения, ничем неоправданное затягивание времени исполнения и полное игнорирование возможности повторного использования кода и комфортного сопровождения продукта в течении всего жизненного цикла
@@vitgo Ну а HAL, в имполнении STM - это превращение любого процессора в продвинутый вариант i8080
А не кто не проюывал битовые поля юзаь ...
Головная боль этот CMSIS, не зря придумали HAL
Если хорошо знать МК и долго сидеть на нем, то не такой уж головняк. За 2-4 часа напишете инит нужной периферии, потом распишете ее работу, а далее уже будете, как функции использовать. Для работы с теми же дисплеями на spi, CMSIS, как никогда кстати). Там HAL в скорости проигрывает далеко не в 2 раза.
@@Solderingironspb инициализацию переферии делать на HAL в конфигураторе cube, а реализацию методов уже на cmsis. Иначе только жить в обнимку с этим референс мануалом и ловить бесконечные ошибки-проблемы при инициализации
Можно и так
@@Solderingironspb А еще лучше перемолоть то, что выдает HAL или LL и тогда наступит счастье. Код становиться понятным и предсказуемым
Нет в инете нормального начала для прграммирования! Попробуйте объяснить программирование так, как дети изучают жизнь, а именно они сперва копируют всё что видят, строят кубики, пирамидки а уж потом от простого к сложному постигают основы жизни, идут в школу, идут в вузы. А по ходу всё обучение в инете показывают типа как студенты вышки пишут интегралы, а что, зачем, большинству туго доходит. Потому как никто не задумывается о том как он доносит инфу
У вас не правильно прописан бит FLASH_ACR_LATENCY_2 . Если посмотреть в регистрах что это значит, то это 0х4, и это не 010 который вы использовали. Похоже нужно писать FLASH_ACR_LATENCY_1
хотя я посмотрел у всех по разному в файле cmsis описан этот бит. можете просто проверить..
LATENCY: Latency
These bits represent the ratio of the SYSCLK (system clock) period to the Flash access
time.
000 Zero wait state, if 0 < SYSCLK
@@Solderingironspb а я как то случайно заметил. и сначала долго не мог понять как же так