野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 29177|回复: 6

ADC的DMA和中断问题

[复制链接]
发表于 2021-4-24 17:36:43 | 显示全部楼层 |阅读模式
我用ADC1的一个通道采集数据放进一个数组里(存储器地址递增),同时使能了DMA和中断,DMA的缓冲区为数组大小,那么中断是在采集完数组大小个数据之后发生还是在采集一次之后发生,如果是采集一次就发生中断,那怎么配置让它采集完数组大小个数据之后才发生中断
回复

使用道具 举报

发表于 2021-6-22 14:01:31 | 显示全部楼层
楼主代码运行成功了吗,我也在写ADC用DMA搬运至数组的代码,设了存储地址递增,但调试发现只能搬到数组的第一位,相当于存储地址固定的情况
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-6-23 09:20:28 | 显示全部楼层
RAYw 发表于 2021-6-22 14:01
楼主代码运行成功了吗,我也在写ADC用DMA搬运至数组的代码,设了存储地址递增,但调试发现只能搬到数组的第 ...

你的问题我不清楚,感觉像配置问题,我的问题我解决了,就是配置DMA的中断,而不是ADC的中断,这样就可以在DMA采集完一次后才进行处理
回复 支持 反对

使用道具 举报

发表于 2021-6-23 10:48:39 | 显示全部楼层
何小峰 发表于 2021-6-23 09:20
你的问题我不清楚,感觉像配置问题,我的问题我解决了,就是配置DMA的中断,而不是ADC的中断,这样就可以 ...

地址递增的配置应该只有就是DMA_MemoryInc_Enable相关的吧,楼主有空可以帮忙看看我的DMA配置代码吗?希望传输的时候存储地址能更新,但一直是固定的,调了好久了,还是不知道问题在哪
  1. void dma_init(uint32_t ADCvalue_addr){
  2.         //使能DMA总线时钟
  3.         RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2, ENABLE);
  4.         //channel0 stream0
  5.         DMA_DeInit(DMA2_Stream0); //先失能。将DMA所有寄存器复位为未修改状态
  6.         while(DMA_GetCmdStatus(DMA2_Stream0) != DISABLE){ //确保DMA数据流复位完成
  7.         }
  8.         
  9.         DMA_InitTypeDef DMA_InitStructure;
  10.         DMA_InitStructure.DMA_Channel = DMA_Channel_0;
  11.         DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_ADDRESS;
  12.         DMA_InitStructure.DMA_Memory0BaseAddr = ADCvalue_addr; //ADCvalue_addr为j基地址
  13.         DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory;

  14.         DMA_InitStructure.DMA_BufferSize = 3;
  15.         DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; //外设地址关闭递增功能
  16.         DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; //存储地址递增使能
  17.         DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
  18.         DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
  19.         DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;  //仿照例子用循环模式,传输完数据后,重新将BufferSize填满
  20.         DMA_InitStructure.DMA_Priority = DMA_Priority_High;
  21.         DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;

  22.         DMA_Init(DMA2_Stream0, &DMA_InitStructure);
  23.         DMA_Cmd(DMA2_Stream0, ENABLE);
  24. }
复制代码


回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-6-23 14:18:53 | 显示全部楼层
没用过F4,但道理应该是一样的,首先确定ADC1是不是对应DMA2的流0,第二,应该将ADC的DR寄存器和变量地址(数组就是数组名)强制转换为无符号32位的,哪怕原来不是32位的,第三,计算要传输多少个字节,这里看你的是3*16位,应该是6个字节,看看是否符合接收的数组大小,其他没有问腿了
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-6-23 14:19:16 | 显示全部楼层
RAYw 发表于 2021-6-23 10:48
地址递增的配置应该只有就是DMA_MemoryInc_Enable相关的吧,楼主有空可以帮忙看看我的DMA配 ...


没用过F4,但道理应该是一样的,首先确定ADC1是不是对应DMA2的流0,第二,应该将ADC的DR寄存器和变量地址(数组就是数组名)强制转换为无符号32位的,哪怕原来不是32位的,第三,计算要传输多少个字节,这里看你的是3*16位,应该是6个字节,看看是否符合接收的数组大小,其他没有问腿了
回复 支持 反对

使用道具 举报

发表于 2021-6-24 21:01:37 | 显示全部楼层
何小峰 发表于 2021-6-23 14:19
没用过F4,但道理应该是一样的,首先确定ADC1是不是对应DMA2的流0,第二,应该将ADC的DR寄存器和变量地 ...

谢谢楼主
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-11-24 14:56 , Processed in 0.044030 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表