cancel
Showing results for 
Search instead for 
Did you mean: 

Failed attempt on using 2 Timers to Toggle GPIO.

Oahme.1
Associate III

Hello , 
I have initialized two timers , Timer3 and Timer9. Im using Timer9 with 137uS period , setting my gpio pin high , starting Tim3 Interrupt with 54uS period for now .When Tim3 Interrupt occurs I simply reset my gpio pin.My problem is that I should have a high pwm for 54uS and 137uS pwm in reset state.I have thoroughly checked individual timers to just toggle single gpio in 1 single interrupt , both give me a stable 137uS pwm and 54uS pwm . But as i use two different gpio's to set and reset my gpio. I get irregular pwm that has values randomly changing. My pwm will have a constant 137uS low and a variable high pwm state which is Max 122uS for now as I said its just fixed 54uS so I also did not enable autoload preload .This is the first time I'm doing it this way.

My Code :

Timer Setting : 

void MX_TIM3_Init(void) { /* USER CODE BEGIN TIM3_Init 0 */ /* USER CODE END TIM3_Init 0 */ TIM_ClockConfigTypeDef sClockSourceConfig = {0}; TIM_MasterConfigTypeDef sMasterConfig = {0}; /* USER CODE BEGIN TIM3_Init 1 */ /* USER CODE END TIM3_Init 1 */ htim3.Instance = TIM3; htim3.Init.Prescaler = 0; htim3.Init.CounterMode = TIM_COUNTERMODE_UP; htim3.Init.Period = 4700; htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; htim3.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; if (HAL_TIM_Base_Init(&htim3) != HAL_OK) { Error_Handler(); } sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL; if (HAL_TIM_ConfigClockSource(&htim3, &sClockSourceConfig) != HAL_OK) { Error_Handler(); } sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET; sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; if (HAL_TIMEx_MasterConfigSynchronization(&htim3, &sMasterConfig) != HAL_OK) { Error_Handler(); } /* USER CODE BEGIN TIM3_Init 2 */ //HAL_TIM_Base_Start_IT(&htim3); /* USER CODE END TIM3_Init 2 */ } /* TIM9 init function */ void MX_TIM9_Init(void) { /* USER CODE BEGIN TIM9_Init 0 */ /* USER CODE END TIM9_Init 0 */ TIM_ClockConfigTypeDef sClockSourceConfig = {0}; /* USER CODE BEGIN TIM9_Init 1 */ /* USER CODE END TIM9_Init 1 */ htim9.Instance = TIM9; htim9.Init.Prescaler = 0; htim9.Init.CounterMode = TIM_COUNTERMODE_UP; htim9.Init.Period = 11508; htim9.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; htim9.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; if (HAL_TIM_Base_Init(&htim9) != HAL_OK) { Error_Handler(); } sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL; if (HAL_TIM_ConfigClockSource(&htim9, &sClockSourceConfig) != HAL_OK) { Error_Handler(); } /* USER CODE BEGIN TIM9_Init 2 */ HAL_TIM_Base_Start_IT(&htim9); /* USER CODE END TIM9_Init 2 */ } void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* tim_baseHandle) { if(tim_baseHandle->Instance==TIM3) { /* USER CODE BEGIN TIM3_MspInit 0 */ /* USER CODE END TIM3_MspInit 0 */ /* TIM3 clock enable */ __HAL_RCC_TIM3_CLK_ENABLE(); /* TIM3 interrupt Init */ HAL_NVIC_SetPriority(TIM3_IRQn, 0, 0); HAL_NVIC_EnableIRQ(TIM3_IRQn); /* USER CODE BEGIN TIM3_MspInit 1 */ /* USER CODE END TIM3_MspInit 1 */ } else if(tim_baseHandle->Instance==TIM9) { /* USER CODE BEGIN TIM9_MspInit 0 */ /* USER CODE END TIM9_MspInit 0 */ /* TIM9 clock enable */ __HAL_RCC_TIM9_CLK_ENABLE(); /* TIM9 interrupt Init */ HAL_NVIC_SetPriority(TIM1_BRK_TIM9_IRQn,0, 0); HAL_NVIC_EnableIRQ(TIM1_BRK_TIM9_IRQn); /* USER CODE BEGIN TIM9_MspInit 1 */ /* USER CODE END TIM9_MspInit 1 */ } } void HAL_TIM_Base_MspDeInit(TIM_HandleTypeDef* tim_baseHandle) { if(tim_baseHandle->Instance==TIM3) { /* USER CODE BEGIN TIM3_MspDeInit 0 */ /* USER CODE END TIM3_MspDeInit 0 */ /* Peripheral clock disable */ __HAL_RCC_TIM3_CLK_DISABLE(); /* TIM3 interrupt Deinit */ HAL_NVIC_DisableIRQ(TIM3_IRQn); /* USER CODE BEGIN TIM3_MspDeInit 1 */ /* USER CODE END TIM3_MspDeInit 1 */ } else if(tim_baseHandle->Instance==TIM9) { /* USER CODE BEGIN TIM9_MspDeInit 0 */ /* USER CODE END TIM9_MspDeInit 0 */ /* Peripheral clock disable */ __HAL_RCC_TIM9_CLK_DISABLE(); /* TIM9 interrupt Deinit */ HAL_NVIC_DisableIRQ(TIM1_BRK_TIM9_IRQn); /* USER CODE BEGIN TIM9_MspDeInit 1 */ /* USER CODE END TIM9_MspDeInit 1 */ } }
View more

 

Interrupt Callback function : 

volatile bool temp = true; volatile bool Flag = true; void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) { if(htim->Instance == TIM3) { if(temp) { temp= false; } //HAL_TIM_Base_Start_IT(&htim9); //__HAL_TIM_ENABLE_IT(htim, TIM_IT_UPDATE); if(Flag) { HAL_GPIO_WritePin(GPIOA, weld_Pin,GPIO_PIN_RESET); Flag = false; __NOP(); } } if(htim->Instance == TIM9) { if(temp) { temp= false; //HAL_TIM_Base_Init(&htim3); HAL_TIM_Base_Start_IT(&htim3); } //HAL_GPIO_TogglePin(GPIOA,weld_Pin); Flag = true; HAL_GPIO_WritePin(GPIOA, weld_Pin,GPIO_PIN_SET); __NOP(); } }
View more

 

Initially I got overconfident and defined the whole structure program which is much complicated hoping this will definitely work , but unfortunately I had to go back to the basics because I was not getting the desired  Timer results.

I will add 2 photos which depict what I want and what I'm actually getting .

Any Help would be great . @Tesla DeLorean @TDK  ,Can you help in this matter ? 

Thanks.

Actual Picture

PWM Actual.jpeg

 

Original Idea

PWM_Orginal.png

 

 

 

14 REPLIES 14

Yes , I Believe thats true but Update interrupt not interrupting in there own dedicated functions ? Weird. Trust me man I'm just trying to go along with HAL using basic libraries to get the job done ,otherwise I absolutely hate it . Will shift to LL Drivers but for now I have to get the job done .

@TDK can you help me with the above reply regarding interrupt ? 

Depending on your channel configuration, CCx callbacks are done in one of the following callbacks:

HAL_TIM_IC_CaptureCallback(htim);
HAL_TIM_OC_DelayElapsedCallback(htim);
HAL_TIM_PWM_PulseFinishedCallback(htim);

You can see the logic used for callbacks within HAL_TIM_IRQHandler.

If you feel a post has answered your question, please click "Accept as Solution".
Oahme.1
Associate III

Thanks, Got it, Lastly regarding the Interrupt Priorities , I've I have 2 Timers , Timers 1 is the highest priority and Timer2 is the second highest priority , that means my Preempt Priority is 0 for Timer 1 and 1 for Timer 2 right ?

Yes. Priority 0 will pre-empt priority 1.

If you feel a post has answered your question, please click "Accept as Solution".
Oahme.1
Associate III

Thanks @TDK