STM32F103 - CubeMX - Temporizador e interrupción

0

Tengo un programa que configura el TIMER1 en el STM32F103 como Salida de comparación sin salida.

En main.c tengo una variable simple, que establecí en 1, y en el controlador de interrupciones de TIM1, la configuré para que la variable sea 2. En main, también envío el valor de dicha variable cada segundo.

Todo lo que obtengo en UART es "1111", por lo que la interrupción nunca se llama. ¿Por qué es eso?

main.c:

uint16_t testPixel = 1;
uint8_t myChar[5];
[...]
HAL_TIM_OC_MspInit(&htim1);
[...]
 while (1)
  {
    itoa(testPixel, myChar, 10);
    HAL_UART_Transmit(&huart1,myChar,sizeof(myChar),10);
    HAL_Delay(1000);
  }

Configuración TIM1 generada por CubeMX

static void MX_TIM1_Init(void)
{

  TIM_MasterConfigTypeDef sMasterConfig;
  TIM_OC_InitTypeDef sConfigOC;
  TIM_BreakDeadTimeConfigTypeDef sBreakDeadTimeConfig;

  htim1.Instance = TIM1;
  htim1.Init.Prescaler = 0;
  htim1.Init.CounterMode = TIM_COUNTERMODE_UP;
  htim1.Init.Period = 80-1;
  htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  htim1.Init.RepetitionCounter = 0;
  if (HAL_TIM_OC_Init(&htim1) != HAL_OK)
  {
    Error_Handler();
  }

  sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
  sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
  if (HAL_TIMEx_MasterConfigSynchronization(&htim1, &sMasterConfig) != HAL_OK)
  {
    Error_Handler();
  }

  sConfigOC.OCMode = TIM_OCMODE_TIMING;
  sConfigOC.Pulse = 10;
  sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
  sConfigOC.OCNPolarity = TIM_OCNPOLARITY_HIGH;
  sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
  sConfigOC.OCIdleState = TIM_OCIDLESTATE_RESET;
  sConfigOC.OCNIdleState = TIM_OCNIDLESTATE_RESET;
  if (HAL_TIM_OC_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_1) != HAL_OK)
  {
    Error_Handler();
  }

  sBreakDeadTimeConfig.OffStateRunMode = TIM_OSSR_DISABLE;
  sBreakDeadTimeConfig.OffStateIDLEMode = TIM_OSSI_DISABLE;
  sBreakDeadTimeConfig.LockLevel = TIM_LOCKLEVEL_OFF;
  sBreakDeadTimeConfig.DeadTime = 0;
  sBreakDeadTimeConfig.BreakState = TIM_BREAK_DISABLE;
  sBreakDeadTimeConfig.BreakPolarity = TIM_BREAKPOLARITY_HIGH;
  sBreakDeadTimeConfig.AutomaticOutput = TIM_AUTOMATICOUTPUT_DISABLE;
  if (HAL_TIMEx_ConfigBreakDeadTime(&htim1, &sBreakDeadTimeConfig) != HAL_OK)
  {
    Error_Handler();
  }

}

stm32f1xx_it.c:

extern testPixel;
[...]
void TIM1_UP_IRQHandler(void)
{
  testPixel = 2;
  HAL_TIM_IRQHandler(&htim1);

}

¡Gracias!

    
pregunta Cezar Chirila

2 respuestas

1

Esta función debe llamarse para que se llame al controlador de interrupción:

HAL_TIM_Base_Start_IT(&htim1);

Gracias a kkrambo por la sugerencia, aunque no fue HAL_TIM_OC_Start_IT (), sino la anterior.

    
respondido por el Cezar Chirila
0

¿Estás seguro de que la interrupción no se llama? Incluso si es muy probable que solo veas las "1" ¿por qué?

Olvidaste la palabra mágica "volátil". Es muy probable que el compilador optimice el uso de TestPixel. En su ejemplo, si TestPixel no se cambia en ninguna parte del programa principal, se eliminará itoa del bucle while, ya que el compilador no ve ninguna parte del código, donde es posible cambiar esta variable.

    
respondido por el P__J__

Lea otras preguntas en las etiquetas