Բովանդակություն:

STM32CubeMX կոճակը անջատում ընդհատումով. 5 քայլ
STM32CubeMX կոճակը անջատում ընդհատումով. 5 քայլ

Video: STM32CubeMX կոճակը անջատում ընդհատումով. 5 քայլ

Video: STM32CubeMX կոճակը անջատում ընդհատումով. 5 քայլ
Video: STM32 Blue Pill-ի ծրագրավորում LDmicro PLC Ladder Logic-ով 2024, Նոյեմբեր
Anonim
STM32CubeMX կոճակը անջատում ընդհատումով
STM32CubeMX կոճակը անջատում ընդհատումով

Բարև, այս ձեռնարկում ես կփորձեմ տալ իմ պարզ լուծումը `կոճակի ցատկումը կանխելու համար, ինչը շատ լուրջ խնդիր է: Ինտերնետում կան բազմաթիվ տեսանյութեր, որոնք առաջարկում են այս հարցի լուծումը, բայց դրանցից ոչ մեկը արտաքին ընդհատումների համար: Այս բոլոր տեսանյութերում կոճակը սեղմելը ստուգվում է հարցման եղանակով, որն անարդյունավետ է: Այսպիսով, եկեք սկսենք:

Քայլ 1: Սարքավորման և ծրագրային ապահովման պահանջներ

Սարքավորման պահանջներ.

  • STM32 ARM զարգացման տախտակ
  • Համակարգիչ

Softwareրագրային ապահովման պահանջներ.

  • STM32CubeMX
  • Keil uVision5

Քայլ 2: Հասկանալով խնդիրը

Խնդիրը հասկանալը
Խնդիրը հասկանալը

Այսպիսով, մենք փորձում ենք լուծում գտնել կոճակով ցատկելու խնդրին: Հետևաբար, մենք պետք է հասկանանք հարցը: Այսպիսով, երբ մենք սեղմում ենք կոճակը, այն պետք է գա մի վիճակի, որը հակառակ է իր նախկին վիճակին: Օրինակ, եթե այն եղել է ԲԱՐՁՐ, ապա այն պետք է լինի OWԱOWՐ, իսկ եթե OWԱOWՐ է, ապա պետք է լինի ԲԱՐՁՐ: Այնուամենայնիվ, սա իդեալական վիճակ է (PROTEUS- ում:)) Իրականում, երբ մենք սեղմում ենք մի կոճակ, այն սկսում է ցատկել HIGH- ի և LOW- ի միջև ՝ նախքան անգործուն վիճակի գալը: Այսպիսով, ձևացնում է, թե այն մի քանի անգամ սեղմվել է, ինչը խնդիրներ է առաջացնում: Այսպիսով, ինչ պետք է անենք:

Այստեղ ես ուզում եմ նշել, որ այս օրինակում մենք կօգտագործենք արտաքին ընդհատում `կոճակի սեղմումը հայտնաբերելու համար: Այսպիսով, կոճակի սեղմումը հայտնաբերելուց հետո մենք պետք է սպասենք մի փոքր ժամանակ, ինչպես 50 մՍ -ը, որպեսզի հասնենք պարապ վիճակի և նորից ստուգենք `կոճակը անգործուն վիճակում է, թե ոչ: Եթե այն անգործուն վիճակում է, ապա մենք կարող ենք շարունակել մեր խնդիրը: Այսպիսով, եկեք տեսնենք ծածկագիրը:)

Քայլ 3: STM32CubeMX կազմաձևում

STM32CubeMX կազմաձևում
STM32CubeMX կազմաձևում

Այսպիսով, մենք պետք է նախ միացնենք արտաքին ընդհատումը մեր կոճակի համար (այստեղ ենթադրում եմ, որ դուք օգտագործում եք STM32F407VG հայտնագործման տախտակը).

  • «Pinout & Configuration» ներդիրում սեղմեք սեղմիչ կոճակին միացված PA0 պին և ընտրեք GPIO_EXTI0, որը հնարավորություն է տալիս արտաքին ընդհատում կատարել այդ քորոցում:
  • Փնջի «օգտվողի պիտակը» փոխեք «Push_Button» կամ ձեր ուզածի:

Այնուհետև, մենք պետք է կազմաձևենք ժմչփը `50mS ժամանակային հետաձգում ստեղծելու համար.

  • Մուտքագրեք «ersամաչափեր» բաժինը
  • Կտտացրեք TIM1- ին
  • Որպես ժամացույցի աղբյուր ընտրեք «Ներքին ժամացույց»
  • Կազմաձևով (Եթե ցանկանում եք հասկանալ այս բաժինը, դիմեք այս ձեռնարկին, որը շատ խորհուրդ է տրվում "Servo Motor Control With 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); վիճակ = կեղծ; } else {_NOP (); }}

Երբ կոճակը սեղմվում է, մենք ստուգում ենք, արդյոք դա մեր սահմանված կոճակն էր և արդյոք վիճակը ճիշտ է: Սկզբում վիճակը ճիշտ կլինի, եթե if հայտարարությունը մուտքագրվի: Մտնելուց հետո մենք սկսում ենք ժմչփը և վիճակը կեղծ ենք դարձնում `համոզվելու համար, որ վերադարձը չի վերսկսի ժամաչափը:

Այնուհետեւ, մենք գրում ենք ISR ժամանակաչափի ընդհատման համար.

անվավեր HAL_TIM_PeriodElapsedCallback (TIM_HandleTypeDef *htim) { / *Կանխել չօգտագործված փաստարկների (ներ) կազմման նախազգուշացումը * / Չօգտագործված (htim);

/* Ո NOTՇԱԴՐՈԹՅՈՆ. Այս գործառույթը չպետք է փոփոխվի, երբ անհրաժեշտ է հետադարձ կապ, 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); }}

/ * ՕԳՏԱԳՈՐԻՉԻ ՎԵՐ END 4 *//

50mS- ից հետո մենք ստուգում ենք, արդյոք կոճակը դեռ վերականգնված վիճակում է, թե ազատված է, եթե այո, ապա մենք գիտենք, որ այդ կոճակը անգործուն վիճակում է: Այնուհետև մենք միացնում ենք լուսարձակը, դարձնում վիճակը ճշմարիտ, որպեսզի կարողանանք այլ կոճակ սեղմել և դադարեցնել ժամաչափը, որպեսզի կարողանանք նորից սկսել:

Այսպիսով, այս գործընթացը կապահովի, որ մենք կանխենք ցատկման հարցը:

Քայլ 5: Եզրակացություն

Սա կոճակի հեռացման կոդն էր: Ուզում եմ նշել, որ այս ծածկագիրը մշակվել է իմ կողմից, և ես փորձագետ ծրագրավորող չեմ: Այսպիսով, անշուշտ, կարող են լինել սխալներ: Եթե ունեք ավելի լավ լուծում, նշեք այն: Մի մոռացեք, եթե որևէ խնդրի հանդիպեք, գրեք ինձ, և ես կփորձեմ օգնել:

Խորհուրդ ենք տալիս: