Как стать автором
Обновить

Комментарии 43

Хорошее дело делаете, так держать. Всегда положительно отношусь к авторскому материалу в отличие от большинства корпоративных статей
Будем дальше держать планку, спасибо!)
Согласен, хорошо написано, можно студентам показывать, для ознакомления — язык понятный, все разжевано — само то, что надо.
Мне кажется так удобнее в Keil смотреть GPIO
image
Не видел такое меню, копну по глубже при рассмотрении вопросов по GPIO)) спасибо))))
Не стоит привязывать такие статьи к конкретному инструменту разработки. Они ценны именно подробностью и понятностью, когда всё делаем сами, а не делает за нас кайло/куб/etc.
Не только GPIO
image
image
image
image
Сразу возник вопрос, всегда ли отдельные биты конфигурационных регистров отвечают за отдельные настройки или бывают «номерные» режимы переключающие режим на основании совокупности нескольких бит (т.е. mode 0,1,2,3,4,5,6,7,8 задают 9 валидных режимов, остальные сочетания бит байта не используются, а не 256 сочетаний 8 двоичных режимов)?
Для тех кто научился ориентироваться в Reference manual — думаю не составит труда правильно интерпретировать настройки находящиеся в регистре. Думаю по прочтению этого урока у начинающих будет заложена основа при работе с документацией и регистрами))

На мой взгляд было бы круто в таких статьях описывать сначала как что-то делать "на регистрах", а потом то же самое на библиотеках HAL и с помощью CubeMX. Сейчас, как мне кажется, у статей высокий порог вхождения. Т.е. человек который ранее плотно работал с микроконтроллерами, сможет разобраться сам по даташиту и рефмануалу, а ваша статья для него лишь немного сократит время изучения. Далекий же человек, который только ардуино шил, испугается обилия наименований регистров и необходимости искать их в тысячестраничном документе. А с использованием CubeMX STM32 становится не сильно сложнее ардуино.

Одна из компаний в которой я работал ранее, изначально использовала FreeRTOS + HAL, на своих устройствах. В основном это STM32 + Nordic. Оказалось, что значительно удобнее, разработать свой HAL на регистрах, совместимый, для всех используемых архитектур. Просто подменяется репозиторий с HAL-уровнем и прошивка запускается на другом процессоре. Если уже готовые библиотеки под маленькие ARM-ы. Например libopencm3. Но иногда все же лучше на регистрах. Не всякие комбинации (портов + irq + dma + ...) поддерживают библиотеки. Например, мне приходилось делать финт ушами, когда по событию от таймера, срабатывал DMA, который пересылал данные в GPIO порт. Хотя, DMA, вроде бы привязан к таймеру, и должен просто перепсывать Reload-регистр.

Конечно, как и в жизни, бывают многобитовые настройки.
Но всё эти нюансы отражены в RM и в файле имя_процессора_или_серии.h
Свет клином что ли сошолся на stm32, полно ведь других мк гораздо лучше/выше/быстрее/сильнее.

Для радиолюбителя причины простые — сравнительно легко достать, легко прошивать м отлаживать с помощью дешёвого STLink, есть графический конфигуратор, снижающий порог вхождения.

Приведите пожалуйста пример с конкретными аргументами. Возможно если речь идет о каких-то интересных МК — я бы и их рассмотрел в своих статьях, почему нет)))
kinetis и design studio любые кубы и стм32 заткнет за пояс например.
Я бы на вашем месте не делал столь категоричных высказываний.
На текущий момент Kinetis при всех своих достоинствах явно проигрывает по трём, критичным для рядового радиолюбителя, качествам:
— цена;
— наличие в рознице;
— наличие простых корпусов;
Мои же статьи, в свою очередь, ориентированны именно на рядового радиолюбителя. Так что это еще как посмотреть…
Сам вот сел его изучать. Спасибо за статьи, добавьте пожалуйста немного HAL в дальнейшем.
Приму к сведению Ваши пожелания, могу так же посоветовать вам посмотреть по HAL много хороших видеоуроков на канале narod stream в Youtube.
Тут: www.youtube.com/channel/UCXgs4exdtMpz4ccBZS3Yp4g
Спасибо, обязательно ознакомлюсь.
Товарищ рассказывает многое, но без основ, дает голую инструкцию, редко опускаясь в глубь на тему — почему так. Обычно ссылается на свой же курс по атмеловским железкам. И смотреть его надо последовательно, тоже из за постоянных ссылок — вот в прошлом уроке…
Хотя ему тоже отдельное спасибо )
У него по большей части простой how-to, когда не знаешь с чего начать — можно посмотреть, а в глубинных вопросах уже копаться и разбираться самому.
Не знаешь с чего начать — RTFM=)
Как вариант)))
Я, конечно извиняюсь, но логика изложения очень странная. Тем, кто уже разбирается в микроконтроллерах это не нужно, а новичку будет очень тяжело. Как-то резво мы перещли от двоичной алгебры к тактированию переферии, настройке GPIO и тд. Если бы я заранее не знал, что это и зачем, то схватился бы в ужасе за голову.

