8비트 마이크로 콘트롤러를 사용할 때는 몰랐는데, 32bit ARM 콘트롤러를 사용하려니, 세상이 아주 다릅니다.
STM32F103R 레퍼런스 메뉴얼에서 GPIO 관련 부분만 따옵니다.
포트 설정 레지스터 – 하위
(Port configuration register low (GPIOx_CRL) (x=A..G))
주소 오프셋 값: 0x00
초기값: 0x4444 4444
CNFy[1:0]: 포트 x 설정 bit (포트= 0 .. 7)
해당 I/O 포트를 설정하기 위해 소프트웨어적으로 기록할 수 있는 비트.
입력 모드 (MODE[1:0]=00):
00: 아날로그 모드
01: 플로팅 상태 (리셋되었을 때의 상태)
10: 풀업 또는 풀다운 저장을 포함한 입력
11: 예약된 값
출력 모드 (MODE[1:0] > 00):
00: 범용 출력 (푸쉬-풀)
01: 범용 출력 (Open-drain)
10: Alternate 기능 Push-pull 출력
11: Alternate 기능 Open-drain 출력
MODEy[1:0]: 포트 x 모드 bit (y= 0 .. 7)
해당 I/O 포트를 설정하기 위해 소프트웨어적으로 기록할 수 있는 비트.
00: 입력 모드 (리셋되었을 때의 상태)
01: 출력 모드, 최대 속도 10 MHz.
10: 출력 모드, 최대 속도 2 MHz.
11: 출력 모드, 최대 속도 50 MHz.
포트 설정 레지스터 – 상위
(Port configuration register high (GPIOx_CRH) (x=A..G))
포트의 내용은 GPIOx_CHL 과 같음. 다만 이 레지스터는 포트 8-15번까지 설정.
포트 출력 데이타 레지스터
(Port output data register (GPIOx_ODR) (x=A..G))
초기값: 0x0000 0000
Bits 31:16 예약된 값. 수정해서는 안됨.
Bits 15:0 ODRy[15:0]: 포트 출력 데이타 (y= 0 .. 15)
소프트웨어로 읽고 쓰기가 가능. 각각의 비트에 기록하려면 GPIOx_BSRR레지스터를 사용할 것.
포트 비트 조작 레지스터 (Port bit set/reset register (GPIOx_BSRR) (x=A..G))
초기값: 0x0000 0000
Bits 31:16 BRy: 포트 x의 비트 y를 0으로 함 (y= 0 .. 15)
쓰기 전용
0: 해당 ODRx bit 유지
1: 해당 ODRx bit를 0으로 만듬
주의: 만약에 BSx 와 BRx 값이 모두 설정되어 있으면, BSx 값이 우선순위를 가짐.
Bits 15:0 BSy: 포트 x의 y 비트값을 1로함 (y= 0 .. 15)
쓰기 전용
0: 해당 ODRx bit 유지
1: 해당 ODRx bit를 1으로 만듬
포트 비트 리셋 레지스터
(Port bit reset register (GPIOx_BRR) (x=A..G))
초기값: 0x0000 0000
Bits 31:16 예약된 값. 수정하면 안됨.
Bits 15:0 BRy: 포트 x의 y비트를 0으로 (y= 0 .. 15)
쓰기 전용 0: 해당 ODRx bit 유지 1: 해당 ODRx bit를 0으로 만듬
포트 설정 잠금 레지스터
(Port configuration lock register (GPIOx_LCKR)(x=A..G))
비트 16 (LCKK)기록하는 적당한 절차를 거치면 이 레지스터는 포트 값의 설정을 변경을 금지하는데 사용한다. 나머지 [15:0] 비트는 각 GPIO의 설정을 잠그는데 사용한다. 이 레지스터에 기록을 수행하는동안 LCKR[15:0]의 값은 절대로 바꾸어선 않된다. 일단 잠금이 수행되면 칩이 리셋이 되기 전까지는 각 포트의 값을 바꿀 수 없다. 각 잠금 값들은 해당 콘트롤 레지스터(CRL, CRH)의 4 비트값을 동결시킨다.
초기값: 0x0000 0000 Bits 31:17 예약된 값
Bit 16 LCKK[16]: 잠금 키 언제도 읽을 수 있음. 이 값은 잠금 키 수정 절차에 따를 때만 수정이 가능.
0: 포트 설정 잠금 키가 활성화 되지 않았음.
1: 포트 설정 잠금 키가 활성화 되었음. GPIOx_LCKR 레지스터는 다음 MCU의 리켓까지 변경할 수 없음.
잠금 키 수정 절차:
쓰기: 1
쓰기: 0
쓰기: 1
읽기: 0
읽기: 1 (이 읽기는 생략이 가능. 그러나 이 값을 읽음으로써, 잠금이 활성화 되었는지 확인해줌)
주의: 잠금 키 수정 절차시, LCK[15:0]값을 절대 바꾸어선 안됨. 이 절차 중 에러가 발생하면, 잠금은 무효화 됨.
Bits 15:0 LCKy: 포트 x y비트 잠금 (y= 0 .. 15)
읽기 쓰기가 가능하나 LCKK 비트가 0일 때만 쓰기가 가능함.
0: 포트 설정이 잠기지 않았음.
1: 포트 설정이 잠긴 상태임.