비트 연산: 켜고, 끄고, 뒤집기
AND로 지우고, OR로 켜고, XOR로 뒤집고, 시프트로 자리를 옮깁니다. 레지스터 제어의 기본 문법입니다.
레지스터 하나에는 기능이 다른 비트가 여러 개 들어 있습니다. 원하는 비트만 바꾸고 나머지는 그대로 두는 것이 비트 연산의 목적입니다.
네 가지 패턴
reg |= (1u << n); // n번 비트 켜기
reg &= ~(1u << n); // n번 비트 끄기
reg ^= (1u << n); // n번 비트 뒤집기
if (reg & (1u << n)) // n번 비트 확인
여러 비트짜리 필드 바꾸기
모드처럼 2비트 이상인 필드는 먼저 지우고 새 값을 넣습니다.
reg = (reg & ~(0x3u << 4)) | (mode << 4);
시프트 주의점
1 << 31은 부호 있는 int라 정의되지 않은 동작이 될 수 있습니다.1u를 씁니다.- 부호 있는 음수를 오른쪽으로 밀면 컴파일러에 따라 부호 비트가 채워집니다.
읽고-바꾸고-쓰기
|=는 읽고, 바꾸고, 다시 쓰는 세 단계입니다. 중간에 인터럽트가 같은 레지스터를 바꾸면 그 변경이 사라집니다. STM32의 BSRR처럼 쓰기만으로 비트를 바꾸는 레지스터가 따로 있는 이유입니다.