2017-10-18 1 views
0

STM32F4 검색에서 GPIO 핀용 드라이버를 작성하는 방법을 배우려고합니다. 나는 자습서를 통과하고 있었고, 난이 줄을 건너 온 :C 코드의 비트 연산

static void hal_gpio_configure_pin_mode (GPIO_TypeDef *GPIOx, uint16_t pin_no, uint32_t mode) 
{ 
    GPIOx->MODER |= (mode << (2* pin_no)); 
} 

나는 임베디드 시스템에 비교적 새로운 오전 GPIOX->MODER |= (mode << (2* pin_no));가 무엇을 모른다. 또한, 모드가 32 비트 인 동안 왜 pin_no가 16 비트인지 나는 알지 못합니다. 나는 < <이 왼쪽 쉬프트 비트 연산자임을 알고있다. 그러나 나는 아직도 완전한 맥락을 얻지 못한다.

누구나이 모든 것을 설명 할 수 있습니까? 광고 GPIOx->MODER |= (mode << (2* pin_no)); 설명하려고

+0

는 이유'pin_no'와'mode' 동일한 유형을 가져야한다을 없다 그것들의 값은 add 나 곱셈과 같은 연산에서 사용되는 것과 같이 함께 사용되지 않고 대신 단순히 값 ('mode')을 얼마나 많이 계산할 것인가 (2)와 함께 사용되는 인덱스입니다. shift는 단순히 숫자 여야 만하며, shift되는 것과 같은 타입 일 필요는 없습니다. 그래서'+'와'* '와 같은 연산자는 피연산자가 같은 타입으로 변환 될 것을 요구하지만,'<< '연산자의 왼쪽과 오른쪽에 다른 유형이있을 수 있습니다. –

+1

mo 칩에 대한 문서의 gpio 섹션에 등록하십시오. 이것은 단순히이 레지스터에 몇 비트를 설정하는 것입니다. –

+0

Google : "어떻게 비트 연산자가 작동합니까?" 또는 책을 읽으십시오. – Lundin

답변

3

:

  • GPIOx이 구조
  • GPIOx->MODER 포인터가
  • x |= y 수단 x = x | y의 약어이며,이 구조 내부 부재 MODER 액세스하다 "는 수행 x와 y의 논리 OR 결과를 다시 x로 출력
  • mode << (2* pin_no)은 변수의 내용을 왼쪽으로 시프트 함을 의미합니다.은 두번 pin_no 비트만큼.

따라서, 선은 mode의 왼쪽 shiftet의 콘텐츠와 함께, GPIOx->MODER의 내용을 비트 단위 OR "를 의미한다.

+2

나는 각 핀이 2 비트로 인코딩되고 4 가지 다른 값을 가질 수있는 모드라고 덧붙였다. 그리고이 기능은 모드가 처음에 '00'으로 설정되었다고 가정합니다. –

+1

재설정 상태에 따라 게시물을 재설정해도 괜찮지 만 orring 전에 마스크를 해제해야합니다. –