Keil 컴파일러 5 프로젝트를 Keil 컴파일러 6으로 전환
서론
STM32CubeMX는 모든 MCU에 대해 Keil compiler 6 / armclang 프로젝트 생성을 지원하지는 않습니다. 이러한 시나리오에서 TouchGFX와 함께 Keil compiler 6를 사용하기 위해서는 다음 단계를 수행해 프로젝트를 전환해야 합니다.
가이드를 따라 하기 전에 변경 사항을 취소해야 하는 경우를 위해 프로젝트를 백업해 두는 것이 좋습니다.
STM32CubeMX에서 툴 체인 변경
우선 STM32CubeMX의 "Project Manager" 탭에서 툴 체인을 MDK-ARM으로 변경하여 Keil 프로젝트를 생성합니다. 그런 다음 코드를 생성합니다.
TouchGFX Designer에서 코드 생성
버튼을 누르거나 키보드에서 F4 키를 눌러 TouchGFX Designer에서 코드를 생성하여 프로젝트에 TouchGFX용 코드를 추가합니다.
Keil Scatter 파일 수정
TouchGFX가 생성한 버퍼는 부팅 시 액세스할 수 없는 외부 RAM에 배치되는 것이 일반적이므로 이것이 초기화되지 않도록 하려면 Keil이 프로젝트를 연결하는 데 사용하는 스캐터 파일에 약간의 조정이 필요합니다.
프로젝트의 MDK-ARM 하위 폴더에서 .sct 파일을 확인해 프로젝트에 어떤 버퍼가 사용되는지 파악한 다음 객체 이름 앞에 .bss를 추가합니다.
객체는 TouchGFX_Framebuffer, Video_RGB_Buffer, Nemagfx_Memory_Pool_Buffer, Nemagfx_Stencil_Buffer라 불리지만 반드시 모든 항목이 프로젝트에 사용되는 것은 아닙니다.
업데이트된 스캐터 파일의 예
; *************************************************************
; *** Scatter-Loading Description File generated by uVision ***
; *************************************************************
LR_IROM1 0x08000000 0x00100000 { ; load region size_region
ER_IROM1 0x08000000 0x00100000 { ; load address = execution address
*.o (RESET, +First)
*(InRoot$$Sections)
.ANY (+RO)
}
RW_IRAM1 0x24000000 0x00080000 { ; RW data
.ANY (+RW +ZI)
}
RW_HYPERRAM 0x70000000 UNINIT 0x00FFFFFF {
*.o (.bss.TouchGFX_Framebuffer)
*.o (.bss.Video_RGB_Buffer)
}
}
LR_EROM1 0x90000000 0x2000000 { ; load region size_region
ER_EROM1 0x90000000 0x2000000 { ; load address = execution address
*.o (ExtFlashSection)
; *.o (TextFlashSection)
; *.o (FontFlashSection)
}
}
Keil 프로젝트 옵션 수정
Keil uVision에서 프로젝트를 열고 오른쪽에 있는 목록에서 두 번째 항목을 마우스 오른쪽 버튼으로 클릭하고 "Options for Target xxx"를 선택하거나 상단에서 "Project" 메뉴를 클릭하고 "Options for Target xxx"를 클릭하여 프로젝트 설정으로 이동합니다.
"Target" 탭에서 다음 설정을 선택합니다.
- 컴파일러를 "Use default compiler 6"로 설정
- Use MicroLIB 비활성화
C/C++ 탭에서 다음 설정을 선택합니다:
- 언어 c를 c11로, c++를 c++11로 설정
- 짧은 enum/wchar 비활성화
- 작은 코드 크기에 권장되는 최적화 옵셥은 -Oz입니다
FreeRTOS가 사용 중인 경우 포트를 gcc로 변경해야 합니다. 이는 Keil compiler 6와 호환됩니다. GCC 포트는 TouchGFX에서 사용되므로 프로젝트에 사용할 수 있지만 Keil 프로젝트 생성을 선택하면 STM32CubeMX에서 생성되지 않습니다.
변경을 위한 첫 단계는 포트에 대한 포함 검색 경로를 변경하는 것입니다. Include paths 텍스트 필드 옆에 있는 "..."를 클릭합니다.
"../Middlewares/Third_Party/FreeRTOS/Source/portable/RVDS"로 시작하는 라인을 찾으세요. 그런 다음 ".." 뒤에 "/gcc"를 추가하고 "RVDS"를 "GCC"로 변경합니다.
Cortex M7의 일부 개정판에서는 FreeRTOS가 Cortex M4f 포트를 사용하는 것을 권장합니다. 이는 STM32H7 시리즈 칩에 적용되며 원래의 검색 경로가 이를 반영해야 합니다.
Keil 프로젝트에 포함된 파일 수정
TouchGFX 라이브러리를 연결하려면 프로젝트에 포함된 라이브러리를 Keil compiler 6 호환 버전으로 변경해야 합니다. 이를 수행하려면 파일 트리에서 touchgfx_core.lib 파일을 찾아("Lib" 카테고리 아래에 있음) 상위 폴더를 마우스 오른쪽 버튼으로 클릭하고 "Add Existing File to Group xxx"를 클릭해야 합니다.
"[Project folder]/Middlewares/ST/touchgfx/lib/core/[아키텍처]/Keil6.x"로 이동해 "touchgfx_core_wchar32.lib"을 추가합니다.
이 경우 [아키텍처]는 MCU의 실제 아키텍처를 의미합니다. 확실하지 않은 경우, 기존 라이브러리의 위치를 확인해야 합니다.
그런 다음 파일 트리에서 기존 라이브러리 참조를 찾아서 마우스 오른쪽 버튼으로 클릭하고 "Remove File xxx"를 클릭합니다.
FreeRTOS를 사용 중이라면 port.c 파일도 교체해야 합니다. 이를 "Middlewares/FreeRTOS" 아래에서 찾아 위에 설명된 바와 같이 파일을 삭제합니다. 그런 다음 "[프로젝트 폴더]/gcc/Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/[FreeRTOS 아키텍처]"에 있는 새 port.c 파일을 가져옵니다.
이 지점에 이르면 프로젝트가 성공적으로 컴파일될 수 있습니다.
이 상태에서 참조로 프로젝트 폴더의 사본을 만들어 두는 것이 좋습니다. STM32CubeMX 및 TouchGFX를 재생성하면 일부 변경 사항이 실행 취소될 수 있기 때문입니다.