GPIO(2)

이고은·2021년 5월 5일
0

mbed os를 사용하지 않고 Register에 직접 접근하여 조작할 때는 datasheet나 reference manual을 참고해야한다

GPIO register

GPIOA~GPIOH까지 포트가 존재한다.
위의 datasheet에서 메모리 부분의 캡쳐본이다.
이는 GPIO의 base address이다.
GPIO 레지스터의 전체적인 구조는 manual의 8.4.11를 보면 알 수 있다.

base address로부터 가장 가까운 곳에 port mode register가 존재한다.(GPIOx->MODER)
해당 포트의 몇번 핀을 어떤 용도로 쓸 것인지에 대해 초기화해주는 레지스터이다.
00은 input, 01은 output, 10은 alternate function mode, 11은 analog mode이다.
리셋 시 대부분의 pin의 default는 input 모드이다. (PA_13, PB3, PB4를 제외하고..)

output type register(GPIOx->OTYPER)
push-pull mode / open-drain 여부를 결정한다.

output speed register (GPIOx->OSPEEDR)
turn on/off를 얼마나 빠르게 하는지 결정한다.
00 low speed, 01 medium speed, 10 fast speed, 11 high speed

pull-up pull-down register(GPIOx->PUPDR)
00 no pull-up/pull-down, 01 pull up, 10 pull-down

input data register(GPIOx->IDR)
word 단위로 접근이 가능하고, read-only register이다.

output data register(GPIOx->ODR)
GPIO출력 모드 시, 이 레지스터에 쓰면 된다.
여기에는 input, output이 분리되어 있으나 많은 프로세서에서 IDR, ODR을 구분하지 않으면서 물리적으로는 다른 주소를 사용한다. 따라서, 주로 volatile을 사용한다.

bit set/reset register(GPIOx->BSRR)
이 포스트의 하단의 그림을 보면 Bit set/reset register을 거친 신호가 output data register로 들어간다.
핀의 값을 리셋/셋 해준다는 의미이다. 프로그램 작성 시 핀 값의 리셋이 필요할 경우 BSRR레지스터로 리셋해주면 된다.

configuration lock register(GPIOx->LCKR)
실수로 값이 바뀌는 것을 막기위해 LOCK하는 것이다.

예를들어, PA5를 output mode로 설정하기 위해서는

__HAL_RCC_GPIOA_CLK_ENABLE()
GPIOA->MODER &= ~(0b11 << 10);
GPIOA->MODER |= (0b01 << 10);

clock을 잘못 건드리면 보드가 나가기때문에 clock은 라이브러리를 사용하였다. MODER에서 01을 PA5번 자리에 써야하는데, 만약 원래 가지고 있었던 값이 10이라면 or연산 시 11이 된다. 따라서 원래의 값을 00으로 설정한 후 or 연산으로 10으로 만들어준다. 논리설계, 컴퓨터 구조 이후로는 거의 bit연산이나 2진수, 16진수를 사용할 일이 없어서 꽤 헤맸는데, 0b11은 2진수로 11이라는 뜻이고, 0b11<<10이라면 11뒤에 0이 10개가 붙는다는 의미이다. MODER register datasheet를 보면 PA5는 11,10을 사용할 것이므로 10번 right shift를 해준 것이다. ~(0b11<<10)이라면 11+(010개)에 not이므로 00+(110개)가 될 것인데 이를 and 연산 하였으므로 11, 10번 비트만 0으로 초기화해준다는 의미이다.

GPIO via register LAB

user button이 눌릴 때 마다 LED2의 blinking rate이 바뀌는 프로그램을 레지스터로 컨트롤하는 방식으로 작성.
https://github.com/jacinder/embeeded_PA/blob/main/GPIO/GPIO%20In%20&%20Out.cpp

profile
MLOps Engineer가 되고싶은 ML과 DevOps에 관심이 많은 컴공생입니다👩🏻‍💻

0개의 댓글