I want to design a variable width PWM waveform using IRQ, but I am unable to use loops in TIM_IRQHANDLERS. below is the code i am using in TIM_IRQHANDLER
void TIM2_IRQHandler(void) { volatile float i; volatile int x; if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_3)==1) { for(i=0.5;i>0.0;i=i-0.1) { x=8000000*i; switch(x) { case 4000000: { if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_3)==1) { HAL_GPIO_WritePin(GPIOB,GPIO_PIN_3,0); htim2.Init.Period =4000000 ; } else { HAL_GPIO_WritePin(GPIOB,GPIO_PIN_3,1); htim2.Init.Period =2000000; } }
case 3200000: { if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_3)==1) { HAL_GPIO_WritePin(GPIOB,GPIO_PIN_3,0); htim2.Init.Period =3200000 ; } else { HAL_GPIO_WritePin(GPIOB,GPIO_PIN_3,1); htim2.Init.Period =1600000; } } case 1600000: { if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_3)==1) { HAL_GPIO_WritePin(GPIOB,GPIO_PIN_3,0); htim2.Init.Period =1600000 ; } else { HAL_GPIO_WritePin(GPIOB,GPIO_PIN_3,1); htim2.Init.Period =800000; } } default: { for(int n=0;n<11;n++) { if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_3)==1) { HAL_GPIO_WritePin(GPIOB,GPIO_PIN_3,0); htim2.Init.Period =800000 ; } else { HAL_GPIO_WritePin(GPIOB,GPIO_PIN_3,1); htim2.Init.Period =400000; } } } } } } if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_3)==0) { for(i=0.1;i<0.6;i=i+0.1) { x=8000000*i; switch(x) { case 800000: { if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_3)==1) { HAL_GPIO_WritePin(GPIOB,GPIO_PIN_3,0); htim2.Init.Period =800000 ; } else { HAL_GPIO_WritePin(GPIOB,GPIO_PIN_3,1); htim2.Init.Period =400000; } }
case 1600000: { if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_3)==1) { HAL_GPIO_WritePin(GPIOB,GPIO_PIN_3,0); htim2.Init.Period =1600000 ; } else { HAL_GPIO_WritePin(GPIOB,GPIO_PIN_3,1); htim2.Init.Period =800000; } } case 3200000: { if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_3)==1) { HAL_GPIO_WritePin(GPIOB,GPIO_PIN_3,0); htim2.Init.Period =3200000 ; } else { HAL_GPIO_WritePin(GPIOB,GPIO_PIN_3,1); htim2.Init.Period =1600000; } } case 4000000: { if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_3)==1) { HAL_GPIO_WritePin(GPIOB,GPIO_PIN_3,0); htim2.Init.Period =4000000 ; } else { HAL_GPIO_WritePin(GPIOB,GPIO_PIN_3,1); htim2.Init.Period =2000000; } } default:{} } } }
HAL_TIM_IRQHandler(&htim2);
}
It is OK to loop in ISRs (assuming the loop is quick) but not good to wait for an event/condition. Having said that, I see it all the time in Keil/ST driver code.