Выполнить 8-битную запись в 32-битный регистр - PullRequest
1 голос
/ 07 апреля 2019

Я пытаюсь прочитать значение clock source данного generic clock generator на микроконтроллере Samd21.

Лист данных говорит, что если я хочу прочитать регистр GENCTRL (содержащий значение источника синхронизации), мне нужно «сделать 8-битную запись» и впоследствии прочитать регистр.Как я могу это сделать, учитывая, что регистр 32-битный?

Боюсь, что, выполнив следующее, я на самом деле изменяю конфигурацию generic clock generator X:

GCLK->GENCTRL.reg = GCLK->GENCTRL.reg & 0xFFFFFFF0 | 0x0000000X

Имейте в виду, что младшие 8 бит GENCTRL зарезервированы для общего идентификатора генератора тактовых импульсов.

Сильфон является частью таблицы данных , содержащей инструкции для чтения регистра GENCTRL.

Datasheet

1 Ответ

1 голос
/ 08 апреля 2019

Регистры ARM являются 32-битными. Периферийные регистры (в общем случае) будут расположены со смещением в 4 байта, но не всегда будут реализовывать все 32 бита, которые это подразумевает.

Это наиболее очевидно, когда верхние биты периферийного регистра «читаются как ноль, запись игнорируется». Иногда вы можете увидеть более новую или более функциональную версию периферийного устройства, где некоторые из этих неиспользуемых битов будут использоваться в будущем.

В зависимости от того, как конкретно определенное периферийное устройство подключено к ядру, обычно можно осуществлять доступ к байту, полуслову или слову в любой области памяти. Если это поддерживается, будут обновлены только соответствующие байты. Там, где есть ограничение (например, 32-битная шина APB, где поддерживается только байтовый доступ), это должно быть четко указано в документации. С процессором AA64 можно даже записать два регистра одновременно!

Обратите внимание, что периферийное устройство «знает» размер доступа (по крайней мере, информация присутствует на внутренней шине), поэтому можно указать другое поведение для доступа к байту в виде слова (даже если это своего рода запутанное поведение, которого лучше избегать). В общем, любое подключенное к памяти периферийное устройство является скорее наблюдателем шины, чем истинной реализацией памяти - разработчик может поиграть в хитрости с использованием полных комбинаций битов адреса / данных / шины управления, а также реализовать битовые маски, читать / изменять / записывать , замки доступа, магические ценности и т. д.

...