본문 바로가기
임베디드 쌩초보 공부/STM32

STM32 CubeMx Code Generation 상세분석

by 존버매니아.임베디드 개발자 2021. 12. 12.
반응형

STM CubeMX

Cube MX 매뉴얼 : UM1718 STM32CubeMX for STM32 configuration and initialization C code generation

 

MCU의 다양한 페리펄럴과 관련된 셋팅을 GUI 툴로 Setting 하고, Code gen을 하면 셋팅된 내용을 기준으로 관련된 SW Code를 자동으로 만들어주는 툴이다.

 

Ex) clock설정, Uart 설정, SPI 통신 설정, GPIO 설정 , 인터럽트 설정 등등

- Uart의 경우 : 각각의 Uart 채널에 대해서 BaudRate, WordLength, FIFO 사용 여부 , 해당 채널에 연결해서 사용할 Pin 셋팅, 인터럽트 사용 여부 등등을 GUI로 셋팅

 

- GPIO의 경우: 각 핀마다 Output/Input 여부 , Output의 경우 Default 출력값, 핀 변화속도 등등을 셋팅

 

이러한 셋팅을 하고나서 Code Gen을 하면 관련된 Init 코드들이 자동으로 생성되서 main 함수에서 호출되는 형태로 구성된다.

 

아래 그림의 왼쪽에서, 툴에서 UART 4번 채널을 골랐을 때, 관련된 셋팅들을 간단하게 할 수 있는 GUI 를 볼 수 있다.

아래 그림 오른쪽에는, 이렇게 GUI로 셋팅된 내용을 바탕으로 Code gen해서 만들어진 코드결과물이다.

예시의 경우 Uart4에 대해 GUI로 셋팅을 했고 그 결과 MX_UART4_Init이라는 함수가 만들어지고 ,안에 저런 내용이 Default로 셋팅이 된다.

또한 이 MX_UART4_Init 함수는 main 함수에서 while 문이 돌아가기전에 호출되게 된다.

 

위 그림을 보면 대강의 구조가 이해 될 것이다.

GUI로 셋팅된 내용과 관련하여 Peripheral 마다 Init 함수가 생성됐고

그리고 main 함수에서는 그 init 함수를 자동으로 호출하는 코드도 생성이 된다.

따라서 CubeMx에서 GUI를 셋팅하고 code gen만 한 상태로 프로젝트를 빌드해도

초기 Init 셋팅 까지는 자동으로 완료가 되는 것이다.

 

한편, 위 main 함수에 보면 User code begin , user code end 라는 주석문이 있는데

유저가 어떤 코드를 짤 때는 저 주석안에 내용을 넣어야한다.

해당 주석 바깥에 코드를 짤 경우

code gen을 할 때 해당 영역은 gui 셋팅만을 보고 새롭게 쓰기 때문에 유저가 핸드코딩 한 코드는 지워지기 때문이다.


근데 Code Gen을 모듈마다 켜고 끌수도있고, code gen 할 때 어떤어떤 function을 자동으로 생성할 건지도 지정할 수 있고 일단 이 글은 그냥 러프하게 Default 셋팅 배경으로 설명한다.

아래 같은 메뉴를 통해서 Code Gen 관련해서 이런저런 셋팅들을 해줄 수 있구나 하고만 알고넘어가자

상세한 내용은 cubeMx 유저매뉴얼 참고


이번에는 CubeMx가 Code gen 해주는 코드에 대해서 좀 더 상세히 알아보자.

정확한 내용은 이 글의 첫번째에 적어놓은 유저매뉴얼에 아주 자세히 나와있으니 참고하고 우선은 러프하게 내가 파악한 내용만 정리한다.

 

 

위 그림은 CubeMx로 프로젝트를 만들어서 code Gen을 했을 때 Default 폴더 구조이다.

위 그림에서 빨간색으로 표시된 코드와 헤더파일 들이 code gen을 통해서 새로 생성되거나 내부 내용이 변경된다고 생각하면 된다.

 

또한 아래에 보면 HAL_Driver 라는 것이 있는데

HAL Driver 코드와 헤더파일 자체는 STM에서 만들어서 제공하는 표준 라이브러리 같은 것이기 때문에, 코드안의 내용이 GUI 셋팅에 따라서 변하진 않는다.

다만, 우리 프로젝트에서 사용하는 Peripheral과 관련된 코드만 프로젝트에 새로 추가하게 된다.

