Estoy probando stm32 después de un largo tiempo de programación en avr, y parece que estoy luchando con el temporizador. Quiero usar el temporizador para manejar las congelaciones:
HAL_TIM_Base_Start_IT(&htim1);
while ((GPIOA->IDR & GPIO_PIN_3) == 0x08)
{
Clk_h
DWT_Delay(200);
Clk_l
DWT_Delay(200);
}
HAL_TIM_Base_Stop_IT(&htim1);
En el código anterior, estoy esperando cuando GPIO_PIN_3 se encuentre en un estado bajo. Lo que pasa es que es posible que permanezca en estado alto para siempre, por lo que quiero iniciar el temporizador1 y después de 500 ms, debe disparar la interrupción. El problema es que mientras el bucle atrapa 0, tomó alrededor de 100 us, y mi temporizador se configuró con:
static void MX_TIM1_Init(void)
{
TIM_ClockConfigTypeDef sClockSourceConfig;
TIM_MasterConfigTypeDef sMasterConfig;
htim1.Instance = TIM1;
htim1.Init.Prescaler = 16799;
htim1.Init.CounterMode = TIM_COUNTERMODE_UP;
htim1.Init.Period = 4999;
htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
htim1.Init.RepetitionCounter = 0;
if (HAL_TIM_Base_Init(&htim1) != HAL_OK)
{
_Error_Handler(__FILE__, __LINE__);
}
sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
if (HAL_TIM_ConfigClockSource(&htim1, &sClockSourceConfig) != HAL_OK)
{
_Error_Handler(__FILE__, __LINE__);
}
sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
if (HAL_TIMEx_MasterConfigSynchronization(&htim1, &sMasterConfig) != HAL_OK)
{
_Error_Handler(__FILE__, __LINE__);
}
}
así que es mucho más que 100us, pero lo que sea que se dispare una vez, no sé por qué. Como entiendo temporizador, después de iniciarlo, debería comenzar a contar y cuando se alcance el valor, se activará la interrupción. Pero aquí incluso si inmediatamente inicio y detengo el temporizador:
HAL_TIM_Base_Start_IT(&htim1);
HAL_TIM_Base_Stop_IT(&htim1);
se activará una vez de todos modos. Lo que necesito es activar la función de interrupción solo cuando ocurre un desbordamiento en el registro de conteo. Aquí está mi función de desbordamiento, que se encuentra en stm32f4xx_it.c:
void TIM1_UP_TIM10_IRQHandler(void)
{
/* USER CODE BEGIN TIM1_UP_TIM10_IRQn 0 */
/* USER CODE END TIM1_UP_TIM10_IRQn 0 */
HAL_TIM_IRQHandler(&htim1);
/* USER CODE BEGIN TIM1_UP_TIM10_IRQn 1 */
sprintf(str123,"<<FAIL>>");
CDC_Transmit_FS((uint8_t*)str123,strlen(str123));
/* USER CODE END TIM1_UP_TIM10_IRQn 1 */
}