Я только начал изучать CMSIS для контроллеров ARM. Его использование кажется довольно удобным, однако мне было интересно, где же определены фактические значения регистров. Возьмем, к примеру, GPIO.
Существует структура GPIOA_AHB_Type, определенная с различными членами. Затем для GPIOB определен адрес памяти (или регистра?), Скажем, GPIOB_AHB_BASE. После этого устанавливается указатель на GPIOB_AHB_BASE, например:
#define GPIOB_AHB ((GPIOA_AHB_Type*) GPIOB_AHB_BASE)
Переменные-члены GPIOB_AHB как GPIOB_AHB-> DIR, например, для установки ввода или вывода. Мой вопрос: где именно инициализируются эти переменные-члены? Я предполагаю, что фактический адрес регистров зависит от устройства, поэтому я попытался найти их в заголовке конкретного устройства, но все, что я нашел, это определение GPIOB_AHB_BASE и объявление переменных-членов. Как компилятор узнает, что когда я набираю GPIOB_AHB-> DIR, я хочу записать в регистр, который устанавливает направление ввода-вывода этого порта?