วิธีใช้ ADC interrupt บนเม็ดสีฟ้า STM32

Sep 29 2020

ฉันกำลังใช้บอร์ด STM32F1xx จาก http://dan.drown.org/stm32duino/package_STM32duino_index.jsonเพื่อตั้งโปรแกรมเม็ดสีฟ้าของฉัน แต่ฉันไม่พบวิธีเขียนอินเทอร์รัปต์สำหรับ ADC ฉันได้ตั้งค่าให้รีจิสเตอร์ส่งออกการขัดจังหวะเมื่อเสร็จสิ้น แต่ฉันไม่พบวิธีเขียนโค้ดสำหรับการขัดจังหวะ

ฉันได้ลองใช้ฟังก์ชัน "ISR (ADC_vect)" ซึ่งใช้ได้กับ arduino แต่คอมไพเลอร์บ่นว่าไม่รู้จัก "ISR" ฉันพยายามค้นหาเอกสารสำหรับ STM32duino แต่สิ่งเล็กน้อยที่ฉันพบไม่ได้พูดถึง ADC หรือกิจวัตรการขัดจังหวะใด ๆ ฉันค้นหาผ่านฟอรัม STM32duino โดยไม่มีโชค หากใครรู้วิธีแก้ปัญหานี้หรือจะหาข้อมูลเกี่ยวกับรหัสขัดจังหวะสำหรับบอร์ด STM32 ได้ที่ไหนฉันจะดีใจมาก :)

คำตอบ

1 SoreDakeNoKoto Oct 03 2020 at 08:45

ในขณะที่คุณพบแล้วฟังก์ชั่นเพื่อแทนที่ถูก__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"จะจำเป็นหรือไม่คุณจะต้องตรวจสอบและค้นหา

1 BeaconofWierd Sep 30 2020 at 16:59

ฉันไม่พบฟังก์ชันที่ถูกเรียกโดยตรง แต่มีตัวอย่างที่ดีที่อธิบายวิธีแนบอินเทอร์รัปต์กับ ADC ซึ่งทำงานได้ดี: https://github.com/rogerclarkmelbourne/Arduino_STM32/blob/master/STM32F1/libraries/STM32ADC/examples/SingleConversionInterrupt/SingleConversionInterrupt.ino

หากใครทราบฟังก์ชันจริงที่ถูกเรียกโดยตรงซึ่งจะเป็นการดีที่จะเพิ่มที่นี่ แต่จนกว่าจะถึงเวลานั้นตัวอย่างนี้ก็ทำในสิ่งที่ฉันต้องการและหวังว่าจะช่วยผู้อื่นที่มีปัญหาเดียวกัน

TirdadSadriNejad Sep 30 2020 at 04:09

ก่อนอื่นคุณต้องเปิดใช้งานการขัดจังหวะ (ฉันไม่รู้ว่า stm32 wrapper สำหรับ arduino ทำหรือไม่):

NVIC_EnableIRQ(ADC1_IRQn);

จากนั้นคุณต้องเขียน ISR ตามที่ Gerben กล่าวว่า:

extern "C" void ADC1_IRQHandler()
{
    //clear ADC flag
}

extern "C" เพราะ [เท่าที่ฉันรู้] โครงการ arduino เป็น C ++