|
使用DMA来传输ADC数据,出现两个数据合并,同时造成后面的数据是0的问题。考虑到后面想用W5500传输,所以改成ADC为8位的,但是这个缓存区只能是32位的,想请问大家有什么好办法?
数据不对齐
部分函数如下:
uint32_t g_adc3_dma_data1[ADC_DATA_LENGTH];//定义adc3采集数据存放数组
HAL_ADC_Start_DMA(&hadc3, g_adc3_dma_data1,ADC_DATA_LENGTH);//ADC的dma开始采集
有一个问题就是这个函数里面的变量只能是32的,
if(g_adc3_dma_complete_flag == 1)//采集数据没完成,采集完成后再发送 111
{
for(i=0;i<2048;i++)
{
printf("%d\r\n",g_adc3_dma_data1&0x0000ffff);取低16位
}
g_adc3_dma_complete_flag = 0;
memset(g_adc3_dma_data1,0,ADC_DATA_LENGTH);//清除数据
HAL_ADC_Start_DMA(&hadc3, g_adc3_dma_data1,ADC_DATA_LENGTH);//ADC的dma开始采集
}
}
这是DMA的配置:
hdma_adc3.Init.Direction = DMA_PERIPH_TO_MEMORY;
hdma_adc3.Init.PeriphInc = DMA_PINC_DISABLE;
hdma_adc3.Init.MemInc = DMA_MINC_ENABLE;
hdma_adc3.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD;
hdma_adc3.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD;
这是ADC的配置:
hadc3.Instance = ADC3;
hadc3.Init.Resolution = ADC_RESOLUTION_16B;
hadc3.Init.ScanConvMode = ADC_SCAN_DISABLE;
hadc3.Init.EOCSelection = ADC_EOC_SINGLE_CONV;
hadc3.Init.LowPowerAutoWait = DISABLE;
hadc3.Init.ContinuousConvMode = ENABLE;
hadc3.Init.NbrOfConversion = 1;
hadc3.Init.DiscontinuousConvMode = DISABLE;
hadc3.Init.ExternalTrigConv = ADC_SOFTWARE_START;
hadc3.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;
hadc3.Init.ConversionDataManagement = ADC_CONVERSIONDATA_DMA_ONESHOT;
hadc3.Init.Overrun = ADC_OVR_DATA_OVERWRITTEN;
hadc3.Init.LeftBitShift = ADC_LEFTBITSHIFT_NONE;
|
|