DMA工作时STM32F4 TIM6中断不会发生

STM32F4 TIM6 interruption doesn't happen while DMA working

我用STM32F4Discovery开发板,从Cube生成代码,SYSCLK为168MHz,APB1 Timer Clock 42 MHz,TIM6有预分频器1000,计数到62。我做了以下实验。

通过

启用TIM6中断
__HAL_TIM_ENABLE_IT(&htim6, TIM_IT_UPDATE);
HAL_NVIC_EnableIRQ(TIM6_DAC_IRQn);

使用 30 个元素的数组在正常模式下启动 DAC_DMA。

计算发生了多少次定时器中断

void TIM6_DAC_IRQHandler(void) {

HAL_TIM_IRQHandler(&htim6);
tim6Counter++;
}

在此函数中设置断点:

void HAL_DAC_ConvCpltCallbackCh1(DAC_HandleTypeDef *hdac) {
    conversionCounter++;
}

我的期望:

1) HAL_DAC_ConvCpltCallbackCh1 被调用一次(由于非循环模式)。是真的。

2)调用时tim6Counter必须等于30,因为DAC数据缓冲区的长度是30。实验中tim6Counter是1。

3) DAC 完成后,将断点设置到TIM6 处理程序和main while(1) 循环。问题是,它挂在 TIM6 处理程序中。

问题:

1) 即使未启用 TIM6 中断,DMA 也能正常工作。但是如果启用,为什么它只发生一次,而不是每次 DMA 请求?

2) 为什么它在计时器处理程序中挂起?

3) TIM6 SR 寄存器未被 HAL 宏或 HAL_TIM_IRQHandler 清除。我将 eclipse 与 openOCD 一起使用。是工具的问题吗?还是由于挂在处理程序中?

问题是,计时器在调试暂停期间仍然计数。通过

将定时器切换到调试模式后
__HAL_DBGMCU_FREEZE_TIM6();

它工作正常。参考手册第20.3.4节我看的时候漏了。