我试过了,缓冲区开大点也不行,程序进入了DMA的中断一直循环,没有进入ADC的中断里
void DMA1_Channel1_IRQHandler(void)
{
/* USER CODE BEGIN DMA1_Channel1_IRQn 0 */
printf("DMA\n");
/* USER CODE END DMA1_Channel1_IRQn 0 */
HAL_DMA_IRQHandler(&hdma_adc1);
/* USER CODE BEGIN DMA1_Channel1_IRQn 1 */
/* USER CODE END DMA1_Channel1_IRQn 1 */
}
void ADC1_2_IRQHandler(void)
{
/* USER CODE BEGIN ADC1_2_IRQn 0 */
printf("ADC\n");
/* USER CODE END ADC1_2_IRQn 0 */
HAL_ADC_IRQHandler(&hadc1);
/* USER CODE BEGIN ADC1_2_IRQn 1 */
只有1个数据用IT就好了。
DMA的Circle是会一直转换,转换了一半的数据会调用HAL_ADC_ConvHalfCpltCallback,转换完全部数据会调用HAL_ADC_ConvCpltCallback。然后一直循环。
你可以在HAL_ADC_IRQHandler开头加一句话看看是不是一直进入中断。或者把缓冲区开大点看看是不是没有问题了。
我用的就是CubeMX + ADC + DMA,缓冲区1000,一直没问题。
我试过了,缓冲区开大点也不行,程序进入了DMA的中断一直循环,没有进入ADC的中断里
void DMA1_Channel1_IRQHandler(void)
{
/* USER CODE BEGIN DMA1_Channel1_IRQn 0 */
printf("DMA\n");
/* USER CODE END DMA1_Channel1_IRQn 0 */
HAL_DMA_IRQHandler(&hdma_adc1);
/* USER CODE BEGIN DMA1_Channel1_IRQn 1 */
/* USER CODE END DMA1_Channel1_IRQn 1 */
}
void ADC1_2_IRQHandler(void)
{
/* USER CODE BEGIN ADC1_2_IRQn 0 */
printf("ADC\n");
/* USER CODE END ADC1_2_IRQn 0 */
HAL_ADC_IRQHandler(&hadc1);
/* USER CODE BEGIN ADC1_2_IRQn 1 */
/* USER CODE END ADC1_2_IRQn 1 */
}
但是我把DMA的中断程序注释掉,程序还是会中断,我只有把DMA的NVIC的配置也注释掉才不会进入中断,这是为什么
对了,我用的cubemx是4.27.0,库是STM32Cube_FW_F1_V1.6.0,
cube版本不一样,设置就不一样,一直在更新,也一直在完善吧。话说你就一个通道,采集量很小,没必要开DMA
你说的很对
用中断时你一定要注意中断运行时间和你的中断时间间隔,如果每次中断之间的时间间隔小于一次进入中断运行的时间,那肯定会一直进中断,因为中断还没出来呢,下一次中断就来了,所以会一直进中断,其他程序就执行不了了。
另外,你说的加入打印命令,打印是很耗时间的,你的AD转换周期如果设置太小的话,不够一次打印时间,那肯定会一直反复进中断。打印子程序没用过,不知道是什么方式实现的,如果是中断方式的话,那么他执行打印的时候肯定会等待打印完成,这个时候如果发送中断优先级低于ADC优先级的话,是不会执行发送中断的,也就永远发送不完,也退不出ADC中断。这只是一种猜测,仅供参考。
中断程序一定简单,运行时间短,进去就出来,千万不能加太耗时的等待等语句。
评分
查看全部评分
了解了,但是我还有个问题,前面我实验时它一直进DMA的中断,然后我把DMA中断服务函数注释了,结果程序还是好像进中断了,阻塞在那里不执行后面的代码了;再然后我按二楼说的把ADC DMA中断的NVIC使能代码注释掉,程序就能继续执行了;这是为什么呢,我都没有中断服务函数了,为什么还会进中断,还必须把NVIC使能的代码注释掉才行?