急救呀!stm32f103cb,双ADC模式,同时规则模式,如何配置ADC2?
请各位帮我看看,我如下设置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?
你采集的是什么东西?建议你从串口打印出来看看。:DRE:急救呀!stm32f103cb,双ADC模式,同时规则模式,如何配置ADC2?
首先,确定ADC采集的精度是多少?然后就知道你采集的结果最大值是多少了。回复:急救呀!stm32f103cb,双ADC模式,同时规则模式,如何配置ADC2?
回复第 3 楼 于2012-12-20 09:31:08发表:首先,确定ADC采集的精度是多少?然后就知道你采集的结果最大值是多少了。
ADC2下的转换通道的内容是0(通道输入的模拟量不是零V,读出的都是0),即使精度不好,起码也得有数据。
只有ADC1能读出数据
RE:急救呀!stm32f103cb,双ADC模式,同时规则模式,如何配置ADC2?
如果把ADC双模式,改成ADC独立模式,循环扫描所设置的通道时,所设置的通道都能采集出数据来,但到改为双ADC模式后只能读出ADC1下通道的数据来。回复:急救呀!stm32f103cb,双ADC模式,同时规则模式,如何配置ADC2?
看看:) zdhrlj 发表于 2012-12-20 10:43如果把ADC双模式,改成ADC独立模式,循环扫描所设置的通道时,所设置的通道都能采集出数据来,但到改为双AD ...
一样的问题,不知道咋办,能解决吗? 可以试试直接读取ADC1->DR的数据,最近也遇到这问题,好像出在DMA上。 刚刚碰到这个情况,需要在 ADC_SoftwareStartConvCmd(ADC1, ENABLE); 这句前面加上ADC_ExternalTrigConvCmd(ADC2, ENABLE);就可以了 楼主知道是什么问题了吗?我也遇到了相同的情况,能不能讲解一下呢?
页:
[1]