2016-12-21 71 views
0

我使用STM32F4Discovery开发板,从Cube生成代码,SYSCLK为168MHz,APB1定时器时钟为42 MHz,TIM6具有预分频器1000,并且计数至62。STM32F4 TIM6中断不会在DMA工作时发生

启用由

__HAL_TIM_ENABLE_IT(&htim6, TIM_IT_UPDATE); 
HAL_NVIC_EnableIRQ(TIM6_DAC_IRQn); 

开始DAC_DMA TIM6中断在正常模式下,用30元素阵列。

计数许多定时器中断是如何发生的

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处理程序,并主要是(1)循环。问题是,它挂在TIM6处理程序中。

问题:

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

2)为什么它挂在定时器处理程序?

3)TIM6 SR寄存器不会被HAL宏或HAL_TIM_IRQHandler清零。我使用openOCD的eclipse。这是一个工具问题吗?还是由于挂在处理程序?

回答

1

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

__HAL_DBGMCU_FREEZE_TIM6(); 

将定时器切换到调试模式后,它工作正常。阅读时我错过了参考手册的第20.3.4节。