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 для начинающих. Урок 3. Таймеры 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. После этого настройки порта будут заморожены до следующего сброса микроконтроллера.

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

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

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

Datasheet STM32F1

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

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