我使用 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 一起使用。是工具的问题吗?还是因为挂在处理程序中?