Запись регистра по составному назначению и указателю в 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 не нуждается в индексации.
Итак, мои вопросы таковы:
- Почему сложное присваивание работает в регистрах только для записи ?
- Где определены эти константы (
PMC_PCER1_PID36
,PMC
и т. Д.)?
Заранее спасибо !
@7E10FC9A, 👍1
1 ответ
Почему составное назначение работает только с регистрами записи ?
Возможно, в силу привычки больше всего на свете. Люди привыкли к необходимости устанавливать биты в регистрах, где другие биты могут быть прочитаны, и они хотят, чтобы они оставались прежними, и в этом случае |=
имеет смысл.
Я бы подумал, что |=
может генерировать более эффективную инструкцию, но, по крайней мере, с вашим примером REG_PMC_PCER1 |= PMC_PCER1_PID36
objdump указывает, что это не так.
Где определены эти константы (PMC_PCER1_PID36,PMC и т.д.)?
С точки зрения кода они определены в файлах CMSIS ATMEL (теперь микрочипа). Это заголовочные файлы, существование которых несколько стандартизировано ARM для этих процессоров ARM Cortex. Однако большая часть их содержимого таковым не является. Например, вы можете увидеть несколько вещей, связанных с Cortex M3, которые одинаковы для этого устройства ATMEL в аналоге STM32, но регистры GPIO могут быть совершенно разными.
В широком смысле, они определены ATMEL в своих спецификациях.
- Ручная установка Arduino Due
- Arduino Uno: avrdude: stk500_recv(): программатор не отвечает
- Как настроить выводы ввода-вывода второго квадратурного декодера в Arduino IDE
- Пример UDPSendReceiveString с использованием Arduino Due с Ethernet-модулем ENC28J60
- Операторы If и while не работают
- Решатель Гаусса для БИХ-фильтра
- Проблема повторения
- Изменение выходного напряжения через ЦАП Arduino Due
Я не нашел утверждения, которое бы прямо объясняло, что регистр, доступный только для записи, будет выглядеть как все нулевые биты при попытке чтения, но, скорее всего, это так. Если я найду простое утверждение на этот счет, я назову его., @timemage