微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > STM32 八路AD转换用DMA传输调试成功,DMA传输不错位

STM32 八路AD转换用DMA传输调试成功,DMA传输不错位

时间:11-23 来源:互联网 点击:

ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; // ADC1和ADC2工作在独立模式 ;
ADC_InitStructure.ADC_ScanConvMode = ENABLE; // 模数转换工作在扫描模式(多通道)模式 ;
ADC_InitStructure.ADC_ContinuousConvMode = ENABLE; // 模数转换工作在连续模式 ;
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;// 转换由软件而不是外部触发

//启动 ;
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; // ADC数据右对齐 ;
//八个通道转换时下面赋值为8(相当于开启通道的数目)
ADC_InitStructure.ADC_NbrOfChannel = M; // 顺序进行规则转换的ADC通道的数目 8 ;
ADC_Init(ADC1, &ADC_InitStructure);

//下面设置指定的ADC规则通道,一共需要设置8个

// 设置指定ADC的规则组通道8-15,设置它们的转化顺序和采样时间为55.5周期;
ADC_RegularChannelConfig(ADC1, ADC_Channel_8, 1, ADC_SampleTime_55Cycles5);
ADC_RegularChannelConfig(ADC1, ADC_Channel_9, 2, ADC_SampleTime_55Cycles5);
ADC_RegularChannelConfig(ADC1, ADC_Channel_10, 3, ADC_SampleTime_55Cycles5);
ADC_RegularChannelConfig(ADC1, ADC_Channel_11, 4, ADC_SampleTime_55Cycles5);
ADC_RegularChannelConfig(ADC1, ADC_Channel_12, 5, ADC_SampleTime_55Cycles5);
ADC_RegularChannelConfig(ADC1, ADC_Channel_13, 6, ADC_SampleTime_55Cycles5);
ADC_RegularChannelConfig(ADC1, ADC_Channel_14, 7, ADC_SampleTime_55Cycles5);
ADC_RegularChannelConfig(ADC1, ADC_Channel_15, 8, ADC_SampleTime_55Cycles5);

ADC_DMACmd(ADC1, ENABLE); // 使能指定的ADC的DMA请求 ;
ADC_Cmd(ADC1, ENABLE); // 使能指定的ADC ;

ADC_ResetCalibration(ADC1);// 重置指定的ADC的校准寄存器 ;
while(ADC_GetResetCalibrationStatus(ADC1)); // 获取ADC重置校准寄存器的状态 ;

ADC_StartCalibration(ADC1); // 开始指定ADC的校准程序 ;
while(ADC_GetCalibrationStatus(ADC1)); // 获取指定ADC的校准状态 ;
ADC_SoftwareStartConvCmd(ADC1, ENABLE);// 使能指定的ADC的软件转换启动功能 ;
}

void DMA_cfg(void)
{
DMA_InitTypeDef DMA_InitStructure;

DMA_DeInit(DMA1_Channel1);
DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address;


DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)&AD_Value; //上面这句很显然是DMA要连接在Memory

//中变量的地址,
//AD_Value是我自己在memory中定义的一个变量数组;

DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC; //这里设置的是单向传输,如果需要双向传输:
//把DMA_DIR_PeripheralSRC改成

//DMA_DIR_PeripheralDST即可。

//转换通道为M,每组转换N次
DMA_InitStructure.DMA_BufferSize = M*N;//上面的这句是设置DMA在传输时缓冲区的长度,前面有定义过了

//buffer的起始地址:ADC1_DR_Address ,为了安全性和可靠性,一

//般需要给buffer定义
//一个储存片区,这个参数的单位有三种类型:Byte、HalfWord、word,
//我设置的2个half-word(见下面的设置);32位的MCU中1个half-word占16 bits。

DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;

//上面的这句是设置DMA的外设递增模式,如果DMA
//选用的通道(CHx)有多个外设连接,需要使用外设递增模式:
//DMA_PeripheralInc_Enable;我的例子里DMA只与ADC1建立了联系,
//所以选用DMA_PeripheralInc_Disable
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;//上面的这句是设置DMA的内存递增模式,DMA访

//问多个内存参数时,
//需要使用DMA_MemoryInc_Enable,当DMA只访问一个内存参数时,
//可设置成:DMA_MemoryInc_Disable。

DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;

//定义外设数据宽度为16位

//上面的这句是设置DMA在访问时每次操作的数据长度。

//有三种数据长度类型,前面已经讲过了,这里不在叙述。
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;//与上面雷同。在此不再说明。

DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;

//上面的这句是设置DMA的传输模式:连续不断的循环式,
//若只想访问一次后就不要访问了(或按指令操作来反问,也就是想要它访问
//的时候就访问,不要它访问的时候就停止),可以设置成通用模式:DMA_Mode_Normal

DMA_InitStructure.DMA_Priority = DMA_Priority_High;//上面的这句是设置DMA的优先级别:可以分为4级:

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top