Estoy tratando de usar timer2 en STM32L475 pero no comienza a disparar la interrupción.
Me gustaría configurar el temporizador por un minuto.
void InitializeTimer()
{
TIM_SlaveConfigTypeDef sSlaveConfig;
TIM_MasterConfigTypeDef sMasterConfig;
htim2.Instance = TIM2;
htim2.Init.Prescaler = 10000;
htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
htim2.Init.Period = 500;
htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
if (HAL_TIM_Base_Init(&htim2) != HAL_OK)
{
_Error_Handler(__FILE__, __LINE__);
}
sSlaveConfig.SlaveMode = TIM_SLAVEMODE_RESET;
sSlaveConfig.InputTrigger = TIM_TS_ITR0;
if (HAL_TIM_SlaveConfigSynchronization(&htim2, &sSlaveConfig) != 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__);
}
if(HAL_TIM_Base_Start_IT(&htim2) != HAL_OK)
{
_Error_Handler(__FILE__, __LINE__);
}
}
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if (htim->Instance == TIM2) {
start_processing = true;
}
}
void TIM2_IRQHandler()
{
/* Clear interrupt flag first. It cannot be the last instruction in an interrupt handler. */
__HAL_TIM_CLEAR_FLAG(&htim2, TIM_FLAG_UPDATE); //clear interrupt flag
start_processing = true;
}
antes del bucle principal:
MX_I2C3_Init();
InitializeTimer();
//MX_SPI3_Init();
HAL_NVIC_SetPriority(TIM2_IRQn, 0, 1);
HAL_NVIC_EnableIRQ(TIM2_IRQn);// Enable interrupt from TIM3 (NVIC level)
HAL_TIM_PeriodElapsedCallback()
nunca se llama porque no hay código para llamarlo. Se supone que se llama desde TIM2_IRQHandler()
.
Aquí hay una configuración básica del temporizador con interrupciones cada minuto, asumiendo que el reloj APB1 es de 80 MHz.
volatile int start_processing;
void TIM2_IRQHandler(void) {
if(TIM2->SR & TIM_SR_UIF) { // check status
start_processing = 1;
TIM2->SR &= ~TIM_SR_UIF; // clear status
}
}
void InitializeTimer(void) {
RCC->APB1ENR1 |= RCC_APB1ENR1_TIM2EN;
RCC->APB1ENR1;
TIM2->PSC = 9999; // 80 MHz clock is prescaled to 8 kHz
TIM2->EGR = TIM_EGR_UG; // required to take over the ARR value
TIM2->ARR = 479999; // 8000 * 60 - 1
TIM2->DIER = TIM_DIER_UIE; // enable update (timer overflow) interrupt
TIM2->CR1 = TIM_CR1_CEN; // start timer
NVIC_SetPriority(TIM2_IRQn, 0);
NVIC_EnableIRQ(TIM2_IRQn);
}
siguió a Mónica a Codidact
TIM1
?)? ¿Funciona sin la configuración maestro-esclavo? sestart_processing
declara comovolatile
? ¿Qué contienen los registros de control y estado?andré
andré
siguió a Mónica a Codidact