STM32F7实现ADC等周期采集(定时器触发+DMA传输)采集完成后的中断设置

虽然可以使用DMA对数据进行传输, 但是采集传输完成,其他外设或者主线程是需要知道是否采集完成,才能使用这个数据的。
如果我们设置好了传输完成中断,就可以实现了。
在STM32F7中文参考手册中,有关于EOC的介绍:
在这里插入图片描述
EOC有以下取值:

/**
  * @}
  */ 

  /** @defgroup ADC_EOCSelection ADC EOC Selection
  * @{
  */ 
#define ADC_EOC_SEQ_CONV              ((uint32_t)0x00000000U)
#define ADC_EOC_SINGLE_CONV           ((uint32_t)0x00000001U)
#define ADC_EOC_SINGLE_SEQ_CONV       ((uint32_t)0x00000002U)  /*!< reserved for future use */

对于我们的单个ADC通道采样,使用ADC_EOC_SEQ_CONV就可以了;
对于一组多个进行采样,可以选择单通道转换完成就进入中断ADC_EOC_SEQ_CONV,也可以选择多通道转换完成进入中断ADC_EOC_SINGLE_CONV ;
至于最后一个保留值……不小心设置了一下采集出来的数据我直呼看不懂,大家就不用去试了……

在我们的STM32F7实现ADC等周期采集(定时器触发+DMA传输)上进行修改:

NVIC配置

不配置是没办法进行中断向量跳转的,这个不用解释。

	 HAL_NVIC_SetPriority(ADC_IRQn, 1, 0);
     HAL_NVIC_EnableIRQ(ADC_IRQn);

配置EOC类型

选择转换结束引发中断的源,就前面讲的两个参数根据自己的需求设置就行了。

	ADC1_Handler.Init.EOCSelection = ADC_EOC_SEQ_CONV;

使能EOC中断

在启动ADC之前,我们要打开EOC中断。

	__HAL_ADC_ENABLE_IT(&ADC1_Handler, ADC_IT_EOC );

然后编写中断服务函数,一个是自己需要做的事情,另一个就是调用HAL库对应的函数HAL_ADC_IRQHandler清除中断标志等操作。

void ADC_IRQHandler(void)
{
	printf("eoc\r\n");
  	HAL_ADC_IRQHandler(&ADC1_Handler);
}
发布了353 篇原创文章 · 获赞 81 · 访问量 24万+

猜你喜欢

转载自blog.csdn.net/qq_27508477/article/details/105668023