OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5256|回复: 5

同时使用ADC的DMA和非DMA的疑问

[复制链接]

8

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
161
金钱
161
注册时间
2014-7-30
在线时间
22 小时
发表于 2014-12-5 20:26:25 | 显示全部楼层 |阅读模式
5金钱
原子哥, 小弟愚钝,理解能力差,碰到几个疑问。我想使用多路ADC,其中几路不用DMA,其他的用DMA。假设,使用ADC1的CH1、CH2、CH3,CH1使用DMA1传输,CH2和CH3不用:
1:这样可以吗?
2:如果可以的话,那么开启ADC1的DMA1,是不是CH1、CH2、CH3都会被DMA1传输

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

2170

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
5782
金钱
5782
注册时间
2013-11-22
在线时间
1212 小时
发表于 2014-12-5 21:30:40 | 显示全部楼层
这样啊    试一下  添加一个ADC中断   在中断里 使能或失能 ADCDMA(ADC_DMACmd(ADC1, ENABLE);)
比如ch1 用DMA  ch2 ch3不用DMA     设置一个变量记录当前要转换的通道
先开启ADCDMA (当然DMA部分也要配置好)  等ch1 转换完成  然后触发DMA搬运   同时产生中断  这时你在中断里判断下一个转换要不要用DMA
要用DMA  使能 ADCDMA  否则失能 ADCDMA

额  好像有点复杂了    还是都用DMA吧    到时候需要的数据直接从内存里(一般是用一个数组存放)取
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-12-5 22:49:40 | 显示全部楼层
建议:
adc1负责通道CH1,开DMA
adc2负责通道CH2,CH3,不用dma
这样,最方便了。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

8

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
161
金钱
161
注册时间
2014-7-30
在线时间
22 小时
 楼主| 发表于 2014-12-6 17:29:53 | 显示全部楼层
原子哥,先抛开这个ADC的。我把你配置的DMA改了下,你看看可以这样使用不。用的时候,调用MYDMA_Enable可行不。

回复

使用道具 举报

8

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
161
金钱
161
注册时间
2014-7-30
在线时间
22 小时
 楼主| 发表于 2014-12-6 22:20:50 | 显示全部楼层
回复【3楼】正点原子:
---------------------------------
DMA_InitTypeDef DMA_InitStructure;

u16 DMA1_MEM_LEN;//保存DMA每次数据传送的长度      
//DMA1的各通道配置
//这里的传输形式是固定的,这点要根据不同的情况来修改
//从存储器->外设模式/8位数据宽度/存储器增量模式
//DMA_CHxMA通道CHx
//cpar:外设地址
//cmar:存储器地址
//cndtr:数据传输量 
void MYDMA_Config(DMA_Channel_TypeDef* DMA_CHx)
{
  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE); //使能DMA传输

    DMA_DeInit(DMA_CHx);   //将DMA的通道1寄存器重设为缺省值
//DMA1_MEM_LEN=cndtr;
//DMA_InitStructure.DMA_PeripheralBaseAddr = cpar;  //DMA外设ADC基地址
//DMA_InitStructure.DMA_MemoryBaseAddr = cmar;  //DMA内存基地址
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;  //数据传输方向,从内存读取发送到外设
//DMA_InitStructure.DMA_BufferSize = cndtr;  //DMA通道的DMA缓存的大小
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;  //外设地址寄存器不变
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;  //内存地址寄存器递增
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;  //数据宽度为8位
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte; //数据宽度为8位
DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;  //工作在正常缓存模式
DMA_InitStructure.DMA_Priority = DMA_Priority_Medium; //DMA通道 x拥有中优先级 
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;  //DMA通道x没有设置为内存到内存传输
DMA_Init(DMA_CHx, &DMA_InitStructure);  //根据DMA_InitStruct中指定的参数初始化DMA的通道USART1_Tx_DMA_Channel所标识的寄存器
  

//开启一次DMA传输
void MYDMA_Enable(DMA_Channel_TypeDef*DMA_CHx,u32 cpar,u32 cmar,u16 cndtr)

DMA_Cmd(DMA_CHx, DISABLE );  //关闭USART1 TX DMA1 所指示的通道  
DMA_InitStructure.DMA_PeripheralBaseAddr = cpar;  //DMA外设ADC基地址
DMA_InitStructure.DMA_MemoryBaseAddr = cmar;  //DMA内存基地址    
DMA_InitStructure.DMA_BufferSize = cndtr;  //DMA通道的DMA缓存的大小
  //DMA_SetCurrDataCounter(DMA1_Channel4,DMA1_MEM_LEN);//DMA通道的DMA缓存的大小
  DMA_Cmd(DMA_CHx, ENABLE);  //使能USART1 TX DMA1 所指示的通道 
}   

原子哥,先抛开这个ADC的。我把你配置的DMA改了下,你看看可以这样使用不。用的时候,调用MYDMA_Enable可行不
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-12-7 00:01:30 | 显示全部楼层
回复【5楼】转身世外:
---------------------------------
试试就知道了
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-28 04:20

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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