We are running a survey to help us improve the experience for all of our members. If you see the survey appear, please take the time to tell us about your experience if you can.
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.