 안녕하세요. 지금 보시게 될 비디오 튜토리얼은 sdm32cubemx를 처음 사용하시는 분들에게 적합한 내용으로 sdm32cubemx로 어떤 일들을 좀 더 손쉽게 할 수 있는지 알아보고 사용하면서 막힐 수 있는 부분들을 워낙 진행할 수 있도록 만들어졌습니다. 그럼 sdm32cubemx에 대해 간략히 소개해드리고 어떻게 사용하는지 설치부터 설정하는 부분 그리고 각각의 기능들에 대해서 예제를 만들어가며 설명드리겠습니다. 그리고 마지막으로 예제가 완성되면 sdm32f4 discovery보드에서 그 동작을 확인하도록 하겠습니다. 저희 st홈페이지에서 stm32cubemx를 검색하면 이와 같이 링크를 바로 찾으실 수 있습니다. 해당 링크를 클릭하면 stm32cubemx에 대한 설명 및 자료들을 볼 수 있는 페이지가 뜨고 맨 아래쪽으로 내려가 보시면 프로그램을 다운로드할 수 있는 링크가 보입니다. 다운로드 받고 설치하는 부분까지는 각자 진행하는 것으로 하고 저는 이미 설치된 환경에서 설명드리도록 하겠습니다. sdm32cubemx를 실행하면 new project, load project, help 이런 퀵 링크들을 메인 페이지에서 볼 수 있습니다. 그리고 메뉴에 help를 누르면 check for update, install new library, update setting 이렇게 세 가지 메뉴가 있습니다. 여기서 install new library를 실행해 보면 각 제품별 소스 패키지들을 볼 수 있는데 적절한 패키지들을 다운받아야만 코드를 생성할 수 있습니다. 오늘 stm32f4 discovery board에서 데모를 보여드릴 예정이기에 저는 stm32f4만 설치하도록 하겠습니다. 가장 최근 버전 하나만 설치하면 됩니다. install now 버튼을 클릭하면 인터넷 연결을 시도하고 해당되는 패키지를 서브로부터 다운받게 됩니다. 네트워크 상황에 따라 다운로드를 실햐할 수도 있는데 이럴 경우 업데이터 세팅을 가보면 커넥션 파라미터들이 있습니다. proxy server를 사용하는 경우 설정할 수 있는 값들을 볼 수 있고 적절한 설정을 해주고 커넥션 체크를 누르면 커넥션이 정상인지 확인 가능합니다. 연결이 정상적인 걸 확인한 뒤 다시 install new library에서 적절한 패키지를 선택하고 install now를 실행하면 됩니다. 설치를 마치고 c drive의 유적 폴더를 가보면 본인 계정의 폴더가 있고 그 안을 보면 리파지토리 폴더가 있습니다. 이곳에 소스 패키지가 설치되는데 폴더 안을 보면 평가 보드 및 데모 부대에서 바로 돌려볼 수 있는 다양한 종류의 예제들도 확인할 수 있습니다. 그러면 다시 메인으로 들어와 프로젝트를 한 번 생성해 보도록 하겠습니다. new project 킹링크를 클릭한 뒤 mc를 선택하고 각각의 핀들을 설정해 보도록 하겠습니다. 시리즈의 sdm32f4를 선택하고 라인을 sdm32f407417을 선택합니다. sdm32f4 discovery 보드에 맞게 lqfp 100p를 설정하고 list에서 sdm32f407 vgtx를 선택하면 mcu 선택은 끝납니다. 여기서 만약 mcu가 아닌 보드를 선택하게 되면 이미 기본적인 핀 세팅이 보드에 맞춰진 설정 파일을 불러올 수도 있습니다. ok 버튼을 누르면 이와 같은 화면으로 시작하는데 오른쪽 화면에 해당 mcu 패키지 모습을 볼 수 있고 각각의 핀들도 확인할 수 있습니다. 그리고 왼쪽에는 해당 mcu가 보유하고 있는 모든 페리펄들이 열거되고 각각의 기능들을 활성화시킬 수 있습니다. mcu 페리펄뿐만 아니라 list 상단에는 몇 가지 미들웨어들도 설정할 수 있는 것을 보일 수 있습니다. PAPI 시스템 프리 R2S 이더넷을 위한 lwip usb host device 이렇게 mcu에 맞춰 포팅된 미들웨어들도 큐브 mx로 함께 생성할 수 있습니다. 오늘 만들 프로젝트는 LED 토글입니다. 핀맵 화면을 통해 LED에 연결된 GPIO들을 설정해 보도록 하겠습니다. Discovery 보드 회로를 보면 PD12, 13, 14, 15번 핀에 LED가 연결되어 있는 것을 확인할 수 있습니다. 핀맵 화면에서 해당 핀을 직접 찾을 수 있는데요. 선택한 mcu의 패키지 핀수가 많아지면 굉장히 찾기 힘들겠죠. 상단 툴바의 파인드 창을 볼 수 있습니다. 여기서 PD12를 검색해 보면 이어가치 해당 핀이 하이라이트 되는 것을 확인하실 수 있습니다. 각각의 핀을 마우스 왼쪽 버튼 클릭하고 GPIO 아웃풋으로 설정하도록 하겠습니다. mcu를 동작시키기 위해 기본적으로 클럭이 공급되어야 하는데 외부 발진자를 사용할 경우 해당 핀들을 활성화시켜줘야 합니다. 페르패럴 리스트에서 RCC를 클릭하고 외부 크리스타를 선택하도록 하겠습니다. 만약 내부 발진자를 사용할 경우 해당 값을 디세이블로 그대로 유지하면 됩니다. 페러를 보면 Discoveryboard의 high-speed 클럭으로 8MHz 크리스타이 연결되어 있습니다. low-speed 클럭으로 32.768KHz가 연결되어 있는데 오늘은 high-speed만 사용하도록 하겠습니다. RCC 세팅에서 high-speed 클럭 HSE의 크리스타를 선택합니다. 오른쪽 핀맵에서 이와 같이 해당 핀의 색깔이 바뀌고 클럭 핀으로 활동된 것을 확인할 수가 있습니다. 그리고 CIS쪽을 클릭하면 사용할 수 있는 디버그 인터페이스를 고를 수 있는데 SerialWire 디버그 SWD 인터페이스를 선택하겠습니다. 여기서 한 가지 유의하셔야 할 부분이 있습니다. 만약 디버그 설정을 하지 않고 디세이블로 그대로 둔 뒤 코드를 Generations 하고 M-shoe의 Writing 프로그램 하게 되면 M-shoe 동작과 동시에 디버그 인터페이스들이 막히기 때문에 다음 번에 제라이팅이 어려워집니다. 이런 경우 하드여적으로 BOOT 모드를 시스템 BOOT 혹은 SRAM BOOT 모드로 바꾼 뒤 정상 페멸을 다운로드 하는 방법이 있습니다. 모든 P9 설정이 끝나면 다음으로 클럭 컴퓨그레이션으로 넘어가겠습니다. 보시는 다이어그램은 M-shoe 내부의 모든 클럭들을 나타낸 것인데 설정값들이 많습니다. 만약 이런 클럭 설정을 소스상에서 직접 코딩할 경우 매뉴얼에서 일일이 각각의 의미를 파악해가며 수정해야 하기 때문에 많은 집중을 요구합니다. 그만큼 실수가 생길 가능성도 높아집니다. 보시는 것과 같이 CUBE MX에서는 각각의 설정값들을 바꿀 때마다 하위클럭의 변화를 한눈에 볼 수 있습니다. 잘못된 설정이 있을 경우 에러 메세지를 보여줘 완벽한 설정이 가능하도록 도와줍니다. 제가 만약 값을 이렇게 잘못 주게 되면 보시는 것과 같이 붉은색으로 표시되며 마우스를 가져가면 뭐가 문제인지 설명해 줍니다. 여기서는 PLL-M 아웃이 잘못 설정됐고 이 값의 범위가 얼마보다 크고 얼마보다 작아야 한다는 내용입니다. H-클럭 즉 시스템 클럽으로 100MHz를 공급하고 싶은 경우 PLL 및 프리스케일을 직접 설정할 수도 있지만 100MHz라는 값을 H-클럭에 바로 입력하면 자동으로 상위의 멀티플라이어나 디바이더들이 설정됩니다. 인프클럭에 8MHz를 설정하고 PLL-SOS-MUX는 HSE, 웹클럭 시스템 클럭 MUX는 PLL-CLUG로 설정하겠습니다. H-클럭으로는 100MHz 값을 설정하도록 하겠습니다. 다음 컴퓨그레이션 탭으로 넘어가도록 하겠습니다. 앞에서 PERIPERAL 및 각 핀들을 활성화했는데 이번 탭에서는 앞에서 활성화한 PERIPERAL들을 디테일하게 설정할 수 있습니다. GPIO를 클릭하면 GPIO로 설정된 핀들이 리스트업되어 나오고 여기서 특정 GPIO를 클릭하게 되면 어떻게 상세 설정이 가능한지 볼 수 있습니다. 오늘 쓰일 PD-12, 13, 14, 15번 핀의 경우 아웃프 푸쉬풀로 설정이 되고 NO 풀업, NO 풀다운으로 설정되어 있습니다. MAX 아웃 스피드는 low로 되어 있습니다. 필요하다면 유저라벨로 이렇게 이름을 넣을 수도 있습니다. 그리고 OK를 누르면 설정값들이 반영됩니다. 이제 필요한 모든 설정을 마쳤고 소스코드를 생성해 보도록 하겠습니다. 상단 툴파에서 GENERATE SOURCE CODE를 클릭하면 프로젝트 생성창이 뜹니다. 프로젝트 이름은 테스트로 하고 경로는 바탕화면으로 하겠습니다. 툴체인의 경우 IAR에서 나온 EW-ARM을 지원하고 K1에서 나온 MDK 버전 4, 5, 2개 모두 지원합니다. GCC 기반의 TRUE STUDIO와 SYSTEM AUKVENGE 4, STM32, 즉 SW4, STM32, 이렇게 두 가지를 지원합니다. 오늘은 EW-ARM으로 설정하고 OK를 누르겠습니다. 이렇게 해서 프로젝트가 만들어졌고 오픈 폴더를 누르면 해당 프로젝트 폴더를 열게 됩니다. 드라이버 폴더를 보면 STM32F4 구동에 필요한 모든 라이브레이들이 준비되어 있습니다. 그리고 SOURCE 폴더를 보면 오늘 수정하게 될 MAIN.C SOURCE를 확인할 수 있습니다. MAIN.C SOURCE를 열게 되면 유저코드 비긴, 유저코드 엔드, 이런 추석들을 많이 볼 수 있는데 SOURCE CODE 수정할 때 주의하셔야 할 부분이 이런 유저코드 비긴과 엔드 사이에 내용을 추가하셔야 합니다. 만약 QVMX가 생성한 SOURCE CODE SOURCE들을 직접 수정하거나 유저코드의 이력이 아닌 곳을 유저코드 영역이 아닌 곳을 수정하게 되면 다음번 SOURCE CODE 생성 때 해당 수정 사항들이 모두 지워지게 됩니다. 제가 한번 유저코드 영역이 아닌 두 곳을 수정하고 코드를 다시 생성해 보도록 하겠습니다. 새로운 딜레이야 함수를 유저코드 영역이 아닌 곳에 작성하겠습니다. 그리고 SOURCE를 수정하다 보니 제가 GPIO 설정을 잘못한 것을 알고 QVMX가 생성한 MX GPIO 이닛 함수를 그 내부를 직접 수정하였습니다. 그 뒤 QVMX를 다시 띄우고 코드를 생성하게 되면 보신 바와 같이 이전의 유저코드 영역이 아닌 부분은 모두 지워져 있습니다. 그 외 SOURCE 작성법에 대한 몇 가지 내용은 다음 기회에 자세히 설명드리도록 하겠습니다. 자 그럼 해당 프로젝트를 열고 LED 토글 데머를 위해 SOURCE를 수정해 볼까요? GPIO를 토글하기 위한 적절한 함수를 찾아보겠습니다. EWM 왼쪽에 프로젝트 창을 보면 DRIVERS 폴더가 있습니다. 그 안에 STM32F4XX HAL DRIVER 폴더가 있는데 그 안을 보면 STM32F4XX HAL GPIO.C 소스가 있습니다. 더블 클릭해서 열어보겠습니다. STM32F4의 GPIO를 제어하기 위한 Library 함수들이 모두 보여 있는데 아래쪽으로 쭉 내려가보면 HAL GPIO TOGLE PIN 이라는 함수가 있습니다. 함수 원형을 카페하고 다시 메인점 C를 열어 메인 함수 안에 와일금은 유족코드 영역에 복사하도록 하겠습니다. 그리고 저희가 토글 하려던 PIN이 D-PORT의 12, 13, 14, 15번 PIN이죠. 첫 번째 인자로 GPIO D라는 값을 넣고 두 번째 인자의 GPIO PIN 12, GPIO PIN 13, 14, 15를 각각 넣도록 하겠습니다. 아무래도 와일문에서 계속 토글만 하면 깜빡이는 걸 눈으로 보일 수 없겠죠. 딜레이 함수를 메인 함수 바로 위 유족코드 영역에 정해줍니다. 메인 함수의 와일문의 TOGLE 함수와 함께 딜레이 함수도 출발하도록 하겠습니다. 컴파일하고 에라가 없다면 보드에 바로 다운로드 할 수 있습니다. 보시는 것과 같이 4개의 LED가 깜빡이는 것을 확인할 수 있습니다. 지금까지 STM32 CUBE MX로 소스를 생성하고 생성된 소스를 EW함에서 컴파일한 뒤 보드에서 동작되는 것까지 확인했습니다. 초기 하드웨어 개발 단계부터 소프트웨어 개발 단계까지 CUBE MX를 활용하면 좀 더 쉽고 빠르게 작업이 진행할 수 있을 겁니다. STM32 CUBE MX에 대한 더 자세한 내용은 후속되는 튜토리어에서 말씀드리도록 하겠습니다. 감사합니다.