فهرست مطالب:

Debounce STM32CubeMX با وقفه: 5 مرحله
Debounce STM32CubeMX با وقفه: 5 مرحله

تصویری: Debounce STM32CubeMX با وقفه: 5 مرحله

تصویری: Debounce STM32CubeMX با وقفه: 5 مرحله
تصویری: STM32Cube UART and External Interrupt tutorials in Persian 2024, جولای
Anonim
Debounce STM32CubeMX با وقفه
Debounce STM32CubeMX با وقفه

سلام ، در این آموزش من سعی می کنم راه حل ساده خود را برای جلوگیری از برگشتن دکمه ارائه کنم که مسئله ای بسیار جدی است. در اینترنت ویدیوهای زیادی برای ارائه راه حل برای این مشکل وجود دارد ، اما هیچ کدام از آنها برای وقفه خارجی وجود ندارد. در همه این فیلم ها فشار دکمه با روش نظرسنجی بررسی می شود که ناکارآمد است. بنابراین ، بیایید شروع کنیم!

مرحله 1: سخت افزار و نرم افزار مورد نیاز

الزامات سخت افزاری:

  • برد توسعه STM32 ARM
  • یک کامپیوتر

الزامات نرم افزاری:

  • STM32CubeMX
  • Keil uVision5

مرحله 2: درک مشکل

درک مشکل
درک مشکل

بنابراین ، ما سعی می کنیم راه حلی برای مشکل پرش دکمه پیدا کنیم. بنابراین ، ما باید موضوع را درک کنیم. بنابراین ، هنگامی که ما یک دکمه را فشار می دهیم ، باید به حالتی برسد که برخلاف حالت قبلی است. به عنوان مثال ، اگر ارتفاع آن بالا بود ، باید LOW باشد و اگر پایین بود ، باید HIGH باشد. با این حال ، این حالت ایده آل است (در 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 را برای وقفه خارجی می نویسیم:

void HAL_GPIO_EXTI_Callback (uint16_t GPIO_Pin) {if (GPIO_Pin == Push_Button_Pin && state == true) {HAL_TIM_Base_Start_IT (& htim1)؛ state = false؛ } else {_NOP ()؛ }}

وقتی دکمه را فشار می دهیم ، بررسی می کنیم که آیا دکمه تعریف شده ما بوده است یا خیر یا خیر. در ابتدا حالت برای وارد کردن دستور if درست خواهد بود. پس از ورود ، ما تایمر را راه اندازی می کنیم و حالت را نادرست می کنیم تا مطمئن شویم که بازگرداندن زمان سنج دوباره شروع نمی شود.

سپس ، ISR را برای وقفه زمان سنج می نویسیم:

void 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)؛ state = true؛ HAL_TIM_Base_Stop_IT (& htim1) ؛ }}

/ * USER CODE END 4 */

پس از 50mS ما بررسی می کنیم که آیا دکمه هنوز در حالت تنظیم مجدد است یا آزاد شده است ، اگر بله ، می دانیم که دکمه در حالت آماده به کار است. سپس led را تغییر می دهیم ، حالت را درست می کنیم تا بتوانیم یک دکمه دیگر را فشار دهیم و تایمر را متوقف کنیم تا بتوانیم دوباره آن را شروع کنیم.

بنابراین ، این فرآیند اطمینان می دهد که ما از بروز مشکل جلوگیری می کنیم.

مرحله 5: نتیجه گیری

این کد برای خروج از دکمه بود. می خواهم توجه داشته باشم که این کد توسط من تهیه شده است و من یک برنامه نویس متخصص نیستم. بنابراین ، مطمئناً ممکن است خطاهایی وجود داشته باشد. اگر راه حل بهتری دارید لطفاً توجه کنید. فراموش نکنید ، اگر با مشکلی برخورد کردید لطفاً برای من بنویسید و من سعی خواهم کرد به شما کمک کنم.

توصیه شده: