Merhabalar,
STM32F103C8T6 mcu FreeRtos kullanarak PB12 Interrupt kesmesiyle BtnCnt değerimi bir artırarak işlem yapmaya çalışıyorum. Program kesmeye giriyor ama debounce nedeniyle BtnCnt değeri bir bir artmıyor. Bunun onune nasıl gecebilirim.
FreeRtos kullanmasaydım HAL_GetTick() fonksiyonu ile gecikme saglayabilirdim.
FreeRrosta nasıl yapabilirim bilmiyorum. Kesme icine denemek icin
koydugumda ise kitlenme meydana geldi.
Kesme CallBack fonksiyon icerisi:
FreeRtos kurulum yapım:
Hardware olarak:
STM32F103C8T6 mcu FreeRtos kullanarak PB12 Interrupt kesmesiyle BtnCnt değerimi bir artırarak işlem yapmaya çalışıyorum. Program kesmeye giriyor ama debounce nedeniyle BtnCnt değeri bir bir artmıyor. Bunun onune nasıl gecebilirim.
FreeRtos kullanmasaydım HAL_GetTick() fonksiyonu ile gecikme saglayabilirdim.
FreeRrosta nasıl yapabilirim bilmiyorum. Kesme icine denemek icin
vTaskDelay(pdMS_TO_TICKS(1));:
Kesme CallBack fonksiyon icerisi:
Kod:
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
BaseType_t xHigherPriorityTaskWoken = pdFALSE;
if(GPIO_Pin == EMG_Pin)
{
BtnCnt++;
if(BtnCnt>=3){BtnCnt=0;}
xSemaphoreGiveFromISR(BinarySem,&xHigherPriorityTaskWoken); // Give semaphore from ISR
__HAL_GPIO_EXTI_CLEAR_IT(EMG_Pin);
portYIELD_FROM_ISR(xHigherPriorityTaskWoken);
}
}
FreeRtos kurulum yapım:
Kod:
BinarySem = xSemaphoreCreateBinary();
xTaskCreate(TaskLedFlash, "Led Flash",configMINIMAL_STACK_SIZE,NULL,0,NULL); // priority 0
xTaskCreate(HandlerTask,"Task 2",configMINIMAL_STACK_SIZE,NULL,1,NULL); // priority 1
xTaskCreate(TaskDsply,"Oled disply",configMINIMAL_STACK_SIZE,NULL,2,NULL); // priority 2
vTaskStartScheduler();
void TaskLedFlash(void * argument)
{
for(;;)
{
led_toggle();
vTaskDelay(pdMS_TO_TICKS(500));
}
}
void HandlerTask(void * argument)
{
for(;;)
{
xSemaphoreTake(BinarySem,portMAX_DELAY); // If semaphore is not available, the task waits for the maximum time in the blocked state.
}
}
void TaskDsply(void * argument)
{
uint16_t sayi;
for(;;)
{
if(BtnCnt==1){ BtnCnt++; sayi=0;} // Saymaya baslangic adimi.
if(BtnCnt==2)
{
sayi++; // saymaya basladi.
}
if(BtnCnt==3){
BtnCnt=0; // Sayma durduruldu. BtnCnt =0 ilk deger
}
sprintf(txt, "%d ",(uint16_t) sayi);
ssd1306_SetCursor(10, 20);
ssd1306_WriteString(txt, Font_11x18, White);
ssd1306_UpdateScreen();
vTaskDelay(pdMS_TO_TICKS(1));
}
}
Hardware olarak: