Keil MDK ARM 새 프로젝트 만들기 - FabLabSeoul/WingProject GitHub Wiki
Keil MDK-ARM 에서 프로젝트를 만드는 법을 설명한다.
STM32 Value line discovery 보드를 사용할 때의 설명이다. 간단한 프로그램이라면 프로젝트를 생성하는 것이 복잡하지 않는데, STM32 라이브러리를 이용하면 복잡해진다. 필요한 라이브러리를 포함시키고, 미리 정의된 define 을 선언해주어야 하고, 라이브러리 경로와 CPU설정, ST-Link 를 설정해줘야 하기 때문이다.
그래서 이 예제는 STM32 라이브러리가 있는 경우에만 진행할 수 있다. STM32 라이브러리는 깃허브에 올려놓은 상태니 따로 받지 않아도 된다. STM32 라이브러리를 받는 링크는 STM32에 설명해 놓았다.
새로 생성할 프로젝트 위치는 STM32\stm32vldiscovery_package\Project\Examples 에 하는 것이 편하다. 라이브러리 경로설정이 상대경로로 지정되어 있고, 그 경로를 위주로 설명하고 있기 때문이다.
내용이 복잡하다면 이미 만들어진 예제 프로젝트를 참조해서 설정하거나, 프로젝트 전체를 복사해서 작업해도 된다.
프로젝트를 생성하자.
- Menu -> Project -> New uVision Project 선택
- 프로젝트 파일이 저장될 경로를 선택한 후, 프로젝트 이름을 등록한다.
- IAR system, Keil MDK-ARM 등 여러 툴이 쓰일 수 있으니, 현재는 MDK-ARM 폴더를 만들어 프로젝트를 생성한다.
디바이스 선택
- STM32 Value line discovery 보드는 STMicroelectronics 사의 STM32F100RB 를 선택한다.
- 디바이스를 선택하면 startup_stm32f10x_md_vl.s 파일을 생성할 것인지 묻는다. 이 파일은 STM32에서 제공하는 라이브러리에 포함되어 있기 때문에 추가하지 않는다.
프로젝트 생성 후, 그룹 이름 변경
- Project 뷰 화면에 Target1, Source Group1 그룹이 만들어진 것을 확인 할 수 있다.
- Target1은 프로젝트 이름으로 바꾼다.
- Source Group1은 MDK-ARM에서만 실행되는 시작 프로그램을 등록한다. 그래서 이름을 MDK-ARM으로 수정한다.
그룹 생성
Project 뷰에 그룹은 다음과 같이 생성한다. 그룹 추가는 상위 그룹에서 마우스 오른쪽 버튼으로 메뉴를 띄운 후, Add Group 을 선택한다.
- Project Name
- MDK-ARM
- StdPeriph_Driver
- CMSIS
- User
- STM32vldiscovery
그룹에 파일 추가
그룹에 파일을 추가할 때, 그룹을 더블클릭하거나, 그룹을 선택한후 마우스 오른쪽 버튼으로 메뉴를 띄운 후, Add Existing Files to Group 을 선택한다. 이 메뉴는 이미 만들어진 라이브러리를 추가할 때 쓰인다. 새로 파일을 추가할 경우에는 Add New Item to Group 을 선택하자. main.c 파일을 생성할 때 이용한다.
일반적으로 header, c 파일 모두 추가하지만, 예제에서는 c파일만 추가하고 있어서, 여기서도 똑같이 따라한다.
라이브러리를 등록하기 때문에 **Add Existing Files ~~** 선택해 파일들을 추가하자. 각 그룹마다 추가할 파일은 다음과 같다.
-
MDK-ARM
- startup_stm32f10x_md_vl.s, 파일 경로: stm32vldiscovery_package\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x\startup\arm
-
StdPeriph_Driver
- 그 때마다 추가할 파일이 다르다. 지금은 ADC 예제일 때 추가할 파일을 설명한다. 아래부터 나오는 파일은 다음 경로에 있다. stm32vldiscovery_package\Libraries\STM32F10x_StdPeriph_Driver\src
- misc.c
- stm32f10x_adc.c
- stm32f10x_dac.c
- stm32f10x_gpio.c
- stm32f10x_rcc.c
- stm32f10x_tim.c
- stm32f10x_wwdg.c
- stm32f10x_exti.c
-
CMSIS
- core_cm3.c, 파일경로: stm32vldiscovery_package\Libraries\CMSIS\CM3\CoreSupport
- system_stm32f10x.c, 파일경로: stm32vldiscovery_package\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x
-
STM32vldiscovery
- STM32vldiscovery.c, 파일경로: stm32vldiscovery_package\Utilities
-
User
- main.c, 파일을 생성해야 한다. 파일명은 다르게해도 상관없지만, main() 함수는 항상 있어야 한다.
- stm32f10x_it.c, 시스템 예외처리를 위한 파일이다. 이미 만들어놓았기 때문에, 다른 프로젝트에서 복사해와 추가하자. 파일경로는 main.c 와 같게하자. 복사할 때, stm32f10x_conf.h, stm32f10x_it.h 파일도 같이하자.
옵션 설정
STM32 라이브러리를 사용하기위해 #define
을 선언해야 하고, 라이브러리 경로를 설정해야 한다. 그리고 STM32 Value line discovery 보드는 USB로 ST-Link를 통해 실행파일을 다운로드 받고, 디버깅하고 있다. 이를 위한 옵션도 설정 해줘야 한다. 하나씩 따라가보자.
-
Project View 에서 최상위 그룹 선택 후 -> Alt + F7, 혹은 Menu -> Project -> Option for Target ~~ 선택
-
옵션창 활성화
-
Device tab -> 이미 설정되었으니 따로 해줄필요 없다. (STMicroelectronics -> STM32F100RB)
-
Target tab -> Code Generation -> Use MicroLIB 선택한다.
-
Output tab -> Select Folder for Objects 버튼 선택 -> Debug 폴더를 생성해서 선택하자. (컴파일 후 생성되는 중간 파일이 많기 때문에, 파일 구조가 복잡해진다. 중간파일은 Debug 폴더에 몰아 넣자. 이 파일은 지워도 상관없다.)
-
C/C++ tab
- Preprocessor Symbols -> Define ->
STM32F10X_MD_VL, USE_STDPERIPH_DRIVER
추가 - Include Paths ->
..\;..\..\..\..\Libraries\CMSIS\CM3\CoreSupport;..\..\..\..\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x;..\..\..\..\Libraries\STM32F10x_StdPeriph_Driver\inc;..\..\..\..\Utilities\
추가 (상대 경로로 설정하고 있기 때문에 STM32\stm32vldiscovery_package\Project\Examples 경로에 프로젝트를 생성해야 문제없다.) - Language / Code Generation
- Optimization -> Level 3 (-03) 선택
- 가장 높은 최적화 레벨이다. 레벨이 높을수록 디버깅시 브레이크 포인트가 제대로 잡히지 않는다. 디버깅시에는 낮추자.
- One ELF Section per Function 선택
- Plain Char is Signed 선택
- Optimization -> Level 3 (-03) 선택
- Preprocessor Symbols -> Define ->
-
Debug tab
- 오른쪽 Use 라디오 버튼을 선택한다.
- ST-Link Debugger 를 선택한다.
- ST-Link Debugger 항목 옆에 Settings를 선택한다.
- Settings -> Debug tab -> Port -> SW 을 선택한다.
-
Utilities tab
- Use Debug Driver 을 해제한다.
- ST-Link Debugger 를 선택한다.
옵션 설정 끝
이로써 모든 옵션설정이 끝났다. 지금까지 모든 설정이 문제없다면, F7을 눌러 컴파일 해보자. (main.c 파일을 생성하고, main()함수가 있어야 한다.) 컴파일이 안되면 다시한번 옵션을 살펴보자. 컴파일이 안될 경우 C/C++ 탭 항목 설정이 제대로 안되었을 가능성이 높다. 컴파일이 잘되면 Load 버튼을 눌러 보드에 실행파일이 잘 전달되는지 확인해보자. 에러가 발생하면 Debug 탭, Utilities 탭 설정이 잘 못되었을 가능성이 높다. Device 설정이 잘 못되었을 수 도있다. Device 설정을 바꾸면 Debug, Utilities 설정을 다시해줘야 한다.
C/C++ 탭에서 확인 했듯이 라이브러리 경로를 지정할 때 상대경로로 지정하고 있다. 예를들어 ../../
이렇게, 그렇기 때문에 프로젝트 위치는 STM32\stm32vldiscovery_package\Project\Examples 경로에 있어야 한다. 다른 디렉토리 경로에 프로젝트를 생성한다면 C/C++ 탭의 Include Paths를 직접 수정해야한다. 그리 어렵지 않으니 한번 시도해보자.