2019. 6. 28. 09:46ㆍ임베디드/32F429IDISCOVERY
메인 루프에서는 PG14를 1초마다 toggle 시키고, 스위치 입력을 외부인터럽트로 사용해서 PG13의 LED 상태를 바꿔주는 소스코드를 작성해보려고 한다
1. cubeMX에서 먼저 LED에 대해서 OUTPUT 설정을 하자
2. USER 스위치를 GPIO 입력이 아닌 EXTI 외부인터럽트로 설정하자. 그리고 어떠한 조건에서 인터럽트를 발생시킬지를 결정해야 하는데, 스위치 회로는 풀다운 저항과 연결됐다. 따라서 0 -> 1로 레벨이 변하는 시점인 Rising Edge로 설정을 한다.
3. 외부인터럽트로 사용하기 위해서는 EXTI 설정과 더불어 NVIC 설정도 되어있어야 한다. 다음과 같이 EXTI0 인터럽트에 대한 NVIC를 enable 시켜주자. NVIC 설정으로 우선순위를 변경시킬 수 있지만 지금은 기본 상태로 남겨두도록 한다
4. TrueSTUDIO로 설정을 올바르게 하고 Generate Code를 한다
5. 먼저 기본적으로 main loop에서 동작하는 PG14 toggle 코드를 작성하자
6. 인터럽트와 관련한 설정을 살펴봐야 하는데, 인터럽트 설정은 HAL 라이브러리 구조에서 살펴봤듯이 stm32f4xx_it에서 다루게 된다. stm32f4xx_it.c 맨 마지막으로 내려가게 되면 EXTI0에 대한 Handler가 정의되어 있다. 이 부분은 사전에 EXTI 설정을 했기에 인터럽트 부분에 추가가 된 것이다. Handler는 다시 한 번 HAL 함수를 부르고 있기에 F3으로 이동해보자
7. HAL_GPIO_IRQHandler에서는 인터럽트 여부를 검사하면서 결국에는 어떠한 동작을 할 것인지에 대해서 Callback 함수를 호출하게 된다. Callback 함수는 이제 우리가 작성해야하는 코드로 바로 밑에 weak 속성으로 함수가 정의되어있다.
따라서 Callback 함수를 main으로 복사해와서 재정의를 하도록 할 것이다
8. 다음과 같이 PG13의 상태를 인터럽트마다 바꿔주기로 했기 때문에 toggle 코드를 작성하자
그리고 프로그램 코드를 FLASH 하면 PG14가 toggle 되면서 스위치 입력이 들어갈때마다 PG13의 상태가 바뀌는 것을 확인할 수 있다
[+추가]
HAL_GPIO_EXTI_IRQHandler에서의 __HAL_GPIO_EXTI_CLEAR_IT는 Pending bit를 clear하는 부분이다
'임베디드 > 32F429IDISCOVERY' 카테고리의 다른 글
32F429IDISCOVERY TrueSTUDIO에서 SPL로 GPIO EXTI 제어 (0) | 2019.06.29 |
---|---|
NVIC와 EXTI (0) | 2019.06.29 |
tiny_printf 사용유무에 따른 프로그램 크기 차이 (0) | 2019.06.27 |
stm32f4xx_hal_msp.c 역할 (0) | 2019.06.26 |
HAL 라이브러리 구성 (0) | 2019.06.25 |