개요. | |
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.
'임베디드.일렉트로닉스 > STM32' 카테고리의 다른 글
STM32F4 시리즈의 LQFP100 의 핀 호환성. STM32F4x1만 48,49핀이 다름. (0) | 2015.04.11 |
---|---|
STM32F4 회로 설계 가이드 - 전원 처리. (1) | 2014.12.13 |
STM32CubeMX 에서 STM32 라이브러리 다운로드 방법 및 활용 가이드. (0) | 2014.10.29 |
STM32Cube개요, STM32CubeMX 설치. (0) | 2014.10.28 |
STM32F429 디스커버리 보드. - STM32 개발보드. (0) | 2014.10.28 |
댓글