인터럽트 는 I / O 또는 명령어가 프로세서의 정상적인 실행을 일시 중단하고 우선 순위가 가장 높은 것처럼 자체적으로 서비스되는 메커니즘입니다. 예를 들어, 정상적인 실행을 수행하는 프로세서는 어떤 종류의 이벤트 나 인터럽트가 발생하는지 지속적으로 모니터링 할 수도 있습니다. 즉, 외부 인터럽트가 발생하면 (예: 일부 센서에서) 프로세서가 정상 실행을 일시 중지하고 먼저 인터럽트를 처리 한 다음 정상 실행을 계속합니다.
이 프로젝트에서는 STM32F103C8의 인터럽트 를 이해하기 위해 푸시 버튼을 외부 인터럽트로 사용합니다. 여기서는 0부터 숫자를 증가시켜 16x2 LCD에 표시하고 누름 버튼을 누를 때마다 LED가 켜지고 LCD 디스플레이에 INTERRUPT가 표시됩니다. 버튼에서 손을 떼면 LED가 꺼집니다.
인터럽트 및 ISR 유형
인터럽트는 크게 두 가지 유형으로 분류 할 수 있습니다.
하드웨어 인터럽트: 프로세서에 대한 신호가 버튼이나 센서와 같은 외부 장치 또는 신호를 생성하고 프로세서에 ISR에있는 특정 작업을 수행하도록 지시하는 다른 하드웨어 장치에서 오는 경우 하드웨어 인터럽트라고합니다.
소프트웨어 인터럽트: 소프트웨어 명령에 의해 생성되는 인터럽트.
인터럽트 서비스 루틴
인터럽트 서비스 루틴 (Interrupt Service Routine) 또는 인터럽트 핸들러는 작은 명령 세트가 포함 된 이벤트이며 인터럽트가 발생하면 프로세서는 먼저 ISR에있는 이러한 코드를 실행 한 다음 인터럽트 이전에 수행하던 작업을 계속합니다.
STM32의 인터럽트 구문
ISR은 Arduino에서 다음과 같은 구문 attachInterrupt (digitalPinToInterrupt (pin), ISR, mode) 를 가지며, 코드를 업로드하기 위해 arduino IDE를 사용하므로 STM32에서도 동일하게 사용할 수 있습니다.
- digitalPinToInterrupt (pin): Arduino 보드 Uno에서와 같이 핀 2,3이 있고 메가에서는 인터럽트에 대해 2,3,18,19,20,21이 있습니다. STM32F103C8에는 인터럽트에 사용할 수있는 GPIO 핀도 있습니다. 인터럽트에 사용하는 입력 핀을 지정하기 만하면됩니다. 그러나 동시에 둘 이상의 인터럽트를 사용하는 동안 몇 가지 제한 사항을 따라야 할 수도 있습니다.
- ISR: 외부 인터럽트 발생시 호출되는 인터럽트 핸들러 함수입니다. 인수가없고 반환 유형이 없습니다.
- 모드: 인터럽트를 트리거하는 전환 유형
- RISING: 핀이 LOW에서 HIGH로 이동할 때 인터럽트를 트리거합니다.
- FALLING: 핀이 HIGH에서 LOW로 이동할 때 인터럽트를 트리거합니다.
- CHANGE: 핀이 LOW에서 HIGH로 또는 HIGH에서 LOW로 전환 될 때 (즉, 핀이 변경 될 때) 인터럽트를 트리거합니다.
인터럽트 사용 중 일부 조건
- 인터럽트 서비스 루틴 기능 (ISR)은 가능한 짧아야합니다.
- 지연 () 함수는 ISR 내에서 작동하지 않으므로 피해야합니다.
필요한 구성 요소
- STM32F103C8
- 누름 단추
- LED
- 저항기 (10K)
- LCD (16x2)
회로도 및 연결
푸시 버튼 핀의 한쪽은 STM32의 3.3V에 연결되고 다른 쪽은 풀다운 저항을 통해 STM32의 입력 핀 (PA0)에 연결됩니다.
풀다운 저항은 버튼을 눌렀거나 놓을 때 마이크로 컨트롤러가 입력에서 HIGH 또는 LOW를 얻도록 사용됩니다. 그렇지 않으면 풀다운 저항이 없으면 MCU가 혼동을 일으키고 임의의 부동 값을 입력에 공급할 수 있습니다.
STM32F103C8과 LCD 간의 연결
다음 표는 LCD (16X2)와 STM32F103C8 마이크로 컨트롤러 간의 핀 연결을 보여줍니다.
STM32F103C8 |
LCD |
GND |
VSS |
+ 5V |
VDD |
전위차계 센터 PIN으로 |
V0 |
PB0 |
RS |
GND |
RW |
PB1 |
이자형 |
PB10 |
D4 |
PB11 |
D5 |
PC13 |
D6 |
PC14 |
D7 |
+ 5V |
ㅏ |
GND |
케이 |
인터럽트를위한 STM32F103C8 프로그래밍
이 튜토리얼의 프로그램은 간단하며이 튜토리얼의 끝에 제공됩니다. STM32를 프로그래밍하는 데 FTDI 프로그래머가 필요하지 않으며 PC를 STM32의 USB 포트에 연결하고 Arduino IDE로 프로그래밍을 시작하기 만하면됩니다. USB 포트를 통한 STM32 프로그래밍에 대해 자세히 알아보십시오.
이 튜토리얼에서 언급했듯이 0에서 숫자를 증가시켜 16x2 LCD에 표시하고 누름 버튼을 누를 때마다 LED가 켜지고 LCD 디스플레이에 'INTERRUPT'가 표시됩니다.
먼저 STM32와의 LCD 핀 연결을 정의 합니다. 요구 사항에 따라 수정할 수 있습니다.
const int rs = PB10, en = PB11, d4 = PB0, d5 = PB1, d6 = PC13, d7 = PC14;
다음으로 LCD 디스플레이를위한 헤더 파일 을 포함합니다. 이것은 STM32가 LCD와 통신하는 방법에 대한 코드가 포함 된 라이브러리를 호출합니다. 또한 위에서 정의한 핀 이름으로 LiquidCrystal 함수 가 호출 되었는지 확인하십시오.
포함
전역 변수는 ISR과 기본 프로그램간에 데이터를 전달하는 데 사용됩니다. 변수 ledOn 을 휘발성으로 선언하고 True 또는 False를 지정하는 부울로 선언합니다.
휘발성 부울 ledOn = false;
내부 무효 설치 () 함수를, 우리는 인트로 메시지가 표시됩니다 2 초 후 선택을 취소합니다.
lcd.begin (16,2); lcd.print ("CIRCUIT DIGEST"); 지연 (2000); lcd.clear ();
다시 동일한 void setup () 함수에서 입력 및 출력 핀을 지정해야합니다. 출력용 핀 PA1을 LED로 설정하고, 푸시 버튼 입력 용으로 PA0을 설정합니다.
pinMode (PA1, OUTPUT) pinMode (PA0, INPUT)
또한 숫자를 증가시킬 것이므로 값이 0 인 변수를 선언하십시오.
int i = 0;
이제 코드의 중요한 부분은 attachInterrupt () 함수이며 void setup () 내부에도 포함됩니다.
attachInterrupt (digitalPinToInterrupt (PA0), buttonPressed, CHANGE)
외부 인터럽트를위한 핀 PA0 을 지정했고, buttonPressed 는 PA0 핀에 CHANGE (LOW에서 HIGH 또는 HIGH에서 LOW)가있을 때 호출되는 기능입니다. 요구 사항에 따라 다른 기능 이름, 핀 및 모드를 사용할 수도 있습니다.
내부 공간 루프 () 우리는 0부터 번호 (i)를 증가 및 LCD (16 × 2)의 수를 인쇄합니다.
lcd.clear (); lcd.print ("숫자:"); lcd.print (i); ++ i; 지연 (1000);
가장 중요한 부분은 attachInterrupt () 함수 에서 사용한 이름에 따라 인터럽트 핸들러 함수를 만드는 것입니다. buttonPressed를 사용 했으므로 여기서는 void buttonPressed () 함수를 만들었습니다.
void buttonPressed () { if (ledOn) { ledOn = false; digitalWrite (PA1, LOW); } else { ledOn = true; digitalWrite (PA1, HIGH); lcd.setCursor (0,1); lcd.print ("인터럽트"); } }
이 buttonPressed () ISR의 작동:
ledOn 변수 의 값에 따라 LED가 켜지고 꺼집니다.
버튼 상태 |
ledOn (값) |
LED (적색) |
LCD (16x2) |
누르지 않음 |
그릇된 |
떨어져서 |
- |
눌림 |
진실 |
의 위에 |
''INTERRUPT '표시 |
는 IF LEDON의 값이 거짓 후 LED 유물이 꺼져과 경우 LEDON의 값이 true 다음에 회전과에 LCD 디스플레이 쇼 '인터럽트'LED.
참고: 때때로 스위치 디 바운스 효과가있을 수 있으며 푸시 버튼을 눌렀을 때 여러 트리거를 계산할 수 있습니다. 이는 푸시 버튼을 전환하는 기계적 이유 때문에 전압이 여러 번 스파이크되기 때문입니다. 이것은 RC 필터를 도입하여 줄일 수 있습니다.
STM32F103C8 의 완전한 인터럽트 작업은 아래 비디오 에 나와 있습니다.