drv_led - withrobot/myCortex-STM32F4 GitHub Wiki

설명

led.c, led.h 파일은 myCortex-STM32F4 보드에 내장된 적/녹 2개의 LED를 제어하는 코드를 정리한 파일입니다. 대부분의 코드는 led.h 파일에 메크로 함수 형태로 정의되어 있으며, led.c 파일에는 LED_Init() 함수 하나만 있습니다. 이처럼 메크로 함수로 구현한 이유는 LED 구동을 위한 코드는 레지스터에 값을 쓰기만 하는 단순한 동작이어서 이를 함수로 구현하는 경우 함수 호출에 따른 오버헤드가 더 크기 때문입니다. 사실 대부분은 컴파일러에서 최적화를 통해 이런 문제를 해결해 주기 때문에 크게 신경쓸 이유는 없습니다.

led.h 파일을 보면 적색, 녹색 LED에 공통으로 사용할 수 있도록 LED_X_ 로 시작하는 메크로 선언들이 있습니다. 코드를 보실 때에는 이쪽 코드를 보시면 됩니다.

LED_X_INIT() GPIO의 해당 핀을 output mode로 설정하는 코드입니다. GPIO 코딩을 직접 할 때 참고할 수 있는 코드입니다. 중간에 GPIO_PinAFConfig() 함수를 호출하는 부분은 LED에 연결된 GPIO 핀이 PA15, PB4로 JTAG에 쓰이는 코드이기 때문입니다. JTAG에 쓰이는 핀은 초기 상태가 JTAG mode로 되어 있어 일반 GPIO로 사용할 수 없습니다. 이를 GPIO 모드로 전환해 주기 위해 사용하는 함수입니다.

LED_X_ON() LED를 켜기 위해서는 해당 GPIO 핀이 low를 출력하면 됩니다. BSRRH 레지스터에 값을 쓰면 GPIO의 해당 비트가 0으로 clear 됩니다. 일반적인 GPIO 출력은 1) 현재 상태를 읽고, 2) 새로운 상태를 쓰는 2 단계로 이루어 져야 하지만 BSRR 레지스터를 사용하면 write 한번 만으로 GPIO의 atomic 동작이 가능합니다.

LED_X_OFF() LED를 끄기 위해서는 GPIO 핀이 high를 출력하면 됩니다.

LED_X_IS_ON() 현재 LED가 켜져 있다면 1을, 꺼져 있다면 0을 리턴하는 함수입니다.

LED_X_TOGGLE() LED 상태를 반전시키는 함수입니다. 꺼져있다면 켜고, 켜져있다면 끕니다.

사용법

  1. LED_Init()를 호출합니다. 최초 한번만 호출하면 됩니다.
  2. 적색 LED를 켜고 싶을때 LED_R_ON() 처럼 원하는 메크로 함수를 호출해 주면 됩니다.