2

我使用 STM32F4Discovery 板,从 Cube 生成代码,SYSCLK 为 168MHz,APB1 定时器时钟 42MHz,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 一起使用。是工具的问题吗?还是因为挂在处理程序中?

4

1 回答 1

3

问题是,该计时器在调试暂停期间仍然计数。通过将定时器切换到调试模式后

__HAL_DBGMCU_FREEZE_TIM6();

它工作正常。我在阅读时错过了参考手册的第 20.3.4 节。

于 2016-12-22T13:31:34.627 回答