MyTetra Share
Делитесь знаниями!
Битовые операции, которые удобно использовать для установки регистров в 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)



Так же в этом разделе:
 
MyTetra Share v.0.65
Яндекс индекс цитирования