Სარჩევი:

STM32CubeMX ღილაკი დებიუნით შეწყვეტით: 5 ნაბიჯი
STM32CubeMX ღილაკი დებიუნით შეწყვეტით: 5 ნაბიჯი

ვიდეო: STM32CubeMX ღილაკი დებიუნით შეწყვეტით: 5 ნაბიჯი

ვიდეო: STM32CubeMX ღილაკი დებიუნით შეწყვეტით: 5 ნაბიჯი
ვიდეო: STM32 Blue Pill-ის დაპროგრამება LDmicro PLC Ladder Logic-ით 2024, დეკემბერი
Anonim
STM32CubeMX ღილაკი Debounce With Interrupt
STM32CubeMX ღილაკი Debounce With Interrupt

გამარჯობა, ამ გაკვეთილზე მე შევეცდები მოგცეთ მარტივი გამოსავალი, რათა თავიდან ავიცილოთ ღილაკების გადახტომა, რაც ძალიან სერიოზული საკითხია. ინტერნეტში არის ბევრი ვიდეო, რომელიც გთავაზობთ ამ საკითხის გადაწყვეტას, მაგრამ არცერთი მათგანი გარე შეფერხებისთვის. ყველა ამ ვიდეოში ღილაკის დაჭერა შემოწმებულია გამოკითხვის მეთოდით, რომელიც არაეფექტურია. მაშ, დავიწყოთ!

ნაბიჯი 1: აპარატურისა და პროგრამული უზრუნველყოფის მოთხოვნები

ტექნიკის მოთხოვნები:

  • STM32 ARM განვითარების დაფა
  • კომპიუტერი

პროგრამული უზრუნველყოფის მოთხოვნები:

  • STM32CubeMX
  • კეილი uVision 5

ნაბიჯი 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; / * USER CODE END 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 (); }}

ღილაკზე დაჭერისას ჩვენ ვამოწმებთ იყო თუ არა ეს ჩვენი განსაზღვრული ღილაკი და არის თუ არა მდგომარეობა სიმართლე. დასაწყისში სახელმწიფო იქნება ჭეშმარიტი, რათა შეიტანოს if განცხადება. შესვლის შემდეგ ჩვენ ვიწყებთ ტაიმერს და ვაქცევთ მდგომარეობას ყალბი, რათა დავრწმუნდეთ, რომ ხტომა არ განაახლებს ტაიმერს.

შემდეგ, ჩვენ ვწერთ ISR ტაიმერის შეწყვეტისთვის:

ბათილია HAL_TIM_PeriodElapsedCallback (TIM_HandleTypeDef *htim) { / *გამოვიყენოთ გამოუყენებელი არგუმენტები (ები) შედგენის გაფრთხილება * / UNUSED (htim);

/* შენიშვნა: ეს ფუნქცია არ უნდა შეიცვალოს, როდესაც საჭიროა გამოძახება, HAL_TIM_PeriodElapsedCallback შეიძლება განხორციელდეს მომხმარებლის ფაილში */ თუ (HAL_GPIO_ReadPin (Push_Button_GPIO_Port, Push_Button_Pin) == GPIO_PIN_RESET) {HAL_GPIO_TogglePin (GPIOD, GPI12); მდგომარეობა = ჭეშმარიტი; HAL_TIM_Base_Stop_IT (& htim1); }}

/ * მომხმარებლის კოდი ბოლოს 4 */

50mS- ის შემდეგ ჩვენ ვამოწმებთ, არის თუ არა ღილაკი გადატვირთვის მდგომარეობაში ან გათავისუფლებულია, თუ კი, მაშინ ჩვენ ვიცით, რომ ღილაკი უმოქმედო მდგომარეობაშია. შემდეგ ჩვენ ვრთავთ led- ს, ვაქცევთ მდგომარეობას ჭეშმარიტებად, რათა შევძლოთ სხვა ღილაკის დაჭერა და ტაიმერის გაჩერება, რათა შევძლოთ მისი ხელახლა დაწყება.

ამრიგად, ეს პროცესი უზრუნველყოფს, რომ ჩვენ თავიდან ავიცილოთ ხვრინვის საკითხი.

ნაბიჯი 5: დასკვნა

ეს იყო კოდი ღილაკზე დენონსირებისთვის. მინდა აღვნიშნო, რომ ეს კოდი შემუშავებულია ჩემ მიერ და მე არ ვარ ექსპერტი პროგრამისტი. ასე რომ, რა თქმა უნდა შეიძლება იყოს შეცდომები. თუ უკეთესი გამოსავალი გაქვთ გთხოვთ გაითვალისწინოთ. ნუ დაგავიწყდებათ, თუ რაიმე პრობლემა შეგექმნებათ მომწერეთ და მე შევეცდები დაგეხმაროთ.

გირჩევთ: