본문 바로가기

Embedded System

Cortex-M3 STM32F103R8T6 GPIO 레지스터 종류

이 글에서는 Cortex-M3 STM32F103(STM32F103R8T6)(이하 cortex-m3)의 입출력 포트를 제어하기 위해 필요한 레지스터들의 종류에 대해 알아보겠습니다.

 

cortex-m3 마이크로컨트롤러는 데이터 출력용 레지스터(GPIOx_ODR, GPIOx_BSRR, GPIOx_BRR)와 데이터 입출력 방향 제어 레지스터(GPIOx_CRL, GPIOx_CRH)와 데이터 입력 레지스터(GPIOx_IDR), 그리고 입출력 값을 고정하는 용도의 레지스터(GPIOx_LCKR)를 가지고 있고 이들에 대해 간단하게 설명하도록 하겠습니다.

 

참고로 GPIOx_... 에서 x는 A~D 사이의 알파벳입니다.

 

 

1. GPIOx_CRL, GPIOx_CRH (Port Configuration Register Low, Port Configuration Register High)

- 이 레지스터는 입출력의 제어 설정을 하기 위한 레지스터입니다. 이 레지스터는 해당 포트의 입출력 선언 및 각 핀의 동작 모드를 설정할 수 있는데, 그 중 GPIOx_CRL은 0~7번 핀을 설정하고, GPIOx_CRH는 8~15번 핀을 설정합니다.

 

먼저 GPIOx_CRL의 설정 방법은 아래와 같습니다.

GPIOx_CRL

 

CNFy[1:0] : Port x configuration bits (y=0 ... 7) (Bits : 31:30, 27:26, 23:22, 19:18, 15:14, 11:10, 7:6, 3:2)

( = 포트 x의 각 비트에 대한 입출력 설정 및 동작모드 설정 비트)

- In input mode (입력 모드 일 때) (MODE[1:0]=00):

    00 : Analog mode

    01 : Floating input (reset state)

    10 : Input with pull-up / pull-down

    11 : Reserved 

- In output mode (출력 모드 일 때) (MODE[1:0] > 00):

    00 : General purpose output push-pull

    01 : General purpose output Open-drain

    10 : Alternate function output Push-pull

    11 : Alternate function output Open-drain

 

MODEy[1:0] : Port x mode bits (y=0 ... 7) (Bits : 29:28, 25:24, 21:20, 17:16, 13:12, 9:8, 5:4, 1:0)

( = 포트 입출력 모드 설정 비트)

    00 : Input mode (reset state) ( = 입력 모드)

    01 : Output mode, max speed 10 MHz. ( = 출력 모드, 최대 동작 속도 10Mhz)

    10 : Output mode, max speed 2 MHz. ( = 출력 모드, 최대 동작 속도 2MHz)

    11 : Output mode, max speed 50 MHz ( = 출력 모드, 최대 동작 속도 50MHz)

 

 

그리고 GPIOx_CRH의 설정 방법은 아래와 같습니다.

GPIOx_CRH

 

CNFy[1:0] : Port x configuration bits (y= 8 .. 15) (Bits : 31:30, 27:26, 23:22, 19:18, 15:14, 11:10, 7:6, 3:2)

( = 포트 x의 각 비트에 대한 입출력 설정 및 동작모드 설정 비트)

- In input mode (입력 모드 일 때) (MODE[1:0]=00):

    00 : Analog mode

    01 : Floating input (reset state)

    10 : Input with pull-up / pull-down

    11 : Reserved 

- In output mode (출력 모드 일 때) (MODE[1:0] > 00):

    00 : General purpose output push-pull

    01 : General purpose output Open-drain

    10 : Alternate function output Push-pull

    11 : Alternate function output Open-drain

 

MODEy[1:0] : Port x mode bits (y=8 ... 15) (Bits : 29:28, 25:24, 21:20, 17:16, 13:12, 9:8, 5:4, 1:0)

( = 포트 입출력 모드 설정 비트)

    00 : Input mode (reset state) ( = 입력 모드)

    01 : Output mode, max speed 10 MHz. ( = 출력 모드, 최대 동작 속도 10Mhz)

    10 : Output mode, max speed 2 MHz. ( = 출력 모드, 최대 동작 속도 2MHz)

    11 : Output mode, max speed 50 MHz ( = 출력 모드, 최대 동작 속도 50MHz)

 

 

2. GPIOx_IDR (Port Input Data Register)

GPIOx_IDR은 말 그대로 데이터 입력용 레지스터입니다. 즉, 읽기 전용 레지스터입니다.

포트의 핀 설정이 입력으로 되어있는 경우 PINx 레지스터에 해당하는 값을 읽으면 됩니다. 그러면 포트로부터 입력되는 데이터가 저장됩니다.

 

GPIOx_IDR의 설정 방법은 아래와 같습니다.

GPIOx_IDR

 

IDRy : Port input data (y= 0 .. 15) (Bits : 15:0)

 

 

3. GPIOx_ODR (Port Output Data Register)

GPIOx_ODR은 데이터를 해당 포트 전체를 통해 출력하기 위한 레지스터입니다. 포트의 핀 설정이 출력으로 되어있는 경우 출력하기 원하는 데이터 값을 GPIOx_ODR에 넣어주면 됩니다. 이 레지스터는 읽기와 쓰기가 모두 가능합니다.

 

GPIOx_ODR의 설정 방법은 아래와 같습니다.

GPIOx_ODR

 

ODRy : Port output data (y= 0 .. 15) (Bits : 15:0)

 

 

4. GPIOx_BSRR (Port Bit Set/Reset Register)

GPIOx_BSRR은 제어 포트의 특정 핀만을 set/reset 하기 위한 레지스터이며, write-only 입니다.

 

GPIOx_BSRR의 설정 방법은 아래와 같습니다.

GPIOx_BSRR

 

BRy : Port x Reset bit y (y= 0 .. 15) (Bits : 31:16)

    0 : No action on the corresponding ODRx bit

    1 : Reset the corresponding ODRx bit

 

BSy : Port x Set bit y (y= 0 .. 15) (Bits : 15:0)

    0 : No action on the corresponding ODRx bit

    1 : Set the corresponding ODRx bit

 

 

5. GPIOx_BRR (Port Bit Reset Register)

GPIOx_BRR은 제어 포트의 특정 핀만을 reset 하기 위한 레지스터입니다. 또한, GPIOx_BSRR과 동일하게 write-only 입니다.

 

GPIOx_BRR의 설정 방법은 아래와 같습니다.

GPIOx_BRR

 

BRy : Port x Reset bit y (y= 0 .. 15) (Bits : 15:0)

    0: No action on the corresponding ODRx bit 

    1: Reset the corresponding ODRx bit

 

 

6. GPIOx_LCKR (Port Configuration Lock Register)

GPIOx_LCKR은 포트의 각 핀의 입출력 값을 고정하는 용도의 레지스터입니다.

 

GPIOx_LCKR의 설정 방법은 아래와 같습니다.

GPIOx_LCKR

 

LCKK[16] : Lock key (Bit : 16)

    0: Port configuration lock key not active

    1: Port configuration lock key active. GPIOx_LCKR register is locked until the next reset.

 

- LOCK key writing sequence:

    Write 1

    Write 0

    Write 1

    Read 0

    Read 1 (this read is optional but confirms that the lock is active)

 

LCKy : Port x Lock bit y (y= 0 .. 15) (Bits : 15:0)

    0: Port configuration not locked

    1: Port configuration locked.