Прежде чем приступить к написанию программы для микроконтроллера, нужно подключить тактирование нужных блоков, за это
отвечает регистр RCC, находим его в документации, и ищем биты , установка которых включает тактирование для нужных портов.
Находим регистр RCCAHB1ENR который тактирует порты и некоторые другие блоки. Регистр RCCAHB1ENR как мы видим имеет адрес
смещения 0x30. Сам блок тактирования RCC занимает в адресном пространстве некоторый диапазон памяти для своих регистров
управления, поэтому мы ищем адрес первого регистра RCC и складываем его с адресом смещения того регистра который нам
нужен:
Данный порядок вычисления адресации нужно хорошо запомнить, так как он будет использоваться часто и для разных блоков: адрес первого регистра нужного блока + число смещения, которое указывает на адрес нужного регистра. Числа с нужными битами можно указывать в любом исчислении, а для перевода можно использовать калькулятор windows.
В действии высше мы использовали запись и заносили число по указателю на адрес регистра. Для лучшей читаемости можно указатели заменить словами названиями регистров:
#define RCC_GPIO *((uint32_t*)0x40023830)
И для присваивания числа, уже можно записывать любое удобное имя: RCC_GPIO=0x3, RCC_PORTS=0b1000; ...
Внимание! При установлении значений в регистры, нужно смотреть, нет ли каких-нибудь значений по умолчанию в каждом регистре. Если регистр имеет значение сброса, следующая установка значений происходит через оператор "ИЛИ":
Из документации видно, что порты GPIOA и GPIOB уже имеют значения по умолчанию, поэтому установка значений будет проходить следующим образом:
GPIOA_MODER|=0x80;
GPIOB_MODER|=0x80;
Данный порядок вычисления адресации нужно хорошо запомнить, так как он будет использоваться часто и для разных блоков: адрес первого регистра нужного блока + число смещения, которое указывает на адрес нужного регистра. Числа с нужными битами можно указывать в любом исчислении, а для перевода можно использовать калькулятор windows.
В действии высше мы использовали запись и заносили число по указателю на адрес регистра. Для лучшей читаемости можно указатели заменить словами названиями регистров:
#define RCC_GPIO *((uint32_t*)0x40023830)
Внимание! При установлении значений в регистры, нужно смотреть, нет ли каких-нибудь значений по умолчанию в каждом регистре. Если регистр имеет значение сброса, следующая установка значений происходит через оператор "ИЛИ":
Из документации видно, что порты GPIOA и GPIOB уже имеют значения по умолчанию, поэтому установка значений будет проходить следующим образом:
GPIOA_MODER|=0x80;
GPIOB_MODER|=0x80;
Комментариев нет:
Отправить комментарий