|
|||||||
Битовые операции, которые удобно использовать для установки регистров в STM32/Arduino
Время создания: 07.04.2022 02:16
Раздел: Компьютер - Аппаратное обеспечение - Микроконтроллеры ARM
Запись: xintrea/mytetra_syncro/master/base/16492869931mityw3xyj/text.html на raw.github.com
|
|||||||
|
|||||||
Установка 1 (единицы) Запись 1 в бит с номером n некоторого регистра: REGISTER |= (1 << n); // Где n - это номер бита или имя бита регистра Включение бита в 1, если известна маска бита: RCC->CR |= RCC_CR_HSEON_Msk; Примечание: в библиотеке CMSIS есть два определения маски. Первое определение имеет суффикс "_Msk", чтобы в явном виде показать, что это маска: #define RCC_CR_HSEON_Msk (1<<16) Помимо этого определения есть определение с тем же именем, только без суффикса "_Msk". Значение такого определения полностью совпадает со значением маски: #define RCC_CR_HSEON RCC_CR_HSEON_Msk Два определения с одинаковым значением нужны для того, чтобы программист имел возможность писать код в разных стилях. Тот, кто считает, что в выражениях надо показывать, что идет работа с маской, может использовать "_Msk" в качестве суффикса. Тот кто считает, что и так все понятно, и название маски определяет наименование бита, может писать без суффикса "_Msk". Помимо битовых масок так же сделаны определения для номера позиции бита. Такие определения завершаются суффиксом "_Pos", например: #define RCC_CR_HSEON_Pos 16 Это определение говорит, что бит RCC_CR_HSEON находится в 16-й позиции регистра RCC_CR. Установка 0 (нуля) Запись 0 в бит с номером n некоторого регистра: REGISTER &= ~(1 << n); или, если известно имя бита (но это неточно): GPIOA->OTYPER = 0; или, если имеется битовая маска (но это неточно): RCC->CFGR &= ~RCC_CFGR_SW; // RCC_CFGR_SW - битовая маска, очищаются биты SW0, SW1 Переключени бита (toggle) Следующий код изменяет значение бита с номером n на противоположное через XOR (в языке Си это "^"): REGISTER ^= (1 << n); Следует понимать, что такой код считывает значение бита регистра, и меняет его на противоположный. Если нужно ускорить данный код, лучше хранить состояние регистра в виде отдельной переменной, и вызывать соответствующую настройку, устанавливающую бит в 1 или 0, например: GPIOB->BSRR = (1<<LED1); // Hi (1) ... GPIOB->BRR = (1<<LED1); // Low (0) |
|||||||
Так же в этом разделе:
|
|||||||
|
|||||||
|