สารบัญ:

ปุ่ม STM32CubeMX เด้งด้วยการขัดจังหวะ: 5 ขั้นตอน
ปุ่ม STM32CubeMX เด้งด้วยการขัดจังหวะ: 5 ขั้นตอน

วีดีโอ: ปุ่ม STM32CubeMX เด้งด้วยการขัดจังหวะ: 5 ขั้นตอน

วีดีโอ: ปุ่ม STM32CubeMX เด้งด้วยการขัดจังหวะ: 5 ขั้นตอน
วีดีโอ: STM32F4 with STM32CubeIDE สอน Push Button 2024, พฤศจิกายน
Anonim
ปุ่ม STM32CubeMX Debounce ด้วย Interrupt
ปุ่ม STM32CubeMX Debounce ด้วย Interrupt

สวัสดี ในบทช่วยสอนนี้ ฉันจะพยายามให้วิธีแก้ปัญหาง่ายๆ ในการป้องกันการตีกลับของปุ่มซึ่งเป็นปัญหาที่ร้ายแรงมาก บนอินเทอร์เน็ตมีวิดีโอมากมายที่จะนำเสนอวิธีแก้ปัญหานี้ แต่ไม่มีวิดีโอสำหรับการขัดจังหวะจากภายนอก ในการกดปุ่มวิดีโอเหล่านี้ทั้งหมดจะถูกตรวจสอบโดยวิธีการโพลซึ่งไม่มีประสิทธิภาพ เริ่มกันเลย!

ขั้นตอนที่ 1: ข้อกำหนดด้านฮาร์ดแวร์และซอฟต์แวร์

ข้อกำหนดด้านฮาร์ดแวร์:

  • บอร์ดพัฒนา STM32 ARM
  • คอมพิวเตอร์

ข้อกำหนดของซอฟต์แวร์:

  • STM32CubeMX
  • Keil uVision5

ขั้นตอนที่ 2: ทำความเข้าใจปัญหา

เข้าใจปัญหา
เข้าใจปัญหา

เราจึงพยายามหาวิธีแก้ไขปัญหาปุ่มเด้ง เราจึงต้องเข้าใจปัญหา ดังนั้นเมื่อเรากดปุ่ม มันควรจะเป็นสถานะที่ตรงกันข้ามกับสถานะก่อนหน้า ตัวอย่างเช่น ถ้าสูงก็ต้องต่ำ และถ้าต่ำก็ต้องสูง อย่างไรก็ตาม นี่เป็นสภาวะในอุดมคติ (ใน PROTEUS:)) ในความเป็นจริง เมื่อเรากดปุ่ม มันจะเริ่มเด้งระหว่าง HIGH และ LOW ก่อนที่จะเข้าสู่สภาวะว่าง เลยแสร้งทำเป็นว่าถูกกดหลายครั้งทำให้เกิดปัญหา แล้วเราควรทำอย่างไร?

ที่นี่ฉันต้องการทราบว่าในตัวอย่างนี้ เราจะใช้การขัดจังหวะภายนอกเพื่อตรวจจับการกดปุ่ม ดังนั้น หลังจากที่เราตรวจพบการกดปุ่ม เราต้องรอสักครู่ เช่น 50mS เพื่อเข้าสู่สถานะว่างและตรวจสอบอีกครั้งว่าปุ่มอยู่ในสถานะไม่ได้ใช้งานหรือไม่ หากอยู่ในสถานะว่าง เราก็สามารถทำงานต่อไปได้ มาดูโค้ดกันเลย:)

ขั้นตอนที่ 3: การกำหนดค่า STM32CubeMX

การกำหนดค่า STM32CubeMX
การกำหนดค่า STM32CubeMX

ดังนั้น เราต้องเปิดใช้งานการขัดจังหวะภายนอกสำหรับปุ่มกดของเราก่อน (ฉันคิดว่าคุณใช้บอร์ดค้นพบ STM32F407VG):

  • ในแท็บ "Pinout & Configuration" ให้คลิกที่พิน PA0 ซึ่งเชื่อมต่อกับปุ่มกดและเลือก GPIO_EXTI0 ซึ่งเปิดใช้งานการขัดจังหวะภายนอกบนพินนั้น
  • เปลี่ยน "ป้ายกำกับผู้ใช้" ของพินเป็น "Push_Button" หรืออะไรก็ได้ที่คุณต้องการ

