STM32 LED 비트 연산자

비트 연산자

연산자설명
&AND
|OR
^XOR (Exclusive OR)
~NOT
<<LEFT SHIFT
>>RIGHT SHIFT
&=AND 연산 후 할당
|=OR 연산 후 할당
^=XOR 연산 후 할당
<<=LEFT SHIFT 연산 후 할당
>>=RIGHT SHIFT 연산 후 할당

 

비트 연산자 사용 이유

일반 함수와 비트 연산자의 차이는 속도에 있다.
추가적으로 내부 구조를 알아볼 수 있다는 것에 있다.

사용 예

MODER에 대한 내용

사진을 보면
STM32 는 32비트 보드라서 0~31 까지 비트가 있고
2개씩 짝지어 한 포트에 16개의 핀을 구성하고 있다.
2개로 짝이어진 2개의 비트는

00 -> Input
01 -> Output
10 -> 특수 목적 (예:통신)
11 -> Analog

로 각 핀을 설정할 수 있다.

HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_RESET);
  • 위 코드는 Output으로 설정된 PA0 의 값을 0으로 하는 것이다. (HAL 드라이버 함수)
GPIOA -> MODER = GPIOA -> MODER & (~0x11);	
GPIOA -> MODER = GPIOA -> MODER | (0x01);
GPIOA -> ODR   = 0x00;
  • 비트 연산자로 먼저 PA0 을 Output으로 바꾼다음
    값을 0으로 해준 것이다.
  • AND 연산자와 NOT 연산자로 원하는 비트를 0 으로 바꾸고나서 OR 연산자로 원하는 자리를 Output[0x01]으로 설정한다.

만약 0번 핀이 아니라 3번 핀을 Output으로 하고 값을 1 (true) 로 하고 싶다면?

위 문서에서 3번핀은 [4, 6] -> 4번 5번 비트에 해당하기 때문에 [0, 2] -> [4, 6] 이 되려면
4칸이 움직여야 하니까 "<< 4" 를 쓴다.

ODR (Output Data Register) 를 [1000] 3, 2, 1, 0 핀 중
3번 핀을 1로 바꿔야 하니까 0x08로 나타내어야한다.

GPIOA -> MODER = GPIOA -> MODER & (~(0x11 << 4 )
GPIOA -> MODER = GPIOA -> MODER | (0x01 << 4);
GPIOA -> ODR   = 0x08;

아직은 익숙하지 않은 감이 있지만 최적화를 위해 연습을 해봐야겠다.

좋은 웹페이지 즐겨찾기