Немного о регистрах GPIO STM32
Эта заметка написана по мотивам статьи EdwinFairchild.
Другая не менее полезная статья находится тут
Физические контакты (пины) и их группы (порты)
У каждой модели микроконтроллеров есть определенное число контактов (пинов), которые могут быть некоторым образом использованы. Количество этих пинов зависит от физических характеристик и прежде всего от корпуса. Видимо есть какие-то стандарты на размеры пинов и расстояний между ними. Это накладывает ограничения на количество пинов с каждой стороны корпуса микроконтроллера.
Например, в статье автора упоминается корпус LQFP48, который имеет 48 пинов, по 12 с каждой стороны корпуса. Используемые мной STM32F401CCU6, STM32F401CCU6 и даже STM32F103C8T6 также выполнены в корпусе LQFP48.
Все пины объединены в так называемые порты - группы по 16 штук в каждом порту. Порты именуются буквами алфавита. Таким образом для упомянутого корпуса теоретически могли бы быть действительны порты GPIOA (0-15), GPIOB (16-31), GPIOC (32-47). Однако это не так из-за того, что часть пинов используются для целей питания микроконтроллера, функции сброса, работы с сигналами тактирования и т.п. Информацию о количестве портов можно найти в datasheet.
У STM32F103C8T6 всего 37 пинов могут выполнять функцию GPIO. Причем часть из них, вероятно, не смогут быть использованы как GPIO, но будут выполнять функцию соединения с внешними источниками тактирования. Так, согласно dataseet, у этой модели есть GPIOA (0-15), GPIOB (0-15) и только три штуки GPIOC (13-15), а также два пина GPIOD (0,1). Остается также заметить, что пронумерованные пины расположены отнюдь не в порядке убывания или возрастания номеров на корпусе, а "хаотично". Видимо это связано с физической возможнсотью схемотехники и общих принципов проектирования различных моделей микроконтроллеров STM32.
Как ни странно, но у STM32F401CCU6 и STM32F411CCU6 только 36 соответствующих пинов из 48. Компоновка их тоже отличается: GPIOA (0-15), GPIOB (0-10,12-15), GPIOC (13-15), GPIOH (0). Стоит отметить, что по каким-то причинам GPIOB11 нет, а GPIOH0 представлен дважды.
Регистры
Для программирования функциональности тех или иных пинов, в памяти микроконтроллера выделены специальные области - регистры. Эти области памяти связаны с конкретными периферийными блоками микроконтроллера. Так как микроконтроллер 32-разрядный, то все его регистры имеют одинаковый размер - 32 бита. Каждый из битов этих регистров можно рассматривать как отдельный включатель или выключатель чего-то. Иногда эти биты выполняют какую-то функцию по одиночке, а иногда для активации какой-либо функции требуется "включить" или "выключить" сразу несколько из них.
Так как каждый регистр - это ячейка памяти микроконтроллера, то каждому регистру соответствует некоторый адрес - номер ячейки. В документации к микроконтроллеру (dataseet и reference manual) часто можно встретить числовые (шестнадцатиричные) адреса регистров. Однако, забегая вперед можно сказать, что разработчиками ядра ARM и микроконтроллеров STM32 разработаны целые наборы символических обозначений для каждого из адресов регистров и даже отдельных их битов. Эти сведения собраны в заголовочных файлах на языке С и всегда используются программистами для ускорения и упрощения работы с регистрами - проще запомнить символическое имя регистра, чем его номер.
Разные модели микроконтроллеров могут иметь особенности, связанные с регистрами GPIO.
В STM32F103C8T6 каждый порт имеет два 32-разрядных конфигурационных регистра GPIOx_CRL и GPIOx_CRH, два 32-разрядных регистра данных GPIOx_IDR и GPIOx_ODR, один 32-разрядный регистр сброса/установки GPIOx_BSRR, один 16-разрядный регистр сброса GPIOx_BRR и один 32-разрядный регистр блокировки GPIOx_LCKR.
В STM32F401CCU6 и STM32F411CCU6 каждый порт имеет четыре 32-разрядных конфигурационных регистра GPIOx_MODER, GPIOx_OTYPER, GPIOx_OSPEEDR и GPIOx_PUPDR, два 32-разрядных регистра данных GPIOx_IDR и GPIOx_ODR, один 32-разрядный регистр сброса/установки GPIOx_BSRR, один 32-разрядный регистр блокировки GPIOx_LCKR и два 32-разрядных регистра альтернативных функций GPIOx_AFRH и GPIOx_AFRL.