Estoy usando TIM1 para conducir un canal DMA que está enviando bytes a GPIOF en un STM32F407. TIM1 se inicia mediante un canal OC en un temporizador diferente. En el controlador de interrupción de flujo DMA, estoy intentando detener TIM1 y también reiniciar el contador al generar un evento de Actualización. Para solucionar problemas, he configurado un canal OC en TIM1 para que pueda confirmar que se está iniciando y deteniéndose como se esperaba.
Parece que se inicia y se detiene en los momentos correctos cuando se ve la salida del pin con un analizador lógico, pero al pasar por el controlador de interrupciones en el depurador, veo que el bit CEN todavía está configurado después de borrarlo. Además, TIM1- > CNT continúa aumentando a medida que paso por cada línea.
El controlador de interrupciones es el siguiente:
void __attribute__((interrupt("IRQ"))) DMA2_Stream5_IRQHandler(void)
{
// Clear interrupt flags
do
{
DMA2->HIFCR = DMA_HIFCR_CTCIF5 | DMA_HIFCR_CHTIF5;
}
while(DMA2->HISR & DMA_HISR_TCIF5);
// Stop TIM1, TIM5 will re-enable it
//TIM1->CR1 &= (u16)~TIM_CR1_CEN;
do
{
TIM1->CR1 &= (u16)~TIM_CR1_CEN;
}
while(TIM1->CR1 & TIM_CR1_CEN);
TIM1->EGR = TIM_EventSource_Update; // Trigger an Update to reset the counter
// Re-enable DMA for next TIM5 event
DMA2_Stream5->CR |= DMA_SxCR_EN;
}
El código sale del bucle que borra el CEN, pero luego de ver los registros de TIM1, el CEN aún está configurado. ¿Cómo puedo asegurarme de que el temporizador se haya detenido realmente y comenzará a contar desde 0 la próxima vez que se inicie?