STM32F407 1장. GPIO(TRUESTUDIO, HAL_Driver) :: 찬찬히 로봇 메이커
반응형

처음으로 STM32F407 디스커버리 보드를 사용해보게 되었다. 전에 아두이노나 2809를 사용할 때와 다르게 나만의 프로젝트 파일을 만드는 것을 목표로 두었기에, 완벽한 이해를 목적으로 공부를 하고 범용적이고 직관적인 코드를 짜는 것을 목표로 삼았다.

일단 GPIO란 범용적 입출력 핀이라는 뜻으로 내가 5V를 출력하거나 입력을 받고 싶을 때, 핀의 설정을 GPIO로 설정해놓고 쓸 수 있다. GPIO라고 꼭 5V가 출력이 되는 것은 아니다. 쓰는 CPU마다 다를 수 있으니 manual을 보고 칩의 스펙을 확인한 뒤 써야한다. 확인해보니, 사용할 수 있는 GPIO의 갯수는 82개이고, 5V입출력을 가진다.
아래 표와 같이 15개씩 9개의 구역으로 나뉘어져 있다.(ABCDEFGHI) 이중 핀 100개짜리 칩은 Ports F, G를 사용하지 않는다고 한다.


일단 이 칩의 manual을 읽어보니, GPIO로 사용할 때, 두 가지 방식이 있었다. PP방식과 OD 방식으로 PP는 PUSH-PULL방식을 말하는 것이고, OD 는 OPEN-DRAIN 방식을 말하는 것이다. 나는 기본적으로 PULL-DOWN에 원할 때 5V를 인가주고 싶어서 PUSH-PULL을 선택했다. 또한 AF 라고 해서 Alternate function이라고 있는데, 핀을 다른 용도로 사용(ex. 통신)하고 싶을 때 사용한다.

이 밖에 다양한 레지스터 설정들이 있는데.... 결론적으로 사용하는 코드는 아래와 같다.

몇 번째 핀을 쓸 것인지, 모드는 어떤 것을 쓸 것인지, PULL-UP인지 PULL-DOWN인지 그리고 핀의 속도는 어떻게 쓸 건지를 정하고 HAL_DRIVER에 함수 HAL_GPIO_INIT을 쓰면 핀을 사용할 준비가 된다. 이때 속도는 4개로 분류되는데 속도가 느릴수록 원하는 값에 도달하는 속도가 늦어지지만, 속도가 빠를수록 정밀도가 떨어진다고 한다. 그래서 나는 3번째 빠르기로 사용을 한다. 이 밖에 다른 설정들도 있었지만, 단순히 GPIO에서 입출력만 쓸 때에는 이정도 설정만으로 충분하다. 더 알고싶으면 GPIO함수들이나 MANUAL을 읽고 공부를 해야한다.

그리고 device.h는 다른 헤더파일들을 모아놓은 것으로  따로 만든 헤더파일이다. 원래는 gpio.h로 되어있을 것이다.

그리고 마지막으로 CLOCK_ENABLE이 남아있다. CPU는 어떠한 일을 수행하던간에 무조건 시스템 클럭을 기준으로 한다. 그래서 GPIO를 켜던, 인터럽트를 사용하건, 통신을 할때도 CLOCK을 ENABLE시켜줘야 작동을 한다.
__HAL_RCC_GPIOC_CLK_ENABLE();
이것이 HAL라이브러리에서 제공하는  CLOCK_ENABLE함수로, 원하는 구역에 클럭을 제공한다. 위에 함수는 GPIOC_CLK_ENABLE이기 때문에 GPIOC구역에 해당하는 애들만 사용할 수 있게 해준다.

이제 GPIO로 불을 켤 준비가 되었다.HAL_Delay, HAL_GPIO_ReadPin,
HAL_GPIO_WritePin 을 사용해서 불을 깜빡일 수 있다. 이때, 토글을 안 쓰는 이유는 토글이 그렇게 좋은 함수는 아니라는 선배님의 조언을 들었기 때문이다. 토글함수는 안 쓰는 버릇을 기르자. 

처음엔 2809를 사용했을 때와 많이 다르다고 생각을 했지만 결과적으로 레지스터에 값을 넣어줌으로 해서 원하는 설정을 할 수 있다는 점을 깨달았다.  또한 초기 설정시 입출력 방향을 정해주거나 핀을 어떤 용도로 쓸 건지 등에 대한 방식이 같았다.

이제 이 방식을 가지고 범용적인 코드를 짜야하는데 확실히 머리가 아파옴을 느꼈다. 어떻게하면 편하게 설정하고 쓸 수 있을 것인가... 앞으로 생각해봐야할 것 같다.

※혹시 틀린 것, 알려주고 싶은 내용, 궁금한 점은 댓글로 달아주세요 ^^.

반응형

+ Recent posts