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节我看的时候漏了。
我用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节我看的时候漏了。