보드를 구입한 본래의 목적이었던 TouchGFX를 사용하기 위해서 프로젝트 생성. 여러가지 유투브나 문서를 찾아봤지만, 한번에 매끄럽게 되는건 없는듯하다. ST에서 TouchGFX를 인수하였다곤 하지만 하나의 개발도구로 합치는데는 꽤 시간이 걸릴듯 한데… 뭐 그거야 나중 일이고.. 일단은 프로젝트를 생성하고 개발하기 위한 준비단계까지는 되어야 하니….
프로젝트 생성은 예전 데모와 마찬가지로 File > New > STM32 Project 로 시작한다. 보드도 역시 현재 보유한 32F746GDISCOVERY를 선택하고 다음으로 진행.
프로젝트 이름을 입력하고, 개발 언어는 C++로 선택. Finish를 선택하여 생성 시작. 이후 나오는 다이얼로그창에선 모두 Yes로 답하면 됨.
예전 데모와 같이 디바이스 설정을 위한 화면이 나타나면… 이제부터 설정 시작. (앞선 포스팅에선 편하다고 했었는데, 편하긴 개뿔… 좀더 한방에 되면 얼마나 좋아….)
(1) System Core > CORTEX_M7
(2) Connectivity > ETH
(3) Connectivity > QUADSPI
(4) Multimedia > LTDC
(5) TouchGFX 관련
이건 먼저, Additional Software를 클릭하고, 다음의 화면과 같이 TouchGFX를 선택.
그러면, 좌측에 Additional Software 탭과, TouchGFX 관련 설정 항목이 생성됨. Graphics Application를 체크하고 다음과 같이 설정.
(6) Middleware > FREERTOS
스택크기만 4096으로 변경.
이제 Project > Generate Code (Alt+K)를 실행하여 코드 생성. 생성이 완료되면, 프로젝트 창이 다음과 같이 되어야 함.
이제 TouchGFX의 ApplicationTemplate.touchgfx.part를 더블클릭하여 TouchGFX 디자이너를 실행한다. 만약 기존에 설치가 안되어있을 경우, 홈디렉토리 아래의 다음 주소를 가보면, 설치 파일이 존재한다.
메인 개발도구는 윈도우, 맥, 리눅스 등을 지원하고 있지만, TouchGFX 관련한 툴은 아직까진 윈도우만 지원합니다. 그래서 어쩔수 없이 윈도우에서 개발을 진행해야 할 듯 합니다. (윈도우 싫어요~~)
ST에선 자사의 다양한 MCU 및 보드들의 개발을 위해 통합 개발 도구를 지원하고 있습니다. (꾸준히 업데이트 되고 있는 듯 합니다.) https://www.st.com/en/development-tools/stm32cubeide.html 에 가보시면 받으실 수 있고, 메일을 통한 인증을 하셔야 합니다. 다운로드한 en.st-stm32cubeide_1.3.0_5720_20200220_1053_x86_64.exe.zip 파일을 압축을 해제하고 설치를 진행합니다.
특별한 설정없이 다음, 다음 진행하면서 설치하면 끝납니다.
바탕화면의 아이콘이나 시작메뉴에서 설치한 프로그램을 실행하면 처음엔 프로젝트들이 위치할 곳을 선택하도록 나오는데, 적절한 곳을 입력해주시고요,
시작화면이 짜잔 나타납니다. 이클립스를 기반으로 만들어진 툴인듯한데… 불편하네요..ㅎㅎ
어쨌든 툴의 자동 업데이트도 지원해주고 있습니다.
프로젝트를 하나 만들어보겠습니다.
상단의 메뉴에서 File > New > STM32 Project를 누르시거나 시작화면에서 Start new STM32 Project를 누르셔서 프로젝트를 만들어봅니다.
그러면 요렇게 창이 하나 뜹니다. 저는 STM32F746G-DISCO 보드를 사용할 예정이므로, 상단의 탭에서 Board Selector를 선택하고 STM32F746G-DISCO 보드를 찾아 클릭하고 다음으로 진행.
프로젝트의 이름을 입력하고, 개발언어는 C++로 선택합니다. 이렇게 만들어진 프로젝트는 처음 실행시 설정하였던 workspace 디렉토리 아래에 추가됩니다.
모든 주변기기들의 설정을 기본모드로 할것인지를 물어보는데, 당연히 Yes.
현재 개발툴 (이클립스)의 뷰를 STM32CubeMx 모드로 보여줄건지를 물어봅니다. 요것도 당연히 Yes.
이것저것 준비를 하면서 프로젝트 생성 중.
이렇게 짠 하고 나타납니다. 개발자들은 이렇게 기본 밥상이 차려진 상태에서 필요한 부분만 추가하여 빌드하고 이를 보드에 다운로드해서 사용하면 됩니다. (음.. 일단은 좀 많이 편해진듯…)
보드가 동작되는지 확인용으로… LED를 한번 깜빡여줘보겠습니다…
기본적으론 FREERTOS가 돌아가고 있는 상태이므로 LED 깜빡이용 Task를 하나 생성해줍니다.
프로젝트 파일을 선택하고, Middleware > FREERTOS를 선택합니다. 그런 다음 Task and Queues를 선택하면, 현재는 하나의 Task만 생성되어 실행되고 있습니다. Add 버튼을 누르고, 다음과 같이 입력한 후, 메뉴 > Project > Generate Code (Alt+K)를 실행합니다.
프로젝트의 main.c 파일을 가보면,
StartTaskBlinky 함수가 만들어져 있는데, 이곳에 위와 같이 코드를 입력해줍니다.
/* USER CODE BEGIN StartTaskBlinky */
GPIO_InitTypeDef gpioInitStructure;
gpioInitStructure.Pin = GPIO_PIN_1;
gpioInitStructure.Mode = GPIO_MODE_OUTPUT_PP;
gpioInitStructure.Pull = GPIO_PULLUP;
gpioInitStructure.Speed = GPIO_SPEED_HIGH;
HAL_GPIO_Init(GPIOI, &gpioInitStructure);
/* Infinite loop */
for(;;)
{
osDelay(200);
HAL_GPIO_TogglePin(GPIOI, GPIO_PIN_1);
}
/* USER CODE END StartTaskBlinky */
대략, 200ms 마다 GPIOI의 1번 핀을 토글 시켜주라는 건데, 현재 보드에는 그 핀에 LED가 연결되어 있습니다.
이제 프로젝트를 빌드하고… Run > Run를 클릭하면 자동으로 보드에 빌드된 펌웨어를 다운으로 하고 보드를 리셋해줍니다. 보드가 리셋되고, FREERTOS가 가동되는데 살짝의 시간이 지나고나면, 보드 뒷면의 LED가 깜빡임을 볼 수 있습니다.
Device name : STM32F74x/STM32F75x
Flash size : 1 MBytes
Device type : MCU
Device CPU : Cortex-M7
Memory Programming ...
Opening and parsing file: ST-LINK_GDB_server_a10660.srec
File : ST-LINK_GDB_server_a10660.srec
Size : 76388 Bytes
Address : 0x08000000
Erasing memory corresponding to segment 0:
Erasing internal memory sectors [0 2]
Download in Progress:
File download complete
Time elapsed during download operation: 00:00:01.944
Verifying ...
Download verified successfully
Debugger connection lost.
Shutting down...
로봇용 간단한 UI 모듈을 개발하는데 괜찮을듯 하여 주문한 제품, 깊고 복잡하게 들어가긴 좀 귀찮아 가장 예제가 많은 보드를 골라서 주문하였습니다. (후딱 개발하고 끝내기) 가격은 대략 8~9만원 정도이고, 흔하게 구할 수 있습니다. 거의 대부분 기능을 테스트 할 수 있도록 주변 소자들도 많이 들어있고, 전면부에는 큼지막한 5인치 터치 LCD가 붙어 있는데, 해상도가 480×272라서 약간 아쉬운 면은 있습니다. 뭐.. 필요하면 교체해서 써도 될듯 하고요…
가장 사용해보고 싶은 부분은 TouchGFX라는 녀석인데, ST에서 얼마전(아니면 한참전?)에 인수하여, 현재는 개발툴을 통합하는 과정에 있는듯 합니다. (검색해보니 버그도 많긴 합니다만.. 뭐 그런거야 개발자에겐 흔한….)
“eDP-1-1” 이 모니터 이름입니다. 터미널에서 명령을 입력하여 밝기가 조정이 되는지 확인해봅니다.
$ xrandr --output eDP-1-1 --brightness 0.5
정상적으로 밝기가 반정도 어두워지는 것을 확인할 수 있습니다. 0으로 하면 완전 검은색으로 변하니 주의하시고요. 이제 이것을 스크린 밝기를 조정하는 키와 맵핑을 해줘야 합니다.
두 개의 파일을 만들어줍니다.
$ sudo vi /etc/acpi/events/dell-brightness-up
event=video/brightnessup BRTUP 00000086 00000000
action=/etc/acpi/dell-brightness.sh up
$ sudo vi /etc/acpi/events/dell-brightness-down
event=video/brightnessdown BRTDN 00000087 00000000
action=/etc/acpi/dell-brightness.sh down
그런 다음 dell-brightness.sh 를 위 경로에 만들어줍니다.
$ sudo vi /etc/acpi/dell-brightness.sh
#!/bin/bash
DISPLAYNAME=$(xrandr --listmonitors | awk '$1 == "0:" {print $4}')
OLED_BR=`xrandr --verbose | grep -i brightness -m 1 | cut -f2 -d ' '`
CURR=`LC_ALL=C /usr/bin/printf "%.*f" 1 $OLED_BR`
MIN=0
MAX=1.0
if [ "$1" = "up" ];
then
VAL=`echo "scale=1; $CURR+0.1" | bc`
else
VAL=`echo "scale=1; $CURR-0.1" | bc`
fi
if [ `echo "$VAL < $MIN" | bc -l` = "1" ];
then
VAL=$MIN
elif [ `echo "$VAL > $MAX" | bc -l` = "1" ];
then
VAL=$MAX
else
`xrandr --output $DISPLAYNAME --brightness $VAL` 2>&1 >/dev/null | logger -t oled-brightness
fi
# Set Intel backlight to fake value
# to sync OSD brightness indicator to actual brightness
INTEL_PANEL="/sys/devices/pci0000:00/0000:00:02.0/drm/card0/card0-eDP-1/intel_backlight/"
if [ -d "$INTEL_PANEL" ]; then
PERCENT=`echo "scale=4; $VAL/$MAX" | bc -l`
INTEL_MAX=$(cat "$INTEL_PANEL/max_brightness")
INTEL_BRIGHTNESS=`echo "scale=4; $PERCENT*$INTEL_MAX" | bc -l`
INTEL_BRIGHTNESS=`LC_ALL=C /usr/bin/printf "%.*f" 0 $INTEL_BRIGHTNESS`
echo $INTEL_BRIGHTNESS > "$INTEL_PANEL/brightness"
fi