Запись регистра по составному назначению и указателю в Arduino due

Я путаюсь с методом записи регистра по составному назначению и/или указателю, потому что не знаю, откуда берутся некоторые значения.

Пример 1

REG_PMC_PCER1 |= PMC_PCER1_PID36;  // Включить PWM - периферийные идентификаторы 36
  • Это работает так же, как REG_PMC_PCER1 = (1<<4)
  • REG_PMC_PCER1 не читается, поэтому оператор |= не должен работать.
  • Что такое PMC_PCER1_PID36 ? Является ли какая - то битовая маска определенной в IDE ?

Пример 2

PMC->PMC_PCER0 |= PMC_PCER0_PID13;   // Включение питания ШИМ-контроллера
  • Это работает так же, как REG_PMC_PCER0 = (1<<13)
  • Это похоже на пример 1, но там есть указатель PMC. Зачем это нужно ? Если PMC_PCER0_PID13 является битовой маской, то REG_PMC_PCER0 не нуждается в индексации.

Итак, мои вопросы таковы:

  1. Почему сложное присваивание работает в регистрах только для записи ?
  2. Где определены эти константы (PMC_PCER1_PID36,PMCи т. Д.)?

Заранее спасибо !

, 👍1


1 ответ


1

Почему составное назначение работает только с регистрами записи ?

Возможно, в силу привычки больше всего на свете. Люди привыкли к необходимости устанавливать биты в регистрах, где другие биты могут быть прочитаны, и они хотят, чтобы они оставались прежними, и в этом случае |= имеет смысл.

Я бы подумал, что |= может генерировать более эффективную инструкцию, но, по крайней мере, с вашим примером REG_PMC_PCER1 |= PMC_PCER1_PID36 objdump указывает, что это не так.

Где определены эти константы (PMC_PCER1_PID36,PMC и т.д.)?

С точки зрения кода они определены в файлах CMSIS ATMEL (теперь микрочипа). Это заголовочные файлы, существование которых несколько стандартизировано ARM для этих процессоров ARM Cortex. Однако большая часть их содержимого таковым не является. Например, вы можете увидеть несколько вещей, связанных с Cortex M3, которые одинаковы для этого устройства ATMEL в аналоге STM32, но регистры GPIO могут быть совершенно разными.

В широком смысле, они определены ATMEL в своих спецификациях.

,

Я не нашел утверждения, которое бы прямо объясняло, что регистр, доступный только для записи, будет выглядеть как все нулевые биты при попытке чтения, но, скорее всего, это так. Если я найду простое утверждение на этот счет, я назову его., @timemage