Estoy aprendiendo a programar en una tarjeta de descubrimiento STM32F7 46 G usando Eclipse como IDE y STM32CubeMX. Estoy intentando configurar un temporizador (actualmente TIM2) a un segundo sin usar un ISR. Me gustaría recibir un tick del temporizador cada segundo.
A continuación se muestra lo que intenté hasta ahora:
#include "main.h"
#include "stm32f7xx_hal.h"
/* Private variables ---------------------------------------------------------*/
TIM_HandleTypeDef htim2;
/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_TIM2_Init(void);
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim);
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_TIM2_Init();
__TIM2_CLK_ENABLE();
while (1)
{
HAL_TIM_PeriodElapsedCallback(&htim2);
}
}
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim2)
{
if (htim2->Instance==TIM2) //check if the interrupt comes from TIM2
{
HAL_GPIO_TogglePin(ARDUINO_D2_GPIO_Port,ARDUINO_D2_Pin);
}
}
static void MX_TIM2_Init(void) /* TIM2 init function */
{
TIM_ClockConfigTypeDef sClockSourceConfig;
TIM_MasterConfigTypeDef sMasterConfig;
htim2.Instance = TIM2;
htim2.Init.Prescaler = 41999; //max 65 536
htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
htim2.Init.Period = 1999;
htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
htim2.Init.AutoReloadPreload = 0;
HAL_TIM_Base_Init(&htim2);
HAL_TIM_Base_Start(&htim2);
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__);
}
}
Sé que la MCU funciona a 42MHz, lo que finalmente hace que el reloj funcione a 84MHz con PLL y creo que ya configuré los valores de Prescaler y Period (para corregir el tiempo de carga automática) en consecuencia.
Gracias por responder y perdón por cualquier error en inglés (no es mi primer idioma)