- ประเภทของการขัดจังหวะและ ISR
- ไวยากรณ์สำหรับการขัดจังหวะใน STM32
- ส่วนประกอบที่จำเป็น
- แผนภาพวงจรและการเชื่อมต่อ
- การเขียนโปรแกรม STM32F103C8 สำหรับการขัดจังหวะ
การขัดจังหวะเป็นกลไกที่ I / O หรือคำสั่งสามารถระงับการทำงานปกติของตัวประมวลผลและได้รับการบริการตัวเองเหมือนมีลำดับความสำคัญสูงสุด เช่นโปรเซสเซอร์ที่ดำเนินการตามปกติยังสามารถตรวจสอบเหตุการณ์บางอย่างหรือการขัดจังหวะที่จะเกิดขึ้นได้อย่างต่อเนื่อง นั่นคือเมื่อเกิดการขัดจังหวะภายนอก (เช่นจากเซ็นเซอร์บางตัว) โปรเซสเซอร์จะหยุดการทำงานตามปกติชั่วคราวและทำหน้าที่ขัดจังหวะก่อนแล้วจึงดำเนินการต่อตามปกติ
ในโครงการนี้เพื่อทำความเข้าใจกับการขัดจังหวะใน STM32F103C8เราจะใช้ปุ่มกดเป็นตัวขัดจังหวะภายนอก ในที่นี้เราจะเพิ่มตัวเลขจาก 0 และแสดงบนจอ LCD 16x2 และเมื่อใดก็ตามที่กดปุ่มกดไฟ led จะเปิดและจอ LCD จะแสดง INTERRUPT LED ดับทันทีที่ปล่อยปุ่ม
ประเภทของการขัดจังหวะและ ISR
การขัดจังหวะสามารถแบ่งออกเป็นสองประเภทอย่างกว้าง ๆ:
การขัดจังหวะของฮาร์ดแวร์: หากสัญญาณไปยังโปรเซสเซอร์มาจากอุปกรณ์ภายนอกบางอย่างเช่นปุ่มหรือเซ็นเซอร์หรือจากอุปกรณ์ฮาร์ดแวร์อื่น ๆ ซึ่งสร้างสัญญาณและบอกให้โปรเซสเซอร์ทำงานเฉพาะที่มีอยู่ใน ISR เรียกว่าการขัดจังหวะของฮาร์ดแวร์
Software Interrupts:การขัดจังหวะที่สร้างขึ้นโดยคำแนะนำของซอฟต์แวร์
ขัดจังหวะบริการประจำ
Interrupt Service Routine หรือตัวจัดการการขัดจังหวะเป็นเหตุการณ์ที่มีชุดคำสั่งเล็ก ๆ อยู่ในนั้นและเมื่อมีการขัดจังหวะเกิดขึ้นโปรเซสเซอร์จะเรียกใช้โค้ดเหล่านี้ที่มีอยู่ใน ISR ก่อนจากนั้นดำเนินการต่อกับงานที่ทำก่อนที่จะขัดจังหวะ
ไวยากรณ์สำหรับการขัดจังหวะใน STM32
ISR มีไวยากรณ์ต่อไปนี้attachInterrupt (digitalPinToInterrupt (พิน), ISR, โหมด)ใน Arduino และสามารถใช้สิ่งเดียวกันใน STM32 ได้ด้วยเนื่องจากเราใช้ arduino IDE เพื่ออัปโหลดโค้ด
- digitalPinToInterrupt (พิน):เช่นเดียวกับในบอร์ด Arduino Uno เรามีพิน 2,3 และใน mega เรามี 2,3,18,19,20,21 สำหรับการขัดจังหวะ ใน STM32F103C8 เรายังมีพินขัดจังหวะพิน GPIO ใด ๆ ที่สามารถใช้สำหรับการขัดจังหวะ เราเพียงระบุพินอินพุตที่เราใช้เพื่อขัดจังหวะ แต่ในขณะที่ใช้การขัดจังหวะมากกว่าหนึ่งรายการในเวลาเดียวกันเราอาจต้องปฏิบัติตามข้อ จำกัด บางประการ
- ISR:เป็นฟังก์ชันตัวจัดการขัดจังหวะที่ถูกเรียกใช้เมื่อเกิดการขัดจังหวะภายนอก ไม่มีอาร์กิวเมนต์และประเภทผลตอบแทนเป็นโมฆะ
- โหมด:ประเภทของการเปลี่ยนแปลงเพื่อเรียกใช้การขัดจังหวะ
- RISING: เพื่อทริกเกอร์อินเทอร์รัปต์เมื่อพินเปลี่ยนจากต่ำไปสูง
- FALLING: เพื่อทริกเกอร์การขัดจังหวะเมื่อพินเปลี่ยนจากสูงไปต่ำ
- CHANGE: เพื่อทริกเกอร์อินเทอร์รัปต์เมื่อพินเปลี่ยนจาก LOW ไป HIGH หรือ HIGH ไป LOW (เช่นเมื่อพินเปลี่ยน)
เงื่อนไขบางอย่างขณะใช้การขัดจังหวะ
- ฟังก์ชัน Interrupt Service Routine (ISR) ต้องสั้นที่สุด
- ฟังก์ชัน Delay () ไม่ทำงานใน ISR และควรหลีกเลี่ยง
ส่วนประกอบที่จำเป็น
- STM32F103C8
- ปุ่มกด
- LED
- ตัวต้านทาน (10K)
- จอแอลซีดี (16x2)
แผนภาพวงจรและการเชื่อมต่อ
ด้านหนึ่งของขาปุ่มกดเชื่อมต่อกับ 3.3V ของ STM32 และอีกด้านหนึ่งเชื่อมต่อกับขาอินพุต (PA0) ของ STM32 ผ่านตัวต้านทานแบบดึงลง
ใช้ตัวต้านทานแบบดึงลงเพื่อให้ไมโครคอนโทรลเลอร์รับเฉพาะ HIGH หรือ LOW ที่อินพุตเมื่อกดหรือปล่อยปุ่ม มิฉะนั้นหากไม่มีตัวต้านทานแบบดึงลง MCU อาจสับสนและป้อนค่าลอยตัวแบบสุ่มให้กับอินพุต
การเชื่อมต่อระหว่าง STM32F103C8 และ LCD
ตารางต่อไปนี้แสดงการเชื่อมต่อพินระหว่าง LCD (16X2) และไมโครคอนโทรลเลอร์ STM32F103C8
STM32F103C8 |
LCD |
GND |
VSS |
+ 5V |
VDD |
ไปยัง PIN ของศูนย์โพเทนชิออมิเตอร์ |
V0 |
PB0 |
อาร์เอส |
GND |
RW |
PB1 |
จ |
PB10 |
D4 |
PB11 |
D5 |
พีซี 13 |
D6 |
พีซี 14 |
D7 |
+ 5V |
ก |
GND |
เค |
การเขียนโปรแกรม STM32F103C8 สำหรับการขัดจังหวะ
โปรแกรมสำหรับบทช่วยสอนนี้เรียบง่ายและมีให้ในตอนท้ายของบทช่วยสอนนี้ เราไม่จำเป็นต้องใช้โปรแกรมเมอร์ FTDI เพื่อตั้งโปรแกรม STM32 เพียงแค่เชื่อมต่อพีซีของคุณเข้ากับพอร์ต USB ของ STM32 และเริ่มเขียนโปรแกรมด้วย Arduino IDE เรียนรู้เพิ่มเติมเกี่ยวกับการเขียนโปรแกรม STM32 ผ่านพอร์ต USB
ดังที่เราได้กล่าวไปแล้วว่าในบทช่วยสอนนี้เราจะเพิ่มตัวเลขจาก 0 และแสดงบนจอ LCD 16x2 และเมื่อใดก็ตามที่กดปุ่มไฟ led จะเปิดขึ้นและจอ LCD จะแสดง 'INTERRUPT'
ขั้นแรกให้ กำหนดการเชื่อมต่อพิน LCDกับ STM32 คุณสามารถปรับเปลี่ยนได้ตามความต้องการของคุณ
const int rs = PB10, th = PB11, d4 = PB0, d5 = PB1, d6 = PC13, d7 = PC14;
ต่อไปเราจะ รวมไฟล์ส่วนหัว สำหรับจอ LCD สิ่งนี้เรียกไลบรารีซึ่งมีรหัสสำหรับวิธีที่ STM32 ควรสื่อสารกับ LCD ตรวจสอบให้แน่ใจว่าฟังก์ชัน LiquidCrystal ถูกเรียกด้วยชื่อพินที่เราเพิ่งกำหนดไว้ข้างต้น
รวม
ตัวแปรส่วนกลางใช้เพื่อส่งผ่านข้อมูลระหว่าง ISR และโปรแกรมหลัก เราประกาศตัวแปร ledOn ว่าระเหยและเป็นบูลีนเพื่อระบุ True หรือ False
บูลีนระเหย ledOn = false;
ภายในฟังก์ชัน void setup () เราจะแสดงข้อความแนะนำและล้างข้อมูลหลังจากผ่านไป 2 วินาที
lcd.begin (16,2); lcd.print ("CIRCUIT DIGEST"); ล่าช้า (2000); lcd.clear ();
อีกครั้งในฟังก์ชัน void setup () เดียวกันเราจำเป็นต้องระบุพินอินพุตและเอาต์พุต เราตั้งค่าพิน PA1 สำหรับเอาต์พุตเป็น LED และ PA0 สำหรับอินพุตจากปุ่มกด
pinMode (PA1, เอาต์พุต) pinMode (PA0, อินพุต)
เราจะเพิ่มตัวเลขด้วยดังนั้นให้ประกาศตัวแปรที่มีค่าเป็นศูนย์
int ผม = 0;
ตอนนี้ส่วนที่สำคัญของรหัสคือ ฟังก์ชัน attachInterrupt () ซึ่งจะรวมอยู่ในการ ตั้งค่าโมฆะ ()
attachInterrupt (digitalPinToInterrupt (PA0), buttonPressed, CHANGE)
เราระบุพิน PA0 สำหรับการขัดจังหวะภายนอกและ ปุ่มกด คือฟังก์ชันที่จะเรียกใช้เมื่อมีการเปลี่ยน (LOW to HIGH หรือ HIGH to LOW) ใน PA0 พิน คุณยังสามารถใช้ชื่อฟังก์ชันพินและโหมดอื่น ๆ ตามความต้องการ
ภายใน void loop () เราจะเพิ่มตัวเลข (i) จากศูนย์และพิมพ์ตัวเลขใน LCD (16x2)
lcd.clear (); lcd.print ("NUMBER:"); lcd.print (ผม); ++ ผม; ล่าช้า (1,000);
ส่วนที่สำคัญที่สุดคือการสร้างตัวจัดการการขัดจังหวะการทำงานตามชื่อที่เราใช้ในการ attachInterrupt () ฟังก์ชั่น เราใช้ buttonPressed ดังนั้นที่นี่เราจึงได้สร้าง function void buttonPressed ()
เป็นโมฆะ buttonPressed () { if (ledOn) { ledOn = false; digitalWrite (PA1, LOW); } else { ledOn = true; digitalWrite (PA1, สูง); lcd.setCursor (0,1); lcd.print ("ขัดจังหวะ"); } }
การทำงานของ ปุ่ม นี้ กด () ISR:
ตามค่าของตัวแปร ledOn ไฟ LED จะเปิดและปิด
ปุ่มสถานะ |
ledOn (ค่า) |
LED (สีแดง) |
จอแอลซีดี (16x2) |
ไม่ได้ส่ง |
เท็จ |
ปิด |
- |
กด |
จริง |
บน |
รายการ '' INTERRUPT ' |
หากค่า ledOn เป็นเท็จแสดงว่า LED จะยังคงปิดอยู่และหากค่า ledOn เป็นจริง LED จะเปิดขึ้นและจอ LCD จะแสดงคำว่า 'ขัดจังหวะ'
หมายเหตุ:อาจมีเอฟเฟกต์ debounce ของสวิตช์ในบางครั้งและอาจนับทริกเกอร์หลายตัวเมื่อกดปุ่มกดเนื่องจากแรงดันไฟฟ้าเพิ่มขึ้นหลายจุดเนื่องจากเหตุผลเชิงกลของการสลับปุ่มกด ซึ่งสามารถลดได้โดยการแนะนำตัวกรอง RC
การทำงานที่สมบูรณ์ ของการขัดจังหวะใน STM32F103C8 แสดงอยู่ใน วิดีโอด้านล่าง