예를 들어 RNG 라는 패리펄럴이 있는데 이것을 사용하겠다고 체크하면 해당 HAL Library를 써야되기 때문에 드라이버에 저 코드가 생성되는 것이다.

만약 RNG 라는 모듈을 사용한다고 셋팅하지않으면, 저 모듈을 가져다 쓸 필요가 없기 때문에 코드가 생성되지 않는다.

 

 

한편, Inc, Src 폴더내에 빨간색으로 표시된 내용이 주요하게 살펴볼 내용이다.

상세한 내용은 유저매뉴얼 chapter 6.STM32CubeMX C Code generation overview 에 아주 잘 적혀있다

하지만 데이터시트는 왠지 보기만해도 독해력이 50%는 떨어지는 놀라운 디버프 효과를 갖고 있기 때문에

내 블로그의 글을 보고 느낌부터 파악하자.

 

1. main.h

우리가 사용할 핀에 대해서 이름을 정해 줄 수 있는데, 그 이름과 관련된 define문이 자동생성된다.

한편 코드 제일 위에 보면 #define Test_Define 123 이라는게 있는데

이건 cubeMx 셋팅 메뉴중에 user constant value 라고 정의하는게 있는데 그것이 code gen 된 것이다.


2.stm32l4xx_hal_msp.c

툴에서 셋팅한 각 패리펄렬 별로 init 함수가 만들어진다.

해당 init 함수에서는 해당 패리펄럴과 관련된 pin allocation, clock enable, interrupt 셋팅, dma 셋팅등을 하게 된다.

헷갈리지 말아야하는게 뭐냐면 패리펄럴과 관련된 모든 셋팅이 이쪽에 생성되는게 아니라

main.c 에도 패리펄럴가 관련된 init 함수가 생성된다.

 

msp.c 에는 해당 패리펄럴과 관련된 직접적인 셋팅을 한다기 보다, 해당 패리펄럴에서 사용하는 핀,clock,interrupt,dma를 셋팅하는 것이고

 

main.c에 생성되는 init 함수는 실제 해당 페리펄럴과 관련된 셋팅을 하는 것이다.

 

SPI통신을 예로 들어 살펴보자.

참고로 왼쪽에 만들어진

HAL_SPI_MspInit 함수는

HAL_SPI_init 함수 안에서 불려지게 된다.


3.main.c

만들어지는게 크게 3가지로 구분된다.

직접적인 패리펄럴 셋팅 -> Mx_패리펄럴_init(void)

시스템클락 셋팅, -> SystemClock_Config(void)

이렇게 셋팅된 내용들을 main 함수에서 호출하는 코드 main 함수안에서 위에 생성된 코드들을 호출함

 

- Peripheral과 직접적으로 연관된 셋팅들을 init 하는 MX_패리펄럴_init() 함수가 만들어진다.

(앞에 예시에서 살펴본 MX_Spi_Init )

 

- 시스템 클락과 관련된 셋팅이 code gen 된다.

 

CubeMx툴에 저렇게 클락과 관련된 셋팅을 하는 곳이 있는데, 셋팅된 내용이 Systemclock_Config 함수 안에 정의된다.

그리고 이 코드가 main.c에 정의되고 main 함수에서 불려지는 것이다.

 

아래 main 함수를 보면 위에서 말했던 init 함수와 system clock init 함수를 호출하는 모습을 볼 수 있다.


stm32l4xx_it.h

stm32l4xx_it.c

끝에 _it 가 붙으면 인터럽트와 관련된 것이라고 생각하면 된다.

 

mx 툴에서 인터럽트와 관련된 셋팅은 NVIC 라는 곳에서 하는데,

여기서 인터럽트 enable을 하고, handler의 code gen 여부 등을 셋팅하면 왼쪽 그림처럼 핸들러 코드가 생성된다.

헤더파일은 이런 핸들러 함수들의 선언만 모아놨다.

참고로, 이런 인터럽트 핸들러가 벡터테이블에 제대로 매핑이 되어있어야 인터럽트 발생시 호출이 될 텐데..

그 역할을 하는 코드는 이미 만들어져서 프로젝트에 포함되어있다. (아래 그림 참고)

스타트업과 관련된 .s 파일(어셈블리 작성파일) 에 보면 아래와 같이 벡터테이블에 이미 매핑시켜놨다.

 


stm32f4xx_hal_conf.h 유저매뉴얼에 define이 자주 잘되어있다.

this file defines the enabled HAL modules and sets
some parameters (e.g. External High Speed oscillator frequency) to predefined
default values or according to user configuration (clock tree).

 

 

반응형