توضیحات
ما قبلاً نحوه استفاده از ADC ، DHT11 ، SD CARD و FreeRTOS را آموزش داده ایم. امروز در این آموزش قصد داریم ، همه آنها را با هم ترکیب کنیم. ما داده های را که از طریق ADC به آن متصل است ، خواهیم خواند و از سنسور دما DHT11 نیز خوانده شده ، و این داده ها را به کارت SD خواهیم ریخت. کل این فرآیند در تسک های مختلف FreeRTOS انجام خواهد شد.
در تصویر بالا تنظیمات ADC است که در آن از کانال ۱ استفاده خواهیم کرد. TIM7 برای تأخیر در میکرو ثانیه مورد استفاده قرار می گیرد که برای عملکرد سنسور DHT11 مورد نیاز خواهد بود. TIM1 به عنوان تاخیر دوره ای استفاده می شود ، که در آن هر ۲ ثانیه یک وقفه ایجاد می شود. ما از این وقفه جهت ریلیز یا انتشار یک سمافور برای عملیات تسک مربوط به DHT11 استفاده خواهیم کرد.
غیر از راه اندازی فوق ، ما همچنین باید FATFS ، FreeRTOS و SPI را راه اندازی کنیم. برای دریافت اطلاعات بیشتر در مورد تنظیمات این موارد ، می توانید کد را بارگذاری کرده و پرونده .ioc مربوط به کیوب را بررسی کنید ، یا برای توضیحات مربوط به این مجموعه مورد استفاده ، می توانید پروژه های موجود در وب سایت را مشاهده کنید.
بخش های مهم کد سورس
;uint16_t ADC_VA
;int Temperature, Humidity
;xTaskHandle ADC_Task_Hnadler
;xTaskHandle DHT_Task_Hnadler
;xTaskHandle SDCARD_Task_Hnadler
;xSemaphoreHandle DHT_SEM
در بالا ، ما متغیرهایی را برای ذخیره داده های ADC و دما ایجاد کرده ایم. همچنین ، سه هندلر به همراه ۱ هندلر semaphore نیز تعریف شده است.
;(“/”) Mount_SD
;()Format_SD
;Create_File(“ADC_DATA.TXT”)
;Create_File(“TEMP.TXT”)
;(“/”)Unmount_SD
در داخل تابع اصلی ، ما پرونده ها را ایجاد می کنیم ، جایی که داده ها بعداً توسط تسک ها به روز می شوند.
;()DHT_SEM = xSemaphoreCreateBinary
;xTaskCreate(DHT_Task, “DHT”, 128, NULL, 1, &DHT_Task_Hnadler)
;xTaskCreate(ADC_Task, “ADC”, 128, NULL, 2, &ADC_Task_Hnadler)
;xTaskCreate(SDCARD_Task, “SD”, 128, NULL, 3, &SDCARD_Task_Hnadler)
HAL_TIM_Base_Start(&htim7); // us delay timer
HAL_TIM_Base_Start_IT(&htim1); // periodic delay timer
;()vTaskStartScheduler
در حال حاضر ما می خواهیم سمافور و سه تسک را ایجاد کنیم. در اینجا ، اولویت بالاتر SDCARD_Task است ، زیرا ما نمی خواهیم کار دیگری را برای جلوگیری از آن انجام دهیم ، در حالی که تسک در دسترسی کارد SD است. در این حالت ممکن است خرابی درایو اتفاق بیفتد.
TIM7 را به طور معمول و TIM1 را در مد وقفه شروع کنید. دلیل این امر این است که TIM1 در هر ۲ ثانیه وقفه ای را ایجاد می کند.
و در آخر برنامه زمانبندی (scheduler) را شروع خواهیم کرد.