Мазмуну:

STM32CubeMX баскычы үзгүлтүккө учурайт: 5 кадам
STM32CubeMX баскычы үзгүлтүккө учурайт: 5 кадам

Video: STM32CubeMX баскычы үзгүлтүккө учурайт: 5 кадам

Video: STM32CubeMX баскычы үзгүлтүккө учурайт: 5 кадам
Video: Программирование STM32 Blue Pill с помощью релейной логики ПЛК LDmicro 2024, Декабрь
Anonim
STM32CubeMX баскычы үзгүлтүккө учурайт
STM32CubeMX баскычы үзгүлтүккө учурайт

Саламатсызбы, бул үйрөткүчтө мен абдан олуттуу маселе болгон баскычтын секирип кетпеши үчүн жөнөкөй чечимимди берүүгө аракет кылам. Интернетте бул маселени чечүүнү сунуштаган көптөгөн видеолор бар, бирок алардын бири да тышкы үзгүлтүккө учуроо үчүн эмес. Бул видеолордун бардыгында кнопканы басуу натыйжасыз болгон сурамжылоо ыкмасы менен текшерилет. Ошентип, баштайлы!

1 -кадам: Аппараттык жана программалык камсыздоого талаптар

Аппараттык талаптар:

  • STM32 ARM өнүктүрүү тактасы
  • Компьютер

Программалык камсыздоого талаптар:

  • STM32CubeMX
  • Keil uVision5

2 -кадам: Көйгөйдү түшүнүү

Проблеманы түшүнүү
Проблеманы түшүнүү

Ошентип, биз баскычтардын секирүү көйгөйүнүн чечимин табууга аракет кылабыз. Ошондуктан, биз маселени түшүнүшүбүз керек. Ошентип, биз баскычты басканда, ал мурунку абалына карама -каршы келген абалга келиши керек. Мисалы, эгер ал ЖОГОРУ болсо, ТӨМӨН болушу керек, эгерде ТӨМӨН болсо, анда ЖОГОРУ болуш керек. Бирок, бул идеалдуу абал (PROTEUSта:)) Чынында, биз баскычты басканда, ал бош абалга келгенге чейин HIGH менен LOW ортосунда секире баштайт. Ошентип, ал көйгөйлөрдү жараткан бир нече жолу басылган окшойт. Ошентип, биз эмне кылышыбыз керек?

Бул жерде белгилегим келет, бул мисалда, биз баскычты басууну аныктоо үчүн тышкы үзгүлтүктү колдонобуз. Ошентип, биз баскычты басууну тапкандан кийин, бош абалга жетүү үчүн 50 мС сыяктуу бир аз күтүшүбүз керек жана баскычтын бош абалда экенин же жок экендигин кайра текшерүү керек. Эгерде ал бош абалда болсо, анда биз өз милдетибизди уланта алабыз. Ошентип, кодду карап көрөлү:)

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

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

Ошентип, биз алгач баскычты басуу үчүн тышкы үзгүлтүктү иштетишибиз керек (бул жерде сиз STM32F407VG табуу тактасын колдоносуз деп ойлойм):

  • "Pinout & Configuration" өтмөгүндө басуу баскычына туташкан PA0 пинине чыкылдатыңыз жана GPIO_EXTI0 тандаңыз, ал ошол пиндин сырткы үзүлүшүн иштетет.
  • Пиндин "колдонуучу энбелгисин" "Push_Button" же каалаган нерсеге өзгөртүңүз.

Андан кийин, биз 50mS убакыт кечигүүсүн түзүү үчүн таймерди конфигурациялашыбыз керек:

  • "Таймерлер" бөлүмүнө кириңиз
  • TIM1 чыкылдатыңыз
  • Саат булагы катары "Ички Саатты" тандаңыз
  • Конфигурацияда (Эгерде сиз бул бөлүмдү түшүнгүңүз келсе, бул окуу куралына кайрылыңыз, абдан сунушталган "STV32F4 ARM MCU менен Servo Motor Control"):

    • Алдын ала эсептегичти 32000 деп коюңуз
    • Жана каршы мезгил 50
  • "NVIC Орнотуулар" өтмөгүндө бардык үзгүлтүктөрдү иштетүү

Чыгуу катары LED иштетүү:

PD12ди чыкылдатыңыз жана "GPIO_Output" деп коюңуз

Андан кийин, саатты жогорудагы сүрөттөгүдөй конфигурациялап, кодду түзүңүз.

4 -кадам: Keil программалык камсыздоону иштеп чыгуу

Биринчиден, биз абал өзгөрмөсүн аныктайбыз, бул секирүү болгондо тышкы үзгүлтүктүн ичинде таймерди баштоону камсыз кылат:

/ * КОЛДОНУУЧУ КОДУ 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) { / *Колдонулбаган аргументтердин алдын алуу компиляция эскертүүсү * / КОЛДОНУЛБАГАН (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 БҮТӨТ */

50 мСтен кийин биз баскычтын баштапкы абалга келтирилгенин же бошотулганын текшеребиз, эгер ооба болсо, анда бул баскыч иштебей турганын билебиз. Андан кийин биз дагы бир баскычты басууну аныктоо жана кайра баштоо үчүн таймерди токтотуу үчүн, жетекчини которобуз, абалды чындыкка айландырабыз.

Ошентип, бул процесс биз секирип кетүүчү көйгөйдүн алдын алууну камсыз кылат.

5 -кадам: Жыйынтык

Бул баскычты чыгаруу үчүн код болчу. Бул кодду мен иштеп чыкканымды белгилегим келет жана мен эксперт программист эмесмин. Демек, албетте каталар болушу мүмкүн. Эгерде сизде жакшыраак чечим болсо, аны эске алыңыз. Унутпаңыз, эгер кандайдыр бир көйгөйгө туш болсоңуз мага жазыңыз, мен жардам берүүгө аракет кылам.

Сунушталууда: