请各位帮我看看,我如下设置DMA及ADC后,DMA 32位DR数据到内存中,为什么只有低字节有数据,高字节全是零?
到底是那个地方有问题?请求帮助!!
void DMA_Configura
tion(void)
{
DMA_InitTypeDef DMA_InitStructure;
//DMA1 channel1 configuration ----------------------------------------------
DMA_DeInit(DMA1_Channel1);//将DMA1的通道1重新设置为缺省值
DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)ADC1_DR_Address;//定义DMA外设基地址
DMA_InitStructure.DMA_MemoryBaseAddr = (u32)&ADCValue;//定义DMA内存基地址
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;//规定外设是作为数据传输的目的地还是来源。DST=目的地/SRC=来源
DMA_InitStructure.DMA_BufferSize = 6;//定义指定DMA通道的DMA缓存的大小,单位为数据单位。
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;//设定外设地址寄存器递增与否。Enable=外设地址寄存器递增/Disable=外设地址寄存器不变
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;//设定内存地址寄存器递增与否。Enable=内存地址寄存器递增/Disable=内存地址寄存器不变
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Word;//设定外设数据宽度。Byte=8位/HalfWord=16位/Word=32位
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Word;////设定内存数据宽度。Byte=8位/HalfWord=16位/Word=32位
DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;//设置DMA的CAN的工作模式。Circular=工作在循环缓存模式/Normal=工作在正常缓存模式
DMA_InitStructure.DMA_Priority = DMA_Priority_High;//设置DMA通道的软件优先级。VeryHigh=非常高优先级 High=高优先级 Medium中优先级 Low低优先级
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;//设置DMA通道的内存到内存传输。Enable=通道设置为内存到内存传输/Disable=通道没有设置为内存到内存传输
DMA_Init(DMA1_Channel1, &DMA_InitStructure);//
// Enable DMA1 channel1
DMA_Cmd(DMA1_Channel1, ENABLE);//使能或者失能指定的DMA通道。使能DMA1的通道1
while(DMA_GetFlagStatus(DMA1_FLAG_TC1));
}
void ADC_Configuration(void)
{
ADC_InitTypeDef ADC_InitStructure;
/*ADC1设置*/
ADC_DeInit(ADC1);//复位
/* ADC1 configuration ------------------------------------------------------*/
ADC_InitStructure.ADC_Mode = ADC_Mode_RegSimult;//设置ADC工作在独立或者双ADC模式。ADC_Mode_Independent独立模式;ADC_Mode_RegSimult双模式
ADC_InitStructure.ADC_ScanConvMode = ENABLE;//ENABLE模数转换工作在扫描模式(多通道);DISABLE模数转换工作在单次(单通道)模式。
ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;//ENABLE连续转换模式;DISABLE单次转换模式
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;//设置外部触发来启动规则通道的模数转换。_None转换由软件而不是外部触发启动
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;//设置ADC数据左/右边对齐。_Right数据右边对齐 _Left数据左对齐
ADC_InitStructure.ADC_NbrOfChannel = 2;//设置顺序进行规则转换的ADC通道的数目。取值范围1到16
ADC_Init(ADC1, &ADC_InitStructure);//。在调用完ADC_InitStructure后必须调用ADC_RegularChannelConfig()来配置每个所使用通道的转换次序和采样时间
/* ADC1 regular channel_0 configuration */
ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_239Cycles5);//设置指定ADC的规则组通道,设置它们的转化顺序和采样时间
/* ADC1 regular channel_1 configuration */
ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 2, ADC_SampleTime_239Cycles5);//设置指定ADC的规则组通道,设置它们的转化顺序和采样时间
/* Enable ADC1 DMA */
ADC_DMACmd(ADC1, ENABLE);//使能或失能指定的ADC的DMA请求。
/*ADC2设置*/
ADC_DeInit(ADC2);//复位
/* ADC1 configuration ------------------------------------------------------*/
ADC_InitStructure.ADC_Mode = ADC_Mode_RegSimult;//设置ADC工作在独立或者双ADC模式。ADC_Mode_Independent独立模式;ADC_Mode_RegSimult双模式
ADC_InitStructure.ADC_ScanConvMode = ENABLE;//ENABLE模数转换工作在扫描模式(多通道);DISABLE模数转换工作在单次(单通道)模式。
ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;//ENABLE连续转换模式;DISABLE单次转换模式
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;//设置外部触发来启动规则通道的模数转换。_None转换由软件而不是外部触发启动
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;//设置ADC数据左/右边对齐。_Right数据右边对齐 _Left数据左对齐
ADC_InitStructure.ADC_NbrOfChannel = 2;//设置顺序进行规则转换的ADC通道的数目。取值范围1到16
ADC_Init(ADC2, &ADC_InitStructure);//。在调用完ADC_InitStructure后必须调用ADC_RegularChannelConfig()来配置每个所使用通道的转换次序和采样时间
/* ADC2 regular channel_8 configuration */
ADC_RegularChannelConfig(ADC2, ADC_Channel_8, 1, ADC_SampleTime_239Cycles5);//设置指定ADC的规则组通道,设置它们的转化顺序和采样时间
/* ADC2 regular channel_9 configuration */
ADC_RegularChannelConfig(ADC2, ADC_Channel_9, 2, ADC_SampleTime_239Cycles5);//设置指定ADC的规则组通道,设置它们的转化顺序和采样时间
ADC_ExternalTrigConvCmd(ADC2, ENABLE);
/* Enable ADC1 */
ADC_Cmd(ADC1, ENABLE);//使能或失能指定的ADC。
/* Enable ADC1 reset calibaration register */
ADC_ResetCalibration(ADC1);//重置指定的ADC的校准寄存器。1=初始化校准寄存器
/* Check the end of ADC1 reset calibration register */
while(ADC_GetResetCalibrationStatus(ADC1));//获取ADC重置校准寄存器的状态。0=校准寄存器已初始化
/* Start ADC1 calibaration */
ADC_StartCalibration(ADC1);//指定ADC的A/D校准。1=开始校准
/* Check the end of ADC1 calibration */
while(ADC_GetCalibrationStatus(ADC1));//获取指定的ADC校准状态。0=校准完成
/* Enable ADC2 */
ADC_Cmd(ADC2, ENABLE);//使能或失能指定的ADC。
/* Enable ADC2 reset calibaration register */
ADC_ResetCalibration(ADC2);//重置指定的ADC的校准寄存器。1=初始化校准寄存器
/* Check the end of ADC2 reset calibration register */
while(ADC_GetResetCalibrationStatus(ADC2));//获取ADC重置校准寄存器的状态。0=校准寄存器已初始化
/* Start ADC2 calibaration */
ADC_StartCalibration(ADC2);//指定ADC的A/D校准。1=开始校准
/* Check the end of ADC2 calibration */
while(ADC_GetCalibrationStatus(ADC2));//获取指定的ADC校准状态。0=校准完成
/* Start ADC1 Software Conversion */
ADC_SoftwareStartConvCmd(ADC1, ENABLE);//ENABLE使能或者失能指定的ADC的软件转换启动功能。开始转换规则通道。
}
一周热门 更多>