# STM32F769BIT6 (208Pin / 216Mhz)

# FreeRTOS (RTOS)

# GPIO (LED)

# CubeMX 4.21.0 / STM32F7 1.7.0



LL 드라이버를 사용하여 Key 입력에 따라 LED를 제어하는 방법을 기술하였습니다.

CubeMX에서 GPIO Pin 설정, Clock, 설정, FreeRTOS 포팅하고, LL 드라이버를 프로젝트에 추가하여 GPIO를 제어하는 방법을 기술하였습니다.

ST에서 Templates_LL를 제공하고 있으나, 이 내용은 추후 기술하겠습니다. (CubeMX HAL + LL Driver)

 

ST에서 처음으로 나온 드라이버는 SPL(Standard Peripheral Libraries) 입니다. 하지만 현재는 HAL and LL drivers 넘어가는 추세인 것 같습니다.

CubeMX에서 프로젝트를 생성하고, HAL 드라이버를 기본으로 사용하다 보면 불편한 점이 많습니다. 가장 큰 단점은 최적화(Optimizer)가 많이 안되어 있습니다.

회사 프로젝트는 일단 STD 라이브러리(SPL) 사용하여 프로젝트를 진행중이고, 추후 HAL 드라이버를 적용할 예정입니다.

 

HAL, SPL, LL 드라이버 비교 내용은 ST 홈페이지에서 확인 가능합니다.

en.stm32_embedded_software_offering.pdf”


# 개요

KEY1 = PD12 / KEY2 = PD13

LED1= PG13 / LED2 = PG14


# CubeMX Pin 설정

1. PG13, PG14 GPIO_Output

2. PD12, PD13 GPIO_Input

3. SWDIO, SWCLK

4. RCC_OSC


# Clock 설정


# FreeRTOS 


# GPIO Pin 설정 (Key 회로에 Pull Up이 되어 있으므로, no pull-up no pull-down 으로 설정한다.)


# Project Settings (All used Libraries into the project folder를 선택한다)




# Code

freertos.c 파일에 아래 헤더파일을 추가합니다.

#include "stm32f7xx_ll_gpio.h"


#define C_KEY1 GPIO_PIN_12

#define C_KEY2 GPIO_PIN_13


#define C_LED1 GPIO_PIN_13

#define C_LED2 GPIO_PIN_14


freertos.c → StartDefaultTask() 함수에 아래 코드를 입력합니다.

/* StartDefaultTask function */

void StartDefaultTask(void const * argument)

{

/* USER CODE BEGIN StartDefaultTask */

/* Infinite loop */

uint32_t u32Input = 0x0;

uint32_t u32Output = 0x0;

for(;;)

{

u32Input = LL_GPIO_ReadInputPort(GPIOD);

if(u32Input & C_KEY1)

{

u32Output |= C_LED1;

}

else

{

u32Output &= ~C_LED1;

}

if(u32Input & C_KEY2)

{

u32Output |= C_LED2;

}

else

{

u32Output &= ~C_LED2;

}

LL_GPIO_WriteOutputPort(GPIOG, u32Output);

osDelay(250);

}

/* USER CODE END StartDefaultTask */

}


→ "stm32f7xx_ll_gpio.h" 헤더파일은 프로젝트 폴더 Driver → STM32F7xx_HAL_Driver → Inc에서 확인 할 수 있습니다.

해당 함수는 매크로로 정의되어 있으며,  GPIO PORT의 입력 레지스터(IDR)를 읽고, 출력 레지스터(ODR)에 데이터를 쓰고 있습니다.


# RM0410 Reference manual




끝.




+ Recent posts