2018-11-08 10:13 AM
Hi,
I am trying to use either TIM13 or TIM14 but the ISR never get trigger.
My questions are
Thx
****
startup_stm32f407xx.s
.word TIM8_UP_TIM13_IRQHandler /* TIM8 Update and TIM13 */
.word TIM8_TRG_COM_TIM14_IRQHandler /* TIM8 Trigger and Commutation and TIM14 */
/* TIM13 init function */
void MX_TIM13_Init(void)
{
htim13.Instance = TIM13;
htim13.Init.Prescaler = 0;
htim13.Init.CounterMode = TIM_COUNTERMODE_UP;
htim13.Init.Period = 0;
htim13.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
if (HAL_TIM_Base_Init(&htim13) != HAL_OK)
{
_Error_Handler(__FILE__, __LINE__);
}
}
/* TIM14 init function */
void MX_TIM14_Init(void)
{
htim14.Instance = TIM14;
htim14.Init.Prescaler = 0;
htim14.Init.CounterMode = TIM_COUNTERMODE_UP;
htim14.Init.Period = 0;
htim14.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
if (HAL_TIM_Base_Init(&htim14) != HAL_OK)
{
_Error_Handler(__FILE__, __LINE__);
}
}
2018-11-08 10:35 AM
Setting Prescaler and Period is going to result in the TIM not clocking...
The Prescaler and Period are divisors. You write a value as N-1, so zero means divide by ONE
TIMEBASE = (APBxTIMCLK / (Prescaler + 1)) / (Period + 1)
For 10 ms, you want 100 Hz
If the TIM is clocking at 84 MHz, that means 84,000,000 / 100 or 840,000 ticks to describe 10ms (0.01s)
Suggest a Prescaler of 840-1 (839) and Period of 1000-1 (999)
/*##-2- Start the TIM Base generation in interrupt mode ####################*/
if (HAL_TIM_Base_Start_IT(&TimHandle) != HAL_OK)
{
/* Starting Error */
Error_Handler();
}
2018-11-08 11:27 AM
Doesn't seems working, seems going nowhere in HAL_TIM_Base_Start_IT(). After I pause the execution, see below message.
Program received signal SIGINT, Interrupt.
0x08000fbe in main () at ..\Src\main.c:101
101 if (HAL_TIM_Base_Start_IT(&htim10) != HAL_OK)
My main() is pretty simple, just testing the TIM.
Any thoughts?
Thx
int main(void)
{
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* Configure the system clock */
SystemClock_Config();
MX_GPIO_Init();
HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_0 | GPIO_PIN_8 | GPIO_PIN_9);
/* Initialize all configured peripherals */
MX_TIM10_Init();
/*##-2- Start the TIM Base generation in interrupt mode ####################*/
if (HAL_TIM_Base_Start_IT(&htim10) != HAL_OK)
{
/* Starting Error */
Error_Handler();
}
while (1)
{
}
}
2018-11-08 11:41 AM
>>Any thoughts?
You've got interrupt handler code?
You've enabled the TIM clocks somewhere?
2018-11-08 12:19 PM
I do have init code and ISR code. Anything else? Thx
/* TIM2 init function */
void MX_TIM2_Init(void)
{
TIM_ClockConfigTypeDef sClockSourceConfig;
TIM_MasterConfigTypeDef sMasterConfig;
htim2.Instance = TIM2;
htim2.Init.Prescaler = 840 - 1;
htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
htim2.Init.Period = 1000 - 1;
htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
if (HAL_TIM_Base_Init(&htim2) != HAL_OK)
{
_Error_Handler(__FILE__, __LINE__);
}
sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
if (HAL_TIM_ConfigClockSource(&htim2, &sClockSourceConfig) != HAL_OK)
{
_Error_Handler(__FILE__, __LINE__);
}
sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
if (HAL_TIMEx_MasterConfigSynchronization(&htim2, &sMasterConfig) != HAL_OK)
{
_Error_Handler(__FILE__, __LINE__);
}
}
/* TIM10 init function */
void MX_TIM10_Init(void)
{
htim10.Instance = TIM10;
htim10.Init.Prescaler = 840-1;
htim10.Init.CounterMode = TIM_COUNTERMODE_UP;
htim10.Init.Period = 1000-1;
htim10.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
if (HAL_TIM_Base_Init(&htim10) != HAL_OK)
{
_Error_Handler(__FILE__, __LINE__);
}
}
/* TIM11 init function */
void MX_TIM11_Init(void)
{
htim11.Instance = TIM11;
htim11.Init.Prescaler = 840-1;
htim11.Init.CounterMode = TIM_COUNTERMODE_UP;
htim11.Init.Period = 1000-1;
htim11.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
if (HAL_TIM_Base_Init(&htim11) != HAL_OK)
{
_Error_Handler(__FILE__, __LINE__);
}
}
void TIM1_UP_TIM10_IRQHandler()
{
uint32_t test = 0 ;
}
void TIM1_TRG_COM_TIM11_IRQHandler()
{
uint32_t test = 0 ;
}
void TIM2_IRQHandler()
{
uint32_t test = 0 ;
}
2018-11-08 01:26 PM
The IRQ Handlers would need to clear the sources otherwise they'll keep re-entering.
You configure the NVIC anywhere?
/*##-2- Configure the NVIC for TIMx ########################################*/
/* Set Interrupt Group Priority */
HAL_NVIC_SetPriority(TIM2_IRQn, 4, 0);
/* Enable the TIMx global Interrupt */
HAL_NVIC_EnableIRQ(TIM2_IRQn);
2018-11-08 01:55 PM
Seems working now adding HAL_NVIC_EnableIRQ.
Does the HAL_TIM_IRQHandler clear the interrupt source?
void TIM1_UP_TIM10_IRQHandler()
{
HAL_TIM_IRQHandler(&htim10);
}
2018-11-08 02:42 PM
Yes, the mechanics there is that the HAL manages things, and then uses a call-back you supply depending on the source of the interrupt.
2018-11-08 04:13 PM
Thank you so much. I have it working now. Thx