# 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
끝.