С другой стороны, даже такой материал намного лучше, чем анбоксинг очередного сомнительного гаджета. Так что впечатления двойственные.
Возможно и так, но в целом я ставил себе целью данной статьи не рассмотрение вопросов тактирования и GPIO а работу с регистрами на конкретном примере.
Проблема в том, что вы используете для демонстрации примера вещи, которые новичкам еще не известны, хотя по правильной логике изложения пример должен наоборот показывать, как изучаемое ложится на уже изученное ранее.
Пишите именно то, чего не хватает во всех остальных курсах. Огромное вам спасибо!
А почему значения в регистры пишутся сразу, без предварительного считывания? Написано что не будем менять остальные настройки. Или у STM меняется только тот бит, который был записан?
Там со считыванием.
(x |= y) эквивалентно (x = x | y)
Компоновщик в ходе обработки текста программы

Компоновщик? Препроцессор! :)

__IO

Настоятельно советую показать определение этого макроса и расписать, зачем он нужен. :)
Спасибо за исправление!) поправил в статье)))
uint32_t volatile * const (и дважды const для read-only) для неподготовленного читателя совсем страшно, всё-таки такие вещи довольно архаичны и малоупотребимы даже для С.
К сожалению, именно вот эти вещи фундаментальны, потому что именно на таких вещах определяется будет программа работать или нет. И пока читатель не уяснит, зачем нужно адрес регистра помещать в переменную с квалификатором volatile, его программы будут порождать массу глюков в процессе работы в зависимости от погоды на Марсе.
Для полноты описания не хватает упоминание регистров BSRR и BRR.
Это всё в статье про GPIO рассмотрим.

А не удобнее для вычисления значений регистров использовать операции сдвига, а не калькулятор и hex-значение? При чтении потом не понятно, какой бит изменяется.
Я имею ввиду, что вместо:


GPIOC->MODER |= 0x50000;

использовать:


GPIOC->MODER |= (1<<16)|(1<<18);

Конкретно в этом месте, в "настоящем" коде наверное используют буквенное обозначение, а я про использование калькулятора вцелом.

Можно и таким образом, почему нет. Опорный материал по битовым операциям был дан))) тут если кому как хочется — может поэкспериментировать.
Раз уж вы рассказали про логические операции, то можно было так:
/* Моргаем светодиодами */
		GPIOC->ODR ^= (uint32_t)((GPIO_ODR_8 | GPIO_ODR_9);
		for (int i=0; i<DEL_COUNT; i++){}	// Искусственная задержка

А начальное состояние светодиодов задать разное — один горит, второй нет. Кода будет в два раза меньше, и за одно, исключаеещее или узучат.
Потому, что сейчас вы весь порт С портите, а не устанавливаете и скидываете нужные биты. т.е. вы меняете состояние всего порта.
Спасибо автору!!! Поддерживанию стиль изложения, я последний раз использовал язык С в далекие институтские времена, запустил (поморгал св. диодом) давно пылящуюся синюю китайскую плату. Контроллер там STM32f103C8.
Желаю всем изучающим STM32 стойкости, оптимизма, и очень много свободного времени. Они вам понадобятся ;)
Отличный курс по STM32 будет, пишите про CMSIS. HAL, CubeMX и прочего и так хватает. Спасибо.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории