본문 바로가기
임베디드.일렉트로닉스/STM32

STM32 핀 인터럽트 설정, 인터럽트 핸들러 처리법.STM32CubeMX, KEIL MDK-ARM 이용.

by i.got.it 2014. 10. 29.

 

 

 

개요.

   
 

1. STM32 의 특정핀을 입력으로 하면서 외부 인터럽트 처리토록 설정하는법. <- STM32CubeMX에서의 설정법 보임.

2. 핀인터럽트 설정된 핀의 핸들러 함수 처리법. <- KEIL MDK-ARM 에서 설정법 보임.

3. 1에서 설정된 인터럽트 기능 인에이블 된것을 코드내에서 동적으로 인에이블 디스에이블 하는법.

 

 

 

 

 

1. 핀 인터럽트 설정하기-STM32CubeMX에서.

   
 

 

1. STM32CubeMX Pin 을 "GPIO_EXTI번호" 설정,

- STM32CubeMX의 PinOut 탭 에서 원하는 핀을 마우스클릭하여 GPIO_EXTI번호 선택한다. 

- 모든 GPIO핀(0~15 까지 총 16개) 은 외부인터럽트 처리되게 설정가능하나. 인터럽트 핀번호 1개당 특정포트의 핀 1개만 선택가능하다. 즉, GPIO D 의 9번핀에 EXTI9 를 할당했다면 다른포트( A, B, C,..) 의 핀9는 인터럽트 설정불가능. 


 


 

2. STM32CubeMX Configuration 탭에서 GOIO 설정.

이후, Configuration 탭에서 그림중 GPIO 클릭하여 설정창에서, 앞의 1에서 우리가 선택한 핀 PD9 를 선택하면 하단에 검출할 에지선택이 있다. 여기서 주의사항 External Interrupt ... 를 선택해야한다. External Event 아님.


 

 

3. Configuration 탭에서 NVIC 설정.

위 2번 설정 만으로는 자동생성된 프로젝트에는 해당핀의 이벤트 발생시 처리할 이벤트 처리루틴이 안만들어진다. 이벤트 처리루틴이 코드내에서 자동생성되게 하려면,   Configuration 탭에서  NVIC 를 클릭하여, EXTI[9:5] 의 Enabled 부분을 체크한다.

 

여기까지가 STM32CubeMX에서의 설정끝.

 

 

 

 

 

 

2. 핀 인터럽트 핸들러 사용자 구현.

   
 

앞의 1에서 STM32CubeMX 설정하고 KEIL MDK-ARM 용으로 프로젝트 자동생성하여 uVision 에서 자동생성된 프로젝트 열어보자.

 

프로젝트에서 지금 우리가 관심가질사항은 인터럽트 핸들링을 어떻게 작성하는가 ? 이다.

우리가 이번에 추가한 PD9의 인터럽트 핸들러 관련코드는 stm32f4xx_it.c 에 추가된다. 아래 붉박.

코드이해.

PD9 에 외부에서 상승에지가 발생하면 실행되는 것은 아래 EXTI9_5_IRQHandler() 이다.

이 함수 내부에 보면 2개의 함수가 있는데 첫번째 것은 인터럽트관련 플래그 클리어 처리하는것이고(우리는 관여할것 없다.),



 

두번째 함수가 실 인터럽트 처리 함수다.  이 함수의 정의를 따라 가보면  아래 처럼 HAL_GPIO_EXTI_Callback() 가 최종 실행되고 있는데, 이 함수는 실제 코드는 아무것도 없다. 그리고 파란색 박스 함수의 내부 설명을 보면 이 코드 수정하지말고 사용자 파일에서 HAL_GPIO_EXTI_Callback 을 구현하라고 되어있다. <= 이 지시사항대로 우리가 직접 구현한 HAL_GPIO_EXTI_Callback 내부에서 처리할 사항 코딩하면 된다.



 

HAL_GPIO_EXTI_Callback 을 구현해보자.

위치는 어디로 하든 관계없는데, 우리는 이 인터럽트 처리를 CC3100 에서 수신되는 인터럽트 처리할 목적으로 만들었기 때문에 cc3100spi.c 내에 추가한다. 처리코드 내부는 임의로 시험용으로 spi 출력되게 한것임.


 

PD9 핀을 손으로 잡아 60Hz 노이즈 인가하면 각 상승에지마다 SPI출력핀으로 펄스들이 나오는것을 오실로스코프로 확인하였다. 즉, 우리의 인터럽트 핸들러가 정상 수행되고 있음을 확인했다.

 

 

핀인터럽트 핸들러 디테일 처리 추가하고 위치 수정함.

한편, HAL_GPIO_EXTI_Callback 함수의 인자를 보면 핀번호가 전달되고 있다. 즉, 이 함수는 단일 핀 만 처리하는 용도가 아닌, 여러 핀에 인터럽트 설정한 경우 모두 이 함수가 호출됨을 알 수 있다. 따라서, 우리는 PD9 에 의한 인터럽트만 처리하도록 하는 추가 처리가 함수 내부적으로 필요하다. 또한, 인터럽트 처리 함수를 cc3100spi.c 에서 구현했는데 이 함수가 PD9 만 처리하는 것이 아니므로 적당한 장소가 아니다. 다른 핀 인터럽트도 이 함수에서 처리될 수도 있기에 우리는 이 함수를 board.c 로 옮기도록 하자.

아래 spi_Write 는 인터럽트 정상적으로 처리되고 있는지 스코프로 찍어볼려고 넣어둔 코드다.


 

 

끝. -  인터럽트 핸들러 구현.

 

 

 

3. 핀 인터럽트 enable, disable 하기. 

   
 

앞의 설정에 의하여 핀 인터럽트 처리는 항상 구동되게 되어있는데, 상황에 따라서는 핀 인터럽트를 프로그램내에서 동적으로 enable, disble 할 일도 있다. 추정되는바 간단함 함수로 제공될터인데,,,,, 자동생성된 코드에서 대충뒤져보면. 결론적으로 아래 2개의 함수다.

 

인에이블 시킬려면 -> void HAL_NVIC_EnableIRQ(IRQn_Type IRQn);

디스에이블 시킬려면 -> void HAL_NVIC_DisableIRQ(IRQn_Type IRQn);

 

함수인자로는 PD9인 경우엔, EXTI9_5_IRQn 이다. <- 이것 확인은 main.c 에서 자동생성된 void MX_GPIO_Init(void) 함수 내에서

HAL_NVIC_EnableIRQ(EXTI9_5_IRQn);  의 인자를 보고 알 수 있다. PD9가 아닌 다른 핀을 EXTI로 설정한 경우에도 유사한 방식으로 인자값을 찾을 수 있다.

 

끝. - 핀인터럽트 enable, disable하기.

 

 

 

 본 글이 포함된 상위 정리장소 : http://igotit.tistory.com/244

 

 

 

///162.

댓글



 

비트코인




암호화폐       외환/나스닥/골드         암호화폐/외환/나스닥/골드
     
현물 |선물 인버스 |선물 USDT       전략매니저(카피트레이딩)         프랍 트레이더 온라인 지원가능. MT4,MT5