32F429IDISCOVERY TrueSTUDIO에서 SPL로 GPIO 제어

2019. 6. 15. 03:02임베디드/32F429IDISCOVERY

외부자료를 참고한 것이 아닌 ST사에서 제공하는 SPL로 진행한 것이라서 이론적인 부분은 아직 부족하다. 이 포스팅은 SPL 개발환경 설정을 포함한 속성으로 GPIO를 이용한 LED 제어를 한 내용들이다

 

개발환경

1. Atollic TrueSTUDIO for STM32 9.3.0

2. STM32F4xx_DSP_StdPeriph_Lib_V1.8.0

 

* STLink와 TrueSTUDIO가 깔렸다는 전제하에서 시작한다

 

백지에서 시작한다는 것은 재미가 없을뿐더러 MCU 제어에 대한 전반적으로 익힌 사람들에게만 가능한, 굉장히 어려운 내용들이다. 나는 초보이기에 ST사에서 제공하는 SPL 템플릿들을 이용하려고 한다

 

1. 구글에 stm32f429ZI SPL을 검색하면 첫 링크에 ST 사이트가 뜰 것이다. 접속하자


2. 로딩 후에 다음과 같은 화면이 뜰텐데 Product Selector로 클릭을 하자

 

3. 항목이 8개로 작기 때문에 금방 해당 그림에 대한 파일을 찾을 수 있을 것이다. 빨간색 박스에 있는 글자를 클릭하면 밑에 화면이 더 생기는데 "Get Software"를 다운로드하자

 

4. 다음 화면으로 넘어가는데 스크롤을 좀 더 내려가면 다운로드 받을 수 있다

 

5. TrueSTUDIO나 stlink를 받은 것처럼 회원정보를 입력하고 다운로드를 할 수 있다

 

6. 다음과 같은 파일을 받을 수 있다. 압축을 풀자

 

7. 파일의 구성을 살펴보자. 우리가 여기서 주목해야할 것은 en.stm32f4_dsp_stdperiph_lib\STM32F4xx_DSP_StdPeriph_Lib_V1.8.0\Project 프로젝트 파일이다. GPIO를 제어하기 위해서 STM32F4xx_StdPeriph_Examples, STM32F4xx_StdPeriph_Templates 유기적으로 봐볼 것이다

 

8. TrueSTUDIO를 열어서 프로젝트를 생성하도록 할 것이다

여기서부턴 https://noel-embedded.tistory.com/488 링크의 2번 과정까지 동일하니 참고하자

빌드 속도를 높이고 싶으면 https://noel-embedded.tistory.com/476 링크를 참고하자

 

9. TrueSTUDIO에서 위와 같이 프로젝트를 만들면 SPL을 포함한 필요한 파일들을 자동적으로 만들어주기 때문에 편리하다. 물론 펌웨어 구조와 분리된 파일들의 역할이 중요하지만 일단은 속성이기에 넘어간다. 하지만 main을 보면 허무하기 짝이없다 

 

10. 이를 위해 아까 다운받은 템플릿과 예제를 이용해야 한다. 먼저 STM32F4xx_DSP_StdPeriph_Lib_V1.8.0\Project\STM32F4xx_StdPeriph_Examples\GPIO\GPIO_IOToggle로 이동하자. GPIO에 대한 예제인데 main을 열어보기로 한다. 편의를 위해 notepad++로 열기로 하겠다

 

main.c를 살펴보면 먼저 GPIO를 초기화하는 구조체 전역변수가 보인다

 

 

그리고 주석을 읽어보면 친절하게 적혀있다. GPIOG가 포함된 AHB1 버스 클럭을 활성화해주는 코드와 GPIO를 init하는 코드, 그리고 BSRRx 레지스터를 이용해 LED를 toggle하는 코드가 보여진다

 

 

박스 친 것을 TrueSTUDIO에서 만든 프로젝트의 main.c에서 붙여넣기를 하자. 그리고 빌드를 한 번 해보자. 아마 잘 될 것이다

 

 

11. toggle을 할 것이기 때문에 Delay가 필요하다. Delay 함수를 참조하기 위해 다음 파일 경로로 가자

STM32F4xx_DSP_StdPeriph_Lib_V1.8.0\Project\STM32F4xx_StdPeriph_Examples\SysTick\SysTick_Example

Delay 함수는 SysTick Handler에 의해서 카운팅이 된다는 점을 알아두자. 마찬가지로 바로 main.c를 보자

 

Delay 함수가 보이게 된다. 아마 Delay 함수는 main 안에서만 조작되는 함수고 실체는 아마 다른 곳에서 이뤄진다는 것을 추측할 수 있다

 

Delay 함수에서 적용될 클럭을 설정하는 부분인 것 같다

 

그리고 Delay와 Delay 함수 안에서 감소되는 TimingDelay의 본체 함수를 볼 수 있다

 

아마 main에서 직접적으로 실행되지 않기 때문에 SysTick Clock에 동기화되어 인터럽트로 동작할 수 있다고 추측할 수 있다

 

일단 복사해서 포함시켜 놓자

 

12. 그리고 한 번 stm32f4xx_it.c에 들어가서 SysTick_Handler를 보면 친절하게 TimingDelay_Decrement 함수가 보일 것이다. 주석을 해제해주자

 

13. 빌드 후 디버깅을 해보면 Delay(500)이 0.5초와 맞지 않을 것이다. 그 이유는 SystemCoreClock이 최대 클럭이 180M로 설정되어 있기 때문이다

 

따라서 AHB1 버스의 클럭과 연결되어 있는 HCLK 클럭을 받아올 것이다

 

해당 코드를 추가하고 실행하면 문제없이 0.5초마다 toggle될 것이다

 

 

위 코드는 STM32F4xx_DSP_StdPeriph_Lib_V1.8.0\Project\STM32F4xx_StdPeriph_Templates\TrueSTUDIO\STM32F429_439xx의 경로에 있는 템플릿 프로젝트 파일에서 확인할 수 있다

 

위와 같이 템플릿과 예제 파일을 이용한다면 보다 쉽게 SPL로 코드를 짤 수 있게 된다