STM32F0 EXTI 데이터시트 공부해봅시다.
STM32F0 LL EXTI 드라이버 목차
EXTI는 ATMEGA 공부 시절에도 구현해 본적이 없어서 데이터시트 공부를 좀 해봤다.
코드 작성하고 구동 확인한 뒤, 포스팅한다.
뭐든 확신이 있어야 포스팅하지.
Functional description
EXTI를 사용하면 인터럽트가 생긴다.
사용하려면 두 가지를 설정해야 한댄다.
1)인터럽트를 설정하고, 2) 인식할 때 상황을 지정 하란다.
- 인터럽트 마스크 레지스터 (interrupt mask register) : 인터럽트를 사용하려면 1을 주고 사용 안하려면 0을 입력하는 건데, 이걸 보통 마스킹한다고 표현한다. 그냥 Enable할 건지, Disable할 것인지 설정한다고 생각하면 편하다.
- 인식 상황 지정(edge detection) : 의역해놨다. edge는 간단하게 생각하면 이렇다. 만약에 버튼을 누른다고 하면 2가지 상황이 발생한다.
- HIGH(3.3V) 에서 LOW(0V)로 전압이 하강할 때
- LOW(0V)에서 HIGH(3.3V)로 전압이 상승할 때
그러니까 버튼을 누르는 순간에 1.의 상황이 발생했다면, 버튼에서 손을 떼는 순간 2.의 상황이 발생하는 식이다. 물론 회로를 어떻게 꾸미냐에 따라 2.->1.의 상태가 발생할 수도 있다.
암튼 1.의 상황일 때 인터럽트 발생하게 할 수도 있고, 2.의 상황에 발생하게 할 수도 있다. 만약 둘 다 설정하고 싶다면 두 레지스터 모두 만지면 된다. 근데 그럴 일이 있을까?
인터럽트가 만약에 생성되면 Pending 레지스터가 설정된단다.
근데 이거 값 0을 줘서 리셋안하면 다시 인터럽트가 안걸릴거다.
그러니까 계속 반복해서 EXTI 쓰고 싶으면 리셋해야한다.
일회용으로 쓰고 팽하고 싶으면 리셋 안해줘도 된다.
내부 인터럽트의 경우 Pending 레지스터 설정 안된단다.
외부 인터럽트는 소프트웨어 레지스터 설정도 가능하다는데, 위 글은 그닥 안중요했다.
안쓸거거든.
이거 말고 이벤트나, 소프트웨어 인터럽트 글도 있는데 무시했다.
안쓸거거든(2)
- 사용할 인터럽트 핀 있으면 EXTI_IMR 레지스터에 그 핀 설정하십셔~
- 트리거 방향 설정하십셔~
위로 상승하는 엣지(EXTI_RTSR)로 할건지, 아래로 할건지(EXTI_FTSR) - 인터럽트 걸리면 IRQ 핸들러 함수 호출될건데 알아서 매핑해서 사용하십셔~
참 사용하는 핀이 EXTI 어디에 매칭되는지 모르잖아?
아래를 보면 알 수 있다.
참 쉽쥬? 해당 라인이 0번핀이면 EXTI0이고 14번핀이면 EXTI14번 핀인 식이다.
그럼 레지스터 뒤져보자
EXTI_IMR
이 레지스터에다가 인터럽트 사용할 핀 설정 하십셔~
값을 1주면 SET이고 0이면 사용 안하는거다.
1번핀이면 IM1에 1주면 되고, x번 핀이면 IMx에 1 주면 된다.
어때유 참 쉽쥬?
EXTI_RTSR
전압이 낮은 곳에서 올라갈 때 인터럽트가 걸리기 원하는 사람(떡상 가즈아아)은
이거 설정해주면 된다.
EXTI_FTSR
전압이 높은 곳에서 내려갈 때 인터럽트가 걸리기 원하는 사람(떡락 가즈아아)은
이거 설정해주면 된다.
EXTI_PR
인터럽트가 걸리면 이것도 설정되는데
이거 0으로 초기화 안해주면 반복해서 인터럽트 못쓴다.
반복해서 쓰고 싶으면 두더지 게임하듯이 이놈시끼 해주자
아주 그냥 1로 불쑥 불쑥 올라올때마다 0으로 내려 꽂아주면 된다.