STM32. CMSIS. Урок#00: Настройка: RCC, GPIO, MCO, SysTick, Delay_ms, аналог HAL_GetTick().

preview_player
Показать описание
Привет друзья! Вот уже 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

Рекомендации по теме
Комментарии
Автор

Олег молодец, большую работу проделал и понятным языком все изложил.

БариновАндрей-ьъ
Автор

Очень здорово, что тема CMSIS освещается все бОльшим количеством электронщиков) Вот пара рекомендаций:
- Регистры BRR BSRR работают как триггеры установки соответствующих бит в ODR и считывать их не требуется (скорее даже противопоказано)
- Включать HSI при старте не требуется, он уже включен по умолчанию (иначе откуда МК будет тактироваться в startup и начале main)
- HSEBYP используется для подключения внешнего тактового генератора (не резонатора)
- Не есть гуд подключать системную линию тактирования к отключенному PLL (да и к другим отключенным источникам тактирования)
- В регистре RCC_CFGR поле SWS является статусом и доступно только на чтение, записывать туда не требуется.
- Настроек SysTick в RefMan нет, так как он относится к ядру контроллера Cortex-M3, соответственно его описание будет в другом документе.

А в целом начинание хорошее, удачи!

KARMAElectronics
Автор

Благодарен Автору видео. Пожимаю руку.

antonGoldinov
Автор

У меня STM32F030, смотрю ваше видео, вникаю в свой даташит, регистры у них разные, но общий смысл понятен. Спасибо за труды!!!

svbHiTek
Автор

Люто плюсую ! Действительно самое понятное объяснение на просторах интернета, сугубо моё личное мнение ...

Alex-edhg
Автор

Знаете. Ваш урок подтолкнул меня дальше продолжить изучение СТМ32.

Спасибо!!!

megavolttt
Автор

Ищешь ищешь.. А это пожалуй лучший урок по stm32.

megavolttt
Автор

Вот вот оно наконец - то.Надеюсь вы будете и дальше выпускать видео по CMSIS.Очень крутое и полезное видео.👍

artstone
Автор

Спасибо за замечательный урок! Искал как раз как раскурить arm как раз на bluepill. Прошелся вместе с автором по шагам. Очень нравится такой подход - сначала генерируем что-то работающее, когда не знаешь даже за что взяться сначала. Потом шаримся по нужным докам вместе, и постепенно переписываем на что-то более глубокое, низкоуовневое. Пришло понимание структуры - где заканчивается stm32 и начинается cortex. Спасибо что поделились в таком подробном виде!

PS. В некоторых регистрах RCC были биты статуса (от какого источника тактирование), которые только на чтение - писать в них не нужно.

wave
Автор

так, стопе, я еще атмегу8 не изучил))
Спасибо за ваш труд.

АлександрСветлый-хя
Автор

1) 19:42, вместо HSION у тебя HSEON.
2) 27:38, регистр SWS, это регистр-индикатор, его не устанавливать нужно, его считывать можно/нужно.


В конечном итоге ничего не заработло....

aleksandrdrobyshev
Автор

Я для себя такую же библиотеку написал для Mega168 и Mega328. То есть не макросами ща которыми адреса регистров, а прямо реализовал шаблонный класс Register_basic, а с него уже реализовал регистры контроллера. Позапихал их в соответствующие namespace например Core, GPIO, TIMER, ADC итп. И в каждом namespace сделал функции, с названиями, соотвествующими действию битов.

Funkbass
Автор

Кстати SysTick можно настроить одной строчкой, вызвав функцию SysTick_Config(передав необходимое значение), она живет в файле от конкретного ядра, в вашем случае core_cm1.h

svbHiTek
Автор

копаю тут потихоньку и у меня возник вопрос. вот допустим мы пишем GPIOC->BSRR = GPIO_BSRR_13; получается мы инициализируем структуру, но она ведь нигде не объявлена, как так? Переходил по файлам, пока не дошёл до #define GPIOC ((GPIO_TypeDef *)GPIOC_BASE) это какие то корни, но не пойму что значит эта строчка((

openFrimeTv
Автор

Доброго времени суток! Подскажите пожалуйста, вот Вы уже как с опытом, как считаете писать код на языке С++ возможно или есть какие то трудности в написании на нём ?

ВиталийБорисов-мя
Автор

Что нужно нажать, чтобы перейти в библиотек, где хранится указанная функция? 04:33 например

СергейГолованов-ле
Автор

Добрый день Олег, такой вопрос, уже голову сломал, не помню у вас ли видел в каком то видео, как вы сделал bat файл, который делает чистый проект в CubeIDE, или не у вас, подскажите пожалуйста.

svbHiTek
Автор

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

openFrimeTv
Автор

Уважаемый лектор, Output push-pull - не тяни талкай, а двухтактный режим выхода GPIO

Тесла-фв
Автор

А почему вы статусные регистры задаете, разве они не устанавливаются аппаратно?

harlk