จากนั้น เราต้องกำหนดค่าตัวจับเวลาเพื่อสร้างการหน่วงเวลา 50mS:

  • เข้าสู่ส่วน "ตัวจับเวลา"
  • คลิกที่ TIM1
  • เลือก "นาฬิกาภายใน" เป็นแหล่งสัญญาณนาฬิกา
  • ในการกำหนดค่า (ถ้าคุณต้องการเข้าใจส่วนนี้ โปรดดูบทช่วยสอนนี้ ขอแนะนำ "การควบคุมเซอร์โวมอเตอร์ด้วย STM32F4 ARM MCU"):

    • ตั้งค่าพรีสเกลเลอร์เป็น 32000
    • และนับระยะเวลาเป็น 50
  • ในแท็บ "การตั้งค่า NVIC" เปิดใช้งานการขัดจังหวะทั้งหมด

เปิดใช้งาน LED เป็นเอาต์พุต:

คลิกที่ PD12 และตั้งค่าเป็น "GPIO_Output"

จากนั้นกำหนดค่านาฬิกาตามภาพด้านบนและสร้างรหัส

ขั้นตอนที่ 4: การพัฒนาซอฟต์แวร์ Keil

ขั้นแรก เรากำหนดตัวแปรสถานะซึ่งจะทำให้มั่นใจว่าเราจะไม่เริ่มจับเวลาภายในอินเตอร์รัปต์ภายนอกเมื่อมีการตีกลับ:

/* USER CODE BEGIN PFP */bool state = true; /* รหัสผู้ใช้สิ้นสุด PFP */

จากนั้น เราเขียน ISR สำหรับการขัดจังหวะภายนอก:

เป็นโมฆะ HAL_GPIO_EXTI_Callback (uint16_t GPIO_Pin){ if(GPIO_Pin == Push_Button_Pin && state == true){ HAL_TIM_Base_Start_IT(&htim1); รัฐ = เท็จ; } อื่น{ _NOP(); } }

เมื่อกดปุ่ม เราจะตรวจสอบว่าเป็นปุ่มกดที่เรากำหนดไว้หรือไม่ และสถานะเป็นจริงหรือไม่ เมื่อเริ่มต้น state จะเป็น true เพื่อป้อนคำสั่ง if หลังจากป้อนแล้ว เราจะเริ่มจับเวลาและทำให้สถานะเป็นเท็จเพื่อให้แน่ใจว่าการตีกลับจะไม่เริ่มตัวจับเวลาใหม่

จากนั้น เราเขียน ISR สำหรับตัวจับเวลาขัดจังหวะ:

เป็นโมฆะ HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim){ /* ป้องกันคำเตือนการรวบรวมอาร์กิวเมนต์ที่ไม่ได้ใช้ */ UNUSED(htim);

/* หมายเหตุ: ฟังก์ชันนี้ไม่ควรแก้ไข เมื่อต้องการโทรกลับ

HAL_TIM_PeriodElapsedCallback สามารถนำมาใช้ในไฟล์ผู้ใช้ */ if(HAL_GPIO_ReadPin(Push_Button_GPIO_Port, Push_Button_Pin) == GPIO_PIN_RESET){ HAL_GPIO_TogglePin(GPIOD, GPIO_PIN_12); รัฐ = จริง; HAL_TIM_Base_Stop_IT(&htim1); } }

/* รหัสผู้ใช้ สิ้นสุด 4 */

หลังจาก 50mS เราจะตรวจสอบว่าปุ่มอยู่ในสถานะรีเซ็ตหรือปล่อยหรือไม่ ถ้าใช่ เราจะรู้ว่าปุ่มนั้นอยู่ในสถานะไม่ได้ใช้งาน จากนั้นเราสลับไฟ LED ทำให้สถานะเป็นจริงเพื่อให้สามารถตรวจจับการกดปุ่มอื่นและหยุดตัวจับเวลาเพื่อให้สามารถเริ่มต้นได้อีกครั้ง

ดังนั้น กระบวนการนี้จะช่วยให้แน่ใจว่าเราจะป้องกันปัญหาการตีกลับ

ขั้นตอนที่ 5: บทสรุป

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

แนะนำ: