Мазмұны:

STM32CubeMX түймесі үзіліспен жойылады: 5 қадам
STM32CubeMX түймесі үзіліспен жойылады: 5 қадам

Бейне: STM32CubeMX түймесі үзіліспен жойылады: 5 қадам

Бейне: STM32CubeMX түймесі үзіліспен жойылады: 5 қадам
Бейне: Программирование STM32 Blue Pill с помощью релейной логики ПЛК LDmicro 2024, Желтоқсан
Anonim
STM32CubeMX түймесі үзіліспен жойылады
STM32CubeMX түймесі үзіліспен жойылады

Сәлеметсіз бе, бұл оқулықта мен түймені басудың алдын алу үшін қарапайым шешімді беруге тырысамын, бұл өте маңызды мәселе. Интернетте бұл мәселені шешуге арналған көптеген бейнелер бар, бірақ олардың ешқайсысы сыртқы үзіліс үшін емес. Бұл бейнелердің барлығында түймені басу тиімсіз сауалнама әдісімен тексеріледі. Сонымен, бастайық!

1 -қадам: Жабдық пен бағдарламалық қамтамасыз етуге қойылатын талаптар

Аппараттық құралдарға қойылатын талаптар:

  • STM32 ARM дамыту тақтасы
  • Компьютер

Бағдарламалық қамтамасыз етуге қойылатын талаптар:

  • STM32CubeMX
  • Keil uVision5

2 -қадам: Мәселені түсіну

Мәселені түсіну
Мәселені түсіну

Сонымен, біз түймені басу мәселесін шешуге тырысамыз. Сондықтан біз мәселені түсінуіміз керек. Сонымен, біз түймені басқанда, ол алдыңғы күйіне қарама -қарсы күйге келуі керек. Мысалы, егер ол жоғары болса, ол төмен болуы керек, ал егер ол төмен болса, онда ол жоғары болуы керек. Дегенмен, бұл идеалды күй (PROTEUS -та:)) Шындығында, біз түймені басқанда, ол бос күйге келместен бұрын ЖОҒАРЫ мен ТӨМЕН арасында ауыса бастайды. Мәселен, ол бірнеше рет басылғанын көрсетеді, бұл қиындық туғызады. Сонымен, біз не істеуіміз керек?

Бұл жерде біз түймені басуды анықтау үшін сыртқы үзіліс қолданатынымызды атап өткім келеді. Сонымен, түймені басуды анықтағаннан кейін, бос күйге жету үшін 50 мС сияқты біраз уақыт күту керек және түйменің бос күйде екенін тексеріңіз. Егер ол бос күйінде болса, онда біз өз жұмысымызды жалғастыра аламыз. Сонымен, кодты көрейік:)

3 -қадам: STM32CubeMX конфигурациясы

STM32CubeMX конфигурациясы
STM32CubeMX конфигурациясы

Сонымен, біз алдымен басу түймесі үшін сыртқы үзілісті қосуымыз керек (менің ойымша, сіз STM32F407VG табу тақтасын қолданасыз деп ойлаймын):

  • «Қыстыру және конфигурация» қойындысында басу түймесіне қосылған PA0 түйреуішін нұқыңыз және сол түйреуішке сыртқы үзіліс беретін GPIO_EXTI0 таңдаңыз.
  • PIN кодының «пайдаланушы белгісін» «Push_Button» немесе өзіңіз қалаған нәрсеге өзгертіңіз.

Содан кейін, 50mS уақыт кідірісін жасау үшін таймерді конфигурациялау қажет:

  • «Таймерлер» бөліміне кіріңіз
  • TIM1 түймесін басыңыз
  • Сағат көзі ретінде «Ішкі сағатты» таңдаңыз
  • Конфигурацияда (егер сіз бұл бөлімді түсінгіңіз келсе, жоғарыда ұсынылған «STM32F4 ARM MCU сервистік қозғалтқышты басқару» оқулығын қараңыз):

    • Алдын ала есептегішті 32000 етіп орнатыңыз
    • Және қарсы кезең 50 -ге дейін
  • «NVIC параметрлері» қойындысында барлық үзілістерді қосыңыз

Жарықдиодты шығыс ретінде қосыңыз:

PD12 түймесін басыңыз және «GPIO_Output» ретінде орнатыңыз

Содан кейін сағатты жоғарыдағы суреттегідей конфигурациялаңыз және кодты жасаңыз.

4 -қадам: Keil бағдарламалық жасақтамасын жасау

Біріншіден, біз айнымалы мәнді анықтаймыз, ол секіру кезінде сыртқы үзілісте таймерді қоспаймыз:

/ * USER CODE BEGIN PFP */bool state = true; / * ПАЙДАЛАНУШЫ КОДЫ ПФФТЫ АЯҚТАУ */

Содан кейін біз сыртқы үзіліс үшін 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 жазамыз:

void 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_) күй = шын; HAL_TIM_Base_Stop_IT (& htim1); }}

/ * ПАЙДАЛАНУШЫЛАР КОДЫ 4 ЖОҚ *

50mS -тен кейін біз түйменің қалпына келтіру күйінде немесе босатылғанын тексереміз, егер иә болса, онда біз бұл түйменің бос күйінде екенін білеміз. Содан кейін біз светодиорды ауыстырып қосамыз, күйді шындыққа айналдырамыз, оны басқа түймені басуды анықтау үшін және оны қайта іске қосу үшін таймерді тоқтатамыз.

Осылайша, бұл процесс бізді айналып өтудің алдын алуға кепілдік береді.

5 -қадам: Қорытынды

Бұл түймені басу коды болды. Айта кеткім келеді, бұл кодты мен әзірледім және мен білікті бағдарламашы емеспін. Сондықтан қателіктер болуы мүмкін. Егер сізде жақсы шешім болса, оны ескеріңіз. Ұмытпаңыз, егер сізде қандай да бір мәселе туындаса, маған жазыңыз, мен көмектесуге тырысамын.

Ұсынылған: