윤재에요 2022. 12. 16. 03:15

  • 모든 외부 장치는 Port, Pin 을 통해 MCU와 연결
  • 원하는 Port/Pin에 clock을 부여, 포트 설정을 한 뒤 입출력 가능

 

 

  • 데이터시트에 각 레지스터에 대한 메모리 맵핑 주소가 나와 있음
  • APB(advanced Preipheral Bus)2에 각 GPIO포트가 할당되어 있는 것을 확인할 수 있음
  • 각 할당된 주소에 offset을 더하면 해당 레지스터 주소가 됨

 

 

레퍼런스 문서에 각 레지스터 설정값과 설명들이 나와 있음

 

 

포트의 핀 설정시 주의사항

  • 레지스터의 사용하려는 부분을 0으로 초기화 후사용
  • 0011(output push-pull 50MHz) = 0x3
     |= 0x30000000 (X)
    Reset value |= 0x3;
    0100(2)      -> 0111(2)(X) (output Open-drain 50MHz)

  • 레퍼런스 문서에 각 레지스터설명과원하는 설정을 위한 bit Setting 값이 나와있음.

Bitwise Operation

AND 연산 : &

  • 0b0011 & 0b0101 == 0b0001
  • X & 0 == 0
  • X & 1 == X

OR 연산 : |

  • 0b0011 | 0b0101 == 0b0111
  • X | 0 == X
  • X | 1 == 1

 

XOR 연산 : ^

  • 0b0011 ^ 0b0101 == 0b0110
  • X ^ 0 == X
  • X ^ 1 == ~X

Not 연산 : ~

 

  • ~0b01 == 0b10
  • ~0 = 1
  • ~1 = 0

 

Shift 연산 : <<, >>

 

  • 0b01011 << 1 == 0b10110
  • 0b01011 >> 1 == 0b00101

 

Volatile Keyword

volatile 선언된 변수는 컴파일러가 최적화를 수행하지 않음.

(접근 시 항상 메모리 참조)

 

 

 

원하는 포트와 핀(GPIO)을 제어하기 위해 해야할 일들

1. RCC (reset and clock control)를 사용하여 사용하고자 하는 GPIO clock을 인가 (peripheral clock enable)
2. 사용하려는 GPIO Port, Pin input/output 설정 (Port Configuration)
3. GPIO Input (Port input data), output (Port output data) <- Port bit set/reset으로 제어)를 통하여 센서 및 액츄에이터를 제어하고 오실로스코프로 확인한다.

 각 레지스터의 필드값은 초기화 후 원하는 값을 대입해야 합니다. 기존 reset value가 이미 들어있기 때문에 그냥 |=로 대입하면 다른 값이 됩니다.

예) GPIO 포트 B 0번핀 input with pull-up / pull-down 설정 (GPIOB_CRL 레지스터 이용)

*((volatile unsigned int *)0x40010C00) &= ~0x0000000F;    // 0번핀 관련 필드만 0값으로 초기화

*((volatile unsigned int *)0x40010C00) |= 0x00000008;    // 0번핀 input with pull-up/pull-down 모드 설정

RCC_APB2ENR 레지스터에 넣고 싶다 하면 ReferenceManual.pdf 를 키고 ctrl+f 눌려서 RCC_APB2ENR 을 검색해보세요. 레지스터의 각 bit 들이 뭐를 의미하는지 다 나와있습니다. 포트 A clock을 주고 싶다 하면 RCC_APB2ENR 레지스터의 Bit2 IOPAEN 1을 넣어야 되므로 0b100,, 0x4 값을 레지스터에 넣으면 되겠죠

 

 

오실로스코프

 

멀티미터

 

 

 

작성코드 및 보고서 : https://github.com/yunzae/Embeded-System/tree/main/Embeded/3주차