안녕하세요. 오늘은 STM32 외부인터럽트에대해 알아보겠습니다.
먼저 데이터시트에 있는 외부인터럽트 블록도를 보겠습니다. (STM32F103RB)
AMBA APBbus : 주변장치와 통신하기위해 사용하는 버스입니다. 외부인터럽트는 APB2 버스를 사용합니다.
Peripheral Interface : APB 버스를 통해 들어오는 데이터를 처리하여 레지스터에 전달하거나 레지스터에서 데이터를 읽습니다.
PCLK2 : 클럭입니다. APB2버스를 사용하므로 PLCK2 클럭을 사용합니다.
빗금 숫자 19의 의미 : 레지스터의 크기가 19라는 의미입니다. 해당 MCU는 19개의 외부인터럽트가 있습니다.
Input Line : 외부 인터럽트가 발생할수있는 라인입니다. 아래의 그림을보면 EXTI0은 PA0 or PB0 or PC0...이 발생시킬수 있습니다. 그러므로 EXTI0을 사용할때는 0번핀중에 한개를 선택해야합니다.
Edge detect circuit : 상승엣지인지 하강엣지인지 구분하는 회로입니다.
Software interrupt event register : 소프트웨어로 인터럽트를 발생시키는 레지스터입니다. SWIER레지스터를 이용하면 소프트웨어로 인터럽트를 발생시킬 수 있습니다. 여기서 중요한게 해당레지스터랑 Edge detect circuit이랑 OR게이트로 연결되어있어서 인터럽트발생을 알려줍니다. 이 의미는 software로 인터럽트를 발생시키나, hardware로 인터럽트를 발생시키나 동작시키는 함수는 같을 거라고 예상을 할 수 있습니다.
Pending Request Register : 외부 인터럽트가 발생했을 때 이를 기록합니다.
Interrupt Mask Register(IMR) : 인터럽트 발생을 제어합니다.
Event mask register(EMR) : 이벤트 발생을 제어합니다.
IMR은 사용하지않고 EMR만 사용한다면 소프트웨어가 주기적으로 EXTI_PR레지스터를 확인해서 폴링방식으로 이벤트상태를 확인해야합니다.
NVIC(Nested Vectored Interrupt Controller)
위의 블록도에서 최종적으로 인터럽트가 발생하면 NVIC interrupt controller로 신호가 나가므로 NVIC에 대해 알아보겠습니다.
NVIC는 인터럽트에 관련된 요청을 모두 관리합니다. NVIC는 여러 인터럽트가 동시에 발생할 때 우선순위를 설정해 중요한 인터럽트가 먼저 실행되도록합니다.
인터럽트우선순위는 기본 우선순위가 데이터시트에 나와있고 소프트웨어에서도 우선순위설정이 가능합니다.
사용하는레지스터
EXTI13번 Interrupt Rising edge를 설정했을 때의 레지스터입니다. 관련된 레지스터가 6개가 있는데 블록도 애도 6개가 그려져있어서 사용하는 레지스터가 같은 거를 확인할 수 있습니다. 평소에는 PR(Pending Register)레지스터가 0이다가 인터럽트가 발생되면 HIGH로 됩니다.
그리고 디버그모드로 SWIER(Software Interrupt Event Register)레지스터를 0x2000로 설정하면 인터럽트가 발생되는것을 확인할수있습니다.
사용방법
이제 실제로 외부인터럽트를 2개 설정한다음에 동작하는것을 확인해보겠습니다.
1. 사용할핀을 인터럽트 설정합니다. (GPIO_EXTI0) 여기서는 EXTI0, EXTI1을 설정합니다.
2. System Core -> GPIO로가서 mode, pull-up/pull-down을 설정해줍니다.
3. System Core -> NVIC로가서 EXTI0, EXTI1을 Enabled 해주고 코드제너레이터를 합니다.
4. stm32f1xx_it.c에 인터럽트핸들러 두개가 생겼습니다. 공통내용인 HAL_GPIO_EXTI_IRQHandler를 따라가보면 최종적으로 HAL_GPIO_EXTI_CAllback을 호출합니다.
5. HAL_GPIO_EXTI_Callback은 __weak선언이므로 원하는곳에서 재사용해서 사용해주면 됩니다.
6. 이런식으로 EXTI구분은 GPIO_Pin으로 했습니다
인러텁트 우선순위 테스트(NVIC 테스트)
(1) EXTI0의 우선순위는 1, EXTI1의 우선순위는 2로 설정하고 코드는 아래처럼 바꿔보겠습니다.
(낮을수록 더 높은 우선순위)
EXTI0가 실행되면 while(1)이므로 빠져나오지를 못합니다. 이때 EXTI1가 실행되도 PR레지스터에 SET만되고 EXTI1의 인터럽트는 실행되지않습니다. 우선순위가 같은경우도 결과는 같습니다.
(2) EXTI0의 우선순위는 2, EXTI1의 우선순위는 1로 설정하고 해보겠습니다.
EXTI0가 실행되고 while(1)으로 빠져나오지못하고있을때 EXTI1를 실행시키면 EXTI1가 실행됩니다. 이유는 더 높은 우선순위인터럽트가 발생했기때문에 실행중이던것을 멈추고 우선순위가높은 인터럽트를 먼저 처리하고 다시 돌아옵니다.
'STM32 > 이론' 카테고리의 다른 글
STM32 PWM TIMER 알아보기 (0) | 2023.12.31 |
---|---|
STM32 GPIO제어하기 INPUT MODE (1) | 2023.11.18 |
STM32 GPIO제어하기OUTPUT_3편(MX_GPIO_Init함수 분석) (1) | 2023.10.22 |
STM32 GPIO제어하기OUTPUT_2편(컨피규레이션 설정) (1) | 2023.10.14 |
STM32 GPIO제어하기 OTUPUT_1편(LED깜빡이기) (0) | 2023.10.02 |