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);
}
Look at the picture: www.danlhenry.com/.../keil_code.png - pay attention to the instructions!
Note that it is not generally a good idea to loop in any interrupt handler!