论坛元老
 
- 积分
- 3340
- 金钱
- 3340
- 注册时间
- 2013-4-10
- 在线时间
- 333 小时
|
发表于 2016-1-26 18:14:12
|
显示全部楼层
你得先定义一个数组, 然后指向这个数组的首地址就行了
传输完成是你先定义一次传送多少个位,DMA转完你指定的数量后,会开启中断,你在DMA中断里处理你需要的数据就行了
比如: u32 ADC_Buf[ADC_SIZE]; //这个存放ADC转换后的值
以下是DMA配置函数
/********************************************************************************************
函 数 名: DMA1 配置函数
调 用: MYDMA_Config(DMA_Channel_TypeDef* DMA_CHx,u32 cpar,u32 cmar,u16 cndtr)
参 数: *DMA DMA 结构数据指针
cpar:外设地址
cmar:存储器地址
cndtr:数据传输量
返 回 值: 无
********************************************************************************************/
void MYDMA_Config(DMA_Channel_TypeDef* DMA_CHx,u32 cpar,u32 cmar,u16 cndtr)
{
RCC->AHBENR |= 1<<0; //开启DMA1时钟,使能DMA传输
DMA1->IFCR = 0x0000000F; //将DMA的通道1寄存器重设为缺省值
DMA_CHx->CCR |= 1<<5; //使能连续模式
DMA_CHx->CCR |= 1<<7; //使能存储器增量模式
DMA_CHx->CCR |= 2<<8; //外设数据宽度为32位
DMA_CHx->CCR |= 2<<10; //存储器数据宽度32位
DMA_CHx->CCR |= 2<<12; //高等优先级
DMA_CHx->CPAR = cpar; //DMA1 外设地址
DMA_CHx->CMAR = (u32)cmar; //DMA1,存储器地址
DMA_CHx->CNDTR = cndtr; //DMA1,传输数据量
DMA_CHx->CCR |= 1<<0; //使能ADC TX DMA1 所指示的通道
delay_ms(5); //等待DMA时钟稳定
adc1_byte.FangXiang = 0; //方向
adc1_byte.JiShuQi = 0; //计数器
adc1_byte.XiShu = 128; //滤波系数
adc2_byte.FangXiang = 0; //方向
adc2_byte.JiShuQi = 0; //计数器
adc2_byte.XiShu = 128; //滤波系数
MY_NVIC_Init(3,2,DMA1_Channel1_IRQn,4);//配置DMA中断配置
DMA_CHx->CCR |= 1<<1; //使能传输完成中断
}
这样调用就行了 MYDMA_Config(DMA1_Channel1,(u32)&ADC1->DR,(u32)ADC_Buf,ADC_SIZE);//DMA1通道设置
ADC1->DR 是内是要读到的地址
ADC_Buf,是目的地址
ADC_SIZE 是每次传送的数量
|
|