이 글에서는 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의 설정 방법은 아래와 같습니다.
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의 설정 방법은 아래와 같습니다.
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의 설정 방법은 아래와 같습니다.
IDRy : Port input data (y= 0 .. 15) (Bits : 15:0)
3. GPIOx_ODR (Port Output Data Register)
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의 설정 방법은 아래와 같습니다.
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의 설정 방법은 아래와 같습니다.
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의 설정 방법은 아래와 같습니다.
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.