Comments 43
На мой взгляд было бы круто в таких статьях описывать сначала как что-то делать "на регистрах", а потом то же самое на библиотеках HAL и с помощью CubeMX. Сейчас, как мне кажется, у статей высокий порог вхождения. Т.е. человек который ранее плотно работал с микроконтроллерами, сможет разобраться сам по даташиту и рефмануалу, а ваша статья для него лишь немного сократит время изучения. Далекий же человек, который только ардуино шил, испугается обилия наименований регистров и необходимости искать их в тысячестраничном документе. А с использованием CubeMX STM32 становится не сильно сложнее ардуино.
Одна из компаний в которой я работал ранее, изначально использовала FreeRTOS + HAL, на своих устройствах. В основном это STM32 + Nordic. Оказалось, что значительно удобнее, разработать свой HAL на регистрах, совместимый, для всех используемых архитектур. Просто подменяется репозиторий с HAL-уровнем и прошивка запускается на другом процессоре. Если уже готовые библиотеки под маленькие ARM-ы. Например libopencm3. Но иногда все же лучше на регистрах. Не всякие комбинации (портов + irq + dma + ...) поддерживают библиотеки. Например, мне приходилось делать финт ушами, когда по событию от таймера, срабатывал DMA, который пересылал данные в GPIO порт. Хотя, DMA, вроде бы привязан к таймеру, и должен просто перепсывать Reload-регистр.
Но всё эти нюансы отражены в RM и в файле имя_процессора_или_серии.h
Для радиолюбителя причины простые — сравнительно легко достать, легко прошивать м отлаживать с помощью дешёвого STLink, есть графический конфигуратор, снижающий порог вхождения.
На текущий момент Kinetis при всех своих достоинствах явно проигрывает по трём, критичным для рядового радиолюбителя, качествам:
— цена;
— наличие в рознице;
— наличие простых корпусов;
Мои же статьи, в свою очередь, ориентированны именно на рядового радиолюбителя. Так что это еще как посмотреть…
Тут: www.youtube.com/channel/UCXgs4exdtMpz4ccBZS3Yp4g
Хотя ему тоже отдельное спасибо )
С другой стороны, даже такой материал намного лучше, чем анбоксинг очередного сомнительного гаджета. Так что впечатления двойственные.
Компоновщик в ходе обработки текста программы
Компоновщик? Препроцессор! :)
__IO
Настоятельно советую показать определение этого макроса и расписать, зачем он нужен. :)
А не удобнее для вычисления значений регистров использовать операции сдвига, а не калькулятор и 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++){} // Искусственная задержка
А начальное состояние светодиодов задать разное — один горит, второй нет. Кода будет в два раза меньше, и за одно, исключаеещее или узучат.
Потому, что сейчас вы весь порт С портите, а не устанавливаете и скидываете нужные биты. т.е. вы меняете состояние всего порта.
Начинаем изучать STM32: Что такое регистры? Как с ними работать?