วิธีใช้ ADC interrupt บนเม็ดสีฟ้า STM32
ฉันกำลังใช้บอร์ด STM32F1xx จาก http://dan.drown.org/stm32duino/package_STM32duino_index.jsonเพื่อตั้งโปรแกรมเม็ดสีฟ้าของฉัน แต่ฉันไม่พบวิธีเขียนอินเทอร์รัปต์สำหรับ ADC ฉันได้ตั้งค่าให้รีจิสเตอร์ส่งออกการขัดจังหวะเมื่อเสร็จสิ้น แต่ฉันไม่พบวิธีเขียนโค้ดสำหรับการขัดจังหวะ
ฉันได้ลองใช้ฟังก์ชัน "ISR (ADC_vect)" ซึ่งใช้ได้กับ arduino แต่คอมไพเลอร์บ่นว่าไม่รู้จัก "ISR" ฉันพยายามค้นหาเอกสารสำหรับ STM32duino แต่สิ่งเล็กน้อยที่ฉันพบไม่ได้พูดถึง ADC หรือกิจวัตรการขัดจังหวะใด ๆ ฉันค้นหาผ่านฟอรัม STM32duino โดยไม่มีโชค หากใครรู้วิธีแก้ปัญหานี้หรือจะหาข้อมูลเกี่ยวกับรหัสขัดจังหวะสำหรับบอร์ด STM32 ได้ที่ไหนฉันจะดีใจมาก :)
คำตอบ
ในขณะที่คุณพบแล้วฟังก์ชั่นเพื่อแทนที่ถูก__irq_adc()กำหนดไว้อย่างอ่อนที่นี่และผูกไว้กับตารางเวกเตอร์ขัดจังหวะที่นี่
หากคุณกำหนดไว้แล้ว แต่มันใช้งานไม่ได้อาจเป็นเพราะคุณได้กำจัดการattachInterrupt()โทรทั้งหมดซึ่งทำมากกว่าแค่กำหนดตัวจัดการขัดจังหวะ นอกจากนี้ยังเปิดใช้งานการขัดจังหวะสำหรับ ADC นั้น ดังนั้น:
myADC.calibrate();
myADC.setSampleRate(ADC_SMPR_1_5);
adc_enable_irq(ADC1, ADC_EOC);
myADC.setPins(&pin, 1);
extern "C" void __irq_adc() {
// handle the interrupt
// make sure to check statuses and clear flags as shown in the default handler
}
ไม่แน่ใจว่าextern "C"จะจำเป็นหรือไม่คุณจะต้องตรวจสอบและค้นหา
ฉันไม่พบฟังก์ชันที่ถูกเรียกโดยตรง แต่มีตัวอย่างที่ดีที่อธิบายวิธีแนบอินเทอร์รัปต์กับ ADC ซึ่งทำงานได้ดี: https://github.com/rogerclarkmelbourne/Arduino_STM32/blob/master/STM32F1/libraries/STM32ADC/examples/SingleConversionInterrupt/SingleConversionInterrupt.ino
หากใครทราบฟังก์ชันจริงที่ถูกเรียกโดยตรงซึ่งจะเป็นการดีที่จะเพิ่มที่นี่ แต่จนกว่าจะถึงเวลานั้นตัวอย่างนี้ก็ทำในสิ่งที่ฉันต้องการและหวังว่าจะช่วยผู้อื่นที่มีปัญหาเดียวกัน
ก่อนอื่นคุณต้องเปิดใช้งานการขัดจังหวะ (ฉันไม่รู้ว่า stm32 wrapper สำหรับ arduino ทำหรือไม่):
NVIC_EnableIRQ(ADC1_IRQn);
จากนั้นคุณต้องเขียน ISR ตามที่ Gerben กล่าวว่า:
extern "C" void ADC1_IRQHandler()
{
//clear ADC flag
}
extern "C" เพราะ [เท่าที่ฉันรู้] โครงการ arduino เป็น C ++