Вопрос или проблема
Я работаю над программой для STM32F103C8T6 и не смог найти константу GPIOA_OTYPER. Я хочу настроить PA0 до PA7 как push-pull для 8-битного параллельного вывода. Когда я гуглю константы, я нахожу несколько сайтов, на которых это сделано разными способами:
#define RCC_AHB1ENR (*((volatile unsigned int*)0x40023830))
#define GPIOA_MODER (*((volatile unsigned int*)0x40020000))
#define GPIOA_BSRR (*((volatile unsigned int*)0x40020018))
#define RCC_AHB1ENR RCC_BASE + 0x30
#define GPIOA_MODER GPIOA_BASE + 0x00
#define GPIOA_BSRR GPIOA_BASE + 0x18
Мы все изобретаем колесо в каждом проекте?
Разве не должно быть заголовочного файла, чтобы задать их все сразу?
Я не смог его найти, и если он есть, где я могу его найти?
Если вы определяете такие вещи самостоятельно, вы определенно изобретаете колесо заново. То, что вы ищете, это CMSIS.
Это предоставляет стандартные определения для всех ЦП ARM Cortex-M. Производители также добавляют свои собственные определения для своих продуктов, например, ST Micro имеют свои определения, которые охватывают периферийные устройства, включенные в их линию МК STM32.
Если вы создали проект с использованием STM32CubeIDE, то все эти файлы будут в директории Drivers/CMSIS
в вашем проекте.
Ответ или решение
Для работы с GPIO (например, установка выводов PA0-PA7 в режим "push-pull") на микроконтроллере STM32F103C8T6, вы правильно отметили, что определение констант вручную может привести к повторению одних и тех же усилий в разных проектах. На самом деле, существует более эффективный способ работы с такими константами через использование стандартизации, предоставляемой CMSIS.
Что такое CMSIS?
CMSIS (Cortex Microcontroller Software Interface Standard) — это стандарт, разработанный компанией ARM для упрощения программирования на базе ARM Cortex-M. В дополнение к базовым определениям и функциям, производители микроконтроллеров, такие как STMicroelectronics, добавляют свои собственные заголовочные файлы и библиотеки, обеспечивая доступ ко всем периферийным устройствам, включая GPIO.
Как работать с GPIO в STM32?
-
Подключение заголовочных файлов: Если вы создали проект в STM32CubeIDE, все необходимые заголовочные файлы находятся в директории вашего проекта:
Drivers/CMSIS/CMSIS/Device/ST/STM32F1xx/Include
. Заголовочный файл, который вам нужен, обычно называетсяstm32f103x6.h
или подобным образом. -
Определение регистров GPIO:
Чтобы установить PA0-PA7 как push-pull, вам потребуется настроить регистрMODER
(модус операций). Для этого можно использовать следующие определения, которые уже предоставлены в заголовочном файле:#define RCC_AHBENR (*((volatile unsigned int*)0x40023830)) #define GPIOA_MODER (*((volatile unsigned int*)0x40020000)) #define GPIOA_OTYPER (*((volatile unsigned int*)0x40020004))
Установка в
MODER
для PA0-PA7 в режим "output" (00) делается следующим образом:RCC->AHB1ENR |= (1 << 0); // Включаем тактирование GPIOA GPIOA->MODER &= ~((0x03 << 0) | (0x03 << 2) | (0x03 << 4) | (0x03 << 6) | (0x03 << 8) | (0x03 << 10) | (0x03 << 12) | (0x03 << 14)); // Очищаем режимы PA0-PA7 GPIOA->MODER |= (0x01 << 0) | (0x01 << 2) | (0x01 << 4) | (0x01 << 6) | (0x01 << 8) | (0x01 << 10) | (0x01 << 12) | (0x01 << 14); // Устанавливаем PA0-PA7 как output GPIOA->OTYPER &= ~((1 << 0) | (1 << 1) | (1 << 2) | (1 << 3) | (1 << 4) | (1 << 5) | (1 << 6) | (1 << 7)); // Убедитесь, что они в режиме push-pull
-
Использование стандартной библиотеки STM32: Вместо ручного определения регистров, рекомендуется использовать HAL или LL библиотеки от ST. Это абстракция, которая устраняет необходимость работы с регистрами напрямую, что делает код более прогулочным и безопасным.
Заключение
Итак, если вы занимались ручным определением регистров GPIO, это вполне нормально для изучения, но в реальных проектах рекомендуется использовать готовые решения, такие как CMSIS и HAL от STMicroelectronics. Эти библиотеки не только упростят процесс разработки, но и повысят читабельность и поддерживаемость вашего кода. Поиск заголовочных файлов и документации, такой как HAL, значительно ускорит процесс разработки и избавит вас от дублирования усилий.