Mục lục:

Nút STM32CubeMX Debounce With Interrupt: 5 bước
Nút STM32CubeMX Debounce With Interrupt: 5 bước

Video: Nút STM32CubeMX Debounce With Interrupt: 5 bước

Video: Nút STM32CubeMX Debounce With Interrupt: 5 bước
Video: Lập trình STM32 EXTI ngắt ngoài điều khiển Led | STM32 HAL CubeMX 2024, Tháng bảy
Anonim
Nút STM32CubeMX Debounce with Interrupt
Nút STM32CubeMX Debounce with Interrupt

Xin chào, trong hướng dẫn này, tôi sẽ cố gắng đưa ra giải pháp đơn giản của mình để ngăn chặn việc trả lại nút, một vấn đề rất nghiêm trọng. Trên internet có rất nhiều video để cung cấp giải pháp cho vấn đề này, nhưng không phải trong số đó cho gián đoạn bên ngoài. Trong tất cả các video này, nút bấm được kiểm tra bằng phương pháp thăm dò không hiệu quả. Vì vậy, chúng ta hãy bắt đầu!

Bước 1: Yêu cầu phần cứng và phần mềm

Yêu cầu phần cứng:

  • Bảng phát triển ARM STM32
  • Một máy tính

Yêu cầu phần mềm:

  • STM32CubeMX
  • Keil uVision5

Bước 2: Tìm hiểu vấn đề

Hiểu vấn đề
Hiểu vấn đề

Vì vậy, chúng tôi cố gắng tìm giải pháp cho vấn đề nảy nút. Vì vậy, chúng ta phải hiểu rõ vấn đề. Vì vậy, khi chúng ta nhấn một nút, nó sẽ đến một trạng thái trái ngược với trạng thái trước đó của nó. Ví dụ, nếu nó CAO thì nó phải THẤP và nếu nó THẤP thì nó phải CAO. Tuy nhiên, đây là trạng thái lý tưởng (trong PROTEUS:)) Trong thực tế, khi chúng ta nhấn một nút, nó bắt đầu bật lên giữa CAO và THẤP trước khi chuyển sang trạng thái nhàn rỗi. Vì vậy, hãy giả vờ rằng nó đã được nhấn nhiều lần gây ra vấn đề. Vì vậy, những gì chúng ta nên làm gì?

Ở đây tôi muốn lưu ý rằng trong ví dụ này, chúng ta sẽ sử dụng ngắt ngoài để phát hiện thao tác nhấn nút. Vì vậy, sau khi chúng tôi phát hiện nút nhấn, chúng tôi cần đợi một chút thời gian, chẳng hạn như 50mS để đạt trạng thái không tải và kiểm tra lại xem nút có ở trạng thái không hoạt động hay không. Nếu nó ở trạng thái nhàn rỗi thì chúng ta có thể tiếp tục nhiệm vụ của mình. Vì vậy, chúng ta hãy xem mã:)

Bước 3: Cấu hình STM32CubeMX

Cấu hình STM32CubeMX
Cấu hình STM32CubeMX

Vì vậy, trước tiên chúng ta cần kích hoạt ngắt bên ngoài cho nút nhấn của chúng ta (tôi giả sử ở đây rằng bạn sử dụng bảng khám phá STM32F407VG):

  • Trong tab "Sơ đồ và cấu hình", nhấp vào chân PA0 được kết nối với nút nhấn và chọn GPIO_EXTI0 cho phép ngắt bên ngoài trên chân đó.
  • Thay đổi "nhãn người dùng" của ghim thành "Push_Button" hoặc bất kỳ thứ gì bạn muốn.

Sau đó, chúng ta cần định cấu hình bộ đếm thời gian để tạo độ trễ thời gian 50mS:

  • Vào phần "Bộ hẹn giờ"
  • Nhấp vào TIM1
  • Chọn "Đồng hồ nội bộ" làm nguồn Đồng hồ
  • Về cấu hình (Nếu bạn muốn hiểu phần này, vui lòng tham khảo hướng dẫn này, "Điều khiển động cơ Servo với STM32F4 ARM MCU"):

    • Đặt prescaler là 32000
    • Và truy cập khoảng thời gian đến 50
  • Trong tab "Cài đặt NVIC" cho phép tất cả các ngắt

Bật đèn LED làm đầu ra:

Nhấp vào PD12 và đặt là "GPIO_Output"

Sau đó, cấu hình đồng hồ như trong hình trên và tạo mã.

Bước 4: Phát triển phần mềm Keil

Đầu tiên, chúng tôi xác định biến trạng thái sẽ đảm bảo rằng chúng tôi không khởi động bộ đếm thời gian bên trong ngắt bên ngoài khi xảy ra hiện tượng thoát:

/ * MÃ NGƯỜI DÙNG BẮT ĐẦU PFP * / trạng thái bool = true; / * MÃ NGƯỜI DÙNG KẾT THÚC PFP * /

Sau đó, chúng tôi viết ISR cho ngắt bên ngoài:

void HAL_GPIO_EXTI_Callback (uint16_t GPIO_Pin) {if (GPIO_Pin == Push_Button_Pin && state == true) {HAL_TIM_Base_Start_IT (& htim1); trạng thái = sai; } else {_NOP (); }}

Khi nhấn nút, chúng tôi kiểm tra xem đó có phải là nút nhấn đã xác định của chúng tôi hay không và trạng thái có đúng không. Ở đầu trạng thái sẽ là true để nhập câu lệnh if. Sau khi nhập, chúng tôi bắt đầu bộ đếm thời gian và đặt trạng thái sai để đảm bảo rằng việc trả lại sẽ không khởi động lại bộ đếm thời gian.

Sau đó, chúng tôi viết ISR cho ngắt bộ định thời:

void HAL_TIM_PeriodElapsedCallback (TIM_HandleTypeDef * htim) {/ * Ngăn cảnh báo biên dịch (các) đối số không sử dụng * / UNUSED (htim);

/ * LƯU Ý: Không nên sửa đổi chức năng này, khi cần gọi lại, HAL_TIM_PeriodElapsedCallback có thể được triển khai trong tệp người dùng * / if (HAL_GPIO_ReadPin (Push_Button_GPIO_Port, Push_Button_Pin) == GPIO_PIN_RESET) {HAL_GPIO_TogglePin (GPIOD, GPIO_PIN_12); trạng thái = true; HAL_TIM_Base_Stop_IT (& htim1); }}

/ * MÃ NGƯỜI DÙNG KẾT THÚC 4 * /

Sau 50mS, chúng tôi kiểm tra xem nút có ở trạng thái đặt lại hay được thả ra hay không, nếu có thì chúng tôi biết nút đó đang ở trạng thái không hoạt động. Sau đó, chúng tôi chuyển đổi đèn led, đặt trạng thái true để có thể phát hiện một nút bấm và dừng hẹn giờ khác để có thể bắt đầu lại.

Vì vậy, quá trình này sẽ đảm bảo rằng chúng tôi ngăn chặn sự cố bị trả lại.

Bước 5: Kết luận

Đây là mã cho lỗi nút. Tôi muốn lưu ý rằng mã này do tôi phát triển và tôi không phải là một lập trình viên chuyên nghiệp. Vì vậy, chắc chắn có thể có sai sót. Nếu bạn có giải pháp tốt hơn, xin vui lòng lưu ý nó. Đừng quên, nếu bạn gặp bất kỳ vấn đề nào, hãy viết thư cho tôi và tôi sẽ cố gắng giúp đỡ.

Đề xuất: