我使用的是STM32L431,在做TIM定时触发ADC多通道采样,DMA传输采样数据,完成后产生中断。1、首先我配置了TIM6,配置如图1所示,TIM的输入时钟是80MHz, 由配置的分频系数和计数值,可得时钟产生事件的频率是6400Hz,(即128*50,50是电网频率,128是每周波128个采样点)。
2、配置了ADC的七个通道,触发方式等,配置如图二所示。
3、配置了DMA,如图三所示。
4、中断的配置,只使能了DMA中断和TIM的中断。
5、我在main.c中调用函数 HAL_ADC_Start_DMA(&hadc1, (uint32_t *)adc_buff, 128*7); (存在变量定义uint16_t adc_buff[128*7] = {0};)
6、我在TIM的中断程序中加入了 串口输出反转,如图4。 用示波器检测GPIO口电平反转的频率是大于是 3200Hz,由于是反转,所以乘2,即6400Hz,说明我的TIM定时 正确。
7、在DMA的中断 程序中,重新定义了 DMA的传输完成回调函数,该函数在DMA完成时会被调用。我也加入了电平反转控制GPIO口。使用示波器测量频率并乘2,频率为2380Hz,该频率不是我的预算值。
8、我的计算:使用DMA的传输完成回调函数 控制电平反转,频率应该时50Hz. 因为TIM每次更新事件触发ADC一次采样七个通道,频率是6400Hz。因为我HAL_ADC_Start_DMA()参数是128*7个数据,因此6400/128=50.即 DMA的中断频率应该是50HZ.
请教各位我的问题应该在哪里。 |