本帖最后由 snakeemail 于 2024-10-2 20:32 编辑
1. 我的需求为: 采集1000个ADC值,然后停下。就像单片机内部ADC做DMA采集那种过程。
2. 蓝色是楼主描述的:简化一下,假设只采集1个ADC通道的结果,采集1000次
工作流程是:TIM12产生CNV信号发送给ADC,并在CNV信号下降沿产生触发信号给DMAMUX1,DMAMUX1接到触发信号后,放行1次SPI发送DMA请求,发送2个字节。发送完成后SPI硬件自动产生接收DMA请求,最终将数据转移至内存缓冲区。当然,为了安全处理数据,可以启用SPI接收DMA的硬件双缓冲功能,或通过半传输中断来实现。通过这样的设计,可以把产生的中断次数从每秒80万次降低到每秒25次,M7核心就可以随便去做任何其他事了。
疑问:这假设采样率是800KHz,那还是进80万次呀?我没理解为啥楼主说可以降到每秒25次.
3. 我的理解:
DMAMUX收到OC事件request. DMAMUX放行一次DMA请求, DMA要SPI发clk,得到AD转换结果. 这里只能得到1个ADC结果。 此后要得到第2个,需要把SPI的接收地址累加。 就是说每次外部ADC采集完毕,单片机需要进SPI DMA完成中断,累加修改DMA的src地址。
4. 看楼主后面的回复和我想的一样,是在SPI DMA完成中断里面,把数据搬走
HAL_SPI_TransmitReceive_DMA()、HAL_TIM_Start_OC(),以及在半传输完成中断和传输完成中断里靠HAL_MDMA_Start_IT()把数据搬走。 |