stm32F4 多路ADC 之七路ADC(双重ADC 多通道)(DMA)

stm32F4 多路ADC 之七路ADC(双重ADC 多通道)(DMA)

上来就说要点
一般设置都没什么问题
就是这个7,
要是6或8(偶数)多好
因为双重ADC,不是把数据都放到ADC1->DR 和ADC2->DR 里,而是放在ADC->CDR里,那两个都是16位滴,这个是32位滴。低16位ADC1,高16位ADC2。

这也不算啥,如果是6或8(偶数),一般人看到这应该就能解决大多数问题了。然而这是个7(我用的ADC1的三个和ADC2的四个),然后DMA循环模式传输,最开始自己定义了一个ADC_VAL[7]数组存放数据。
看到这,如果你没疑惑,恭喜你,你可能就卡在这卡死几天(比如我,7个通道不就应该数组长度7吗?)。
那应该有什么疑惑呢,ADC->CDR是32位滴,你的数组应该是偶数才行,要不然数据就会错位,拿一个数据举例,就是它会像爬楼梯一样,向上走,走完,再爬一边楼梯。
所以应该定义ADC_VAL[8],看着这,剩下的问题一般人都能自己解决了。
转载请注明出处,尊敬一下我滴头发

多写点吧

DMA

	DMA_InitStructure.DMA_PeripheralBaseAddr = RHEOSTAT_ADC_CDR_ADDR;	
	//#define RHEOSTAT_ADC_CDR_ADDR    ((uint32_t)0x40012308)
	//手册里有,不明白的可以自己算
	DMA_InitStructure.DMA_BufferSize = 8;	
	//7路记得写8
	  // // 外设数据大小为半字,即两个字节 
	DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord; 
  //	存储器数据大小也为半字,跟外设数据大小相同
	DMA_InitStructure.DMA_MemoryDataSize = DMA_PeripheralDataSize_HalfWord;	
	// 循环传输模式 DMA_Mode_Normal DMA_Mode_Circular
	DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;

ADC

	// 双重ADC模式
  ADC_CommonInitStructure.ADC_Mode = ADC_DualMode_RegSimult;
  // 时钟为fpclk x分频	
  ADC_CommonInitStructure.ADC_Prescaler = ADC_Prescaler_Div4;
//这里提一下原子说不能超过36m,但是官方例子写的是
//  ADC_CommonInitStructure.ADC_Prescaler = ADC_Prescaler_Div2;
//不知道是原子错了,还是官方例子没注意
  // 禁止DMA直接访问模式	
  ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_1;
    // 扫描模式,多通道采集
  ADC_InitStructure.ADC_ScanConvMode = ENABLE; 
  // 连续转换	
  ADC_InitStructure.ADC_ContinuousConvMode = ENABLE; 


  ADC_InitStructure.ADC_NbrOfConversion = 4;
  ADC_Init(RHEOSTAT_ADC1, &ADC_InitStructure);	
  ADC_RegularChannelConfig(RHEOSTAT_ADC1, RHEOSTAT_ADC_CHANNEL1, 1, ADC_SampleTime_3Cycles);   
	ADC_RegularChannelConfig(RHEOSTAT_ADC1, ADC_Channel_5, 2, ADC_SampleTime_3Cycles);   
	ADC_RegularChannelConfig(RHEOSTAT_ADC1, ADC_Channel_7, 3, ADC_SampleTime_3Cycles); 

	  ADC_InitStructure.ADC_NbrOfConversion = 4;
	ADC_Init(RHEOSTAT_ADC2, &ADC_InitStructure);
  ADC_RegularChannelConfig(RHEOSTAT_ADC2, RHEOSTAT_ADC_CHANNEL2, 1, ADC_SampleTime_3Cycles);   
	ADC_RegularChannelConfig(RHEOSTAT_ADC2,  ADC_Channel_11, 2, ADC_SampleTime_3Cycles);   
	ADC_RegularChannelConfig(RHEOSTAT_ADC2,  ADC_Channel_12, 3, ADC_SampleTime_3Cycles);   
	ADC_RegularChannelConfig(RHEOSTAT_ADC2,  ADC_Channel_14, 4, ADC_SampleTime_3Cycles);   


  // 使能DMA请求 after last transfer (multi-ADC mode)
  ADC_MultiModeDMARequestAfterLastTransferCmd(ENABLE);
// 使能ADC DMA
  ADC_DMACmd(RHEOSTAT_ADC1, ENABLE);
	  ADC_DMACmd(RHEOSTAT_ADC2, ENABLE);
  // 使能ADC
  ADC_Cmd(RHEOSTAT_ADC1, ENABLE);  
	
  ADC_Cmd(RHEOSTAT_ADC2, ENABLE);   
  
  //开始adc转换,软件触发
  ADC_SoftwareStartConv(RHEOSTAT_ADC1);
  //ADC_SoftwareStartConv(RHEOSTAT_ADC2);

LCD_ShowxNum(150,Y1,adcx[0]-7000,8,16,0);
//这个东西不能显示小数,负数

你可能感兴趣的:(stm32)