
请各位帮我看看,我如下设置DMA及ADC后,DMA 32位DR数据到内存中,为什么只有低字节有数据,高字节全是零? 到底是那个地方有问题?请求帮助!! void DMA_Configuration(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的软件转换启动功能。开始转换规则通道。 } ![]() |
RE:急救呀!stm32f103cb,双ADC模式,同时规则模式,如何配置ADC2?
RE:急救呀!stm32f103cb,双ADC模式,同时规则模式,如何配置ADC2?
回复:急救呀!stm32f103cb,双ADC模式,同时规则模式,如何配置ADC2?
首先,确定ADC采集的精度是多少?然后就知道你采集的结果最大值是多少了。
ADC2下的转换通道的内容是0(通道输入的模拟量不是零V,读出的都是0),即使精度不好,起码也得有数据。
只有ADC1能读出数据
RE:急救呀!stm32f103cb,双ADC模式,同时规则模式,如何配置ADC2?
回复:急救呀!stm32f103cb,双ADC模式,同时规则模式,如何配置ADC2?
一样的问题,不知道咋办,能解决吗?