STM32 Без HAL и SPL. Часть 1. GPIO

Автор: | 02.12.2018

Для инициализации периферии и последующей работы с микроконтроллерами STM32 на сегодняшний день существует 3 решения. Первый и самый тернистый это непосредственная работа с регистрами контроллера при помощи библиотеки CMSIS. Второй  это библиотека SPL, которую на сегодняшний день уже прекратили развивать. И последний это современная библиотека HAL и среда CubeMX. Оба последних варианта по своему хороши, и позволяют абстрагироваться от нюансов работы контроллера. Однако, если вы решили окунуться в мир микроконтроллеров с головой, то для лучшего понимания работы контроллеров семейства STM32 , можно спуститься до уровня регистров и посмотреть что же там происходит на самом деле. Итак, сегодня мы начнем с системы ввода вывода микроконтроллера STM32 серии F1.

GPIO

За работу портов ввода-вывода микроконтроллера отвечаю регистры GPIOx_CRL, GPIOx_CRH, GPIOx_IDR, GPIOx_ODR, GPIOx_BSRR, GPIOx_BRR и GPIOx_LCKR. Давайте рассмотрим каждый регистр подробнее.

Общая конфигурация разрядов портов осуществляется при помощи пары регистров GPIOx_CRL и GPIOx_CRH. Вместо x соответсвующая буква порта. GPIOx_CRL отвечает за младшие 8 бит порта (0..7 разряды), GPIOx_CRH за старшие (8..15 разряды). За конфигурацию одного разряда, отвечают 2 пары битов данных регистров MODE и CNF. Для того чтобы понять каким образом выбрать необходимый режим работы порта, взглянем на следующие две таблицы из даташита.

Данные таблицы отлично показывают какие значение необходимо записать в биты CNF и MODE для выбора необходимого режима работы разряда порта, задания режима “подтяжки” и максимальной скорости порта. Например чтобы настроить порт для работы в двухтактном режиме вывода с максимальной скоростью 2МГц необходимо биты CNF0, CNF1 и MODE0  установить в 0, а бит MODE1 установить равным 1. Аналогично по данной таблице легко найти как выбрать другие режимы работы.

Читайте также  STM32.Встроенный датчик температуры.

Как видно из первой таблицы, при работе с выводом микроконтроллера, так же имеет значение некий бит PxODR,содержащийся в регистре  GPIOx_ODR, давайте перейдем к нему.

Как видно, данный регистр отвечает за выходные данные порта. То есть при записи в соответствующий бит 1, на соответствующем выводе контроллера установится состояние логической единицы, и наоборот. При работе вывода на вход, данный регистр позволяет выбирать режим его подтяжки. Номер бита соответствует ножке порта контроллера.

Следующий регистром рассмотренным нами станет регистр  GPIOx_IDR. Его содержимое представлено на изображении ниже.

 

Данный регистр содержит 16 бит данных каждого вывода одного порта. Данный регистр доступен только для чтения.

Дополнительно существуют 2 регистра позволяющие производить атомарные установку и сброс выводов контроллера. Тем самым можно произвести установку или сброс порта, путем одной операции записи которую невозможно прервать. Достичь этого позволяют регистры GPIOx_BSRR и GPIOx_BRR.

Рассмотрим их содержимое.

Каждый бит данных регистров  позволяет совершить одну атомарную операцию с выбранным битом порта. Биты BR и BS регистра GPIOx_BSRR при записи в них 1, позволяют произвести сброс или установку соответствующего вывода контроллера. Биты BR регистра GPIOx_BRR позволяет производить лишь сброс выводов портов.

Дополнительно в микроконтроллеры STM32 встроен механизм блокировки настроек порта. Данный механизм позволит Вам избежать некоторых ошибок при разработке программ. Реализация блокировки осуществляется при помощи регистра GPIOx_LCKR. Его содержимое описано ниже.

Биты LCK0..LCK15, позволяют выбрать блокируемый вывод. То есть, при записи 1 в соответствующий бит регистра, будет производиться блокировка соответствующего разряда вывода контроллера. После установки необходимых битов LCK0..LCK15 следует произвести запись блокирующей последовательности в бит LCKK. Последовательность следующая: Записать в бит 1, затем 0, снова 1, после этого считать 0 и наконец считать 1. После этого настройки порта будут заморожены до следующего сброса микроконтроллера.

Читайте также  AVR для начинающих. Урок 15. Регистры EEPROM.

Ну и наконец, пример инициализации порта для работы в режиме альтернативной функции, с подтяжкой к + питания

Спасибо за внимание!

Datasheet STM32F1

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *