久芯网

STM32F205利用DMA实现多通道ADC采样,但是每启动一次转换才能更新一次结果,为什么。

avatar phyllischen12 提问时间: 2023-07-24 12:50:09 / 未解决
1、ADC配置采样12个规则通道,采用单次、扫描模式,允许DMA,配置每次转换结束都有DMA requests;
2、DMA配置的外设和内存长度都是16位,circular mode,direct mode;
3、软件SWSTART启动AD转换后,每启动一次内存中只有一次转换结果更新,要完成12次采样需要SWSTART启动12次,为什么?单次扫描不是应该启动一次就自动扫描完成12次采样,把12次结果依次存入内存吗?是我理解不对吗?求指导

如需获得 STM32F205 等器件的更多信息,请点击链接或 点击此处 联系在线客服!

12个回答
  • avatar wenyangzeng
    回答时间: 2023-07-24 13:22:56

    ADC需要配置连续扫描模式

  • avatar 一个脑子不够用
    回答时间: 2023-07-24 13:40:08

    .............

  • avatar yklstudent
    回答时间: 2023-07-24 14:10:32

    mark,签到+1

  • avatar 废鱼
    回答时间: 2023-07-24 14:35:04

    要选择连续采集模式,DMA可以控制采集长度,比如采集12次,就写入12个数据长度即可。当采集够12次后,他会自动产生完成中断状态。

  • avatar butterflyspring
    回答时间: 2023-07-24 14:55:23

    楼主检查一下memory的部分有没有设置 地址增加模式,否则有可能就一个地址不停的写数据,只有一次结果。

  • avatar butterflyspring
    回答时间: 2023-07-24 15:21:34

    楼主检查一下memory的部分有没有设置 地址增加模式,否则有可能就一个地址不停的写数据,只有一次结果。

  • avatar phyllischen12
    回答时间: 2023-07-24 15:47:12

    谢谢大家的回复;1、memory的地址设置了递增模式; 2、ADC配置改为连续、扫描模式后,启动ADC后memory里能够得到转换的12通道结果;然后需要重置ADC1->CR2里的DMA位->0->1,就能得到更新的12次新的转换结果(发现只有不停重置DMA位才能不停更新memory); 3、但是有一个新的疑问:ADC连续模式的话,也就是说,在第一次转换完12通道,还没有重置ADC1->CR2里的DMA位之前,实际上ADC也在不停的转换,ADC的data寄存器是在不停刷新结果的,只是没有更新到memory里,那么后面会不会导致memory里存放的结果的顺序错乱,比如第一次启动ADC,memory[0]里存放的是ADC第一通道的结果,然后ADC在连续转换,再然后重置DMA位,得到第二次采样转换结果,这个时候ADC可能在转换第二通道的结果,那么memory[0]里存放的就可能是第二通道的结果,毕竟因为ADC一直在工作,不确定重置DMA位与ADC转换的时序一定正确?

  • avatar phyllischen12
    回答时间: 2023-07-24 16:03:52

    补充一下之前的疑惑(前面可能没描述清楚):在第一轮转换12通道的过程中,12次转换依次更新memory,假设memory[0]里存放的是第一通道的采样转换结果 ;12通道结束后进入中断处理(但是同时ADC连续模式会继续转换进入第二轮采样转换),重置ADC1->CR2里的DMA位,然后ADC的转换结果再依次存入memory,但是此时并不确定ADC正在转换第几通道,那么memory[0]里存放的新结果就可能不是第一通道的结果,而是其他通道结果,毕竟因为ADC一直在工作,不确定重置DMA位一定在第一通道转换结束前?(不知道我这个疑惑对不对)

  • avatar phyllischen12
    回答时间: 2023-07-24 16:22:43
    butterflyspring 发表于 2022-7-12 11:03
    楼主检查一下memory的部分有没有设置 地址增加模式,否则有可能就一个地址不停的写数据,只有一次结果。 ...

    memory的地址设置了递增模式;

  • avatar phyllischen12
    回答时间: 2023-07-24 16:42:40
    废鱼 发表于 2022-7-12 08:37
    要选择连续采集模式,DMA可以控制采集长度,比如采集12次,就写入12个数据长度即可。当采集够12次后,他会 ...

    2、ADC配置改为连续、扫描模式后,启动ADC后memory里能够得到转换的12通道结果;然后需要重置ADC1->CR2里的DMA位->0->1,就能得到更新的12次新的转换结果(发现只有不停重置DMA位才能不停更新memory); 3、但是有一个新的疑问:ADC连续模式的话,也就是说,在第一次转换完12通道,还没有重置ADC1->CR2里的DMA位之前,实际上ADC也在不停的转换,ADC的data寄存器是在不停刷新结果的,只是没有更新到memory里,那么后面会不会导致memory里存放的结果的顺序错乱,比如第一次启动ADC,memory[0]里存放的是ADC第一通道的结果,然后ADC在连续转换,再然后重置DMA位,得到第二次采样转换结果,这个时候ADC可能在转换第二通道的结果,那么memory[0]里存放的就可能是第二通道的结果,毕竟因为ADC一直在工作,不确定重置DMA位与ADC转换的时序一定正确?

  • avatar phyllischen12
    回答时间: 2023-07-24 17:09:35
    wenyangzeng 发表于 2022-7-11 19:59
    ADC需要配置连续扫描模式

    但是我看文档上说单次扫描就是启动一次就能扫描ADC1->SQR1里配置的通道数量啊?我理解不对吗?

  • avatar phyllischen12
    回答时间: 2023-07-24 17:27:31

    已解决

会员中心 微信客服
客服
回到顶部