生活随笔
收集整理的這篇文章主要介紹了
stm32f429之多通道ADC通过DMA数据采集
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
stm32f429之多通道ADC通過DMA數據采集
原來的程序使用時stm32f103的芯片,現在給為stm32f429的芯片,查看一下幾家開發板例程,發現沒有使用adc+dma的,在網上也搜索了一下,沒找到直接可以用的,花一些時間,現在分享出來,供大家參考。
中心思想,dma循環將ADC數據存儲到指定位置,需用讀取adc數據值,直接從緩存區提取;
時間有限,直接上代碼。
DMA初始化
void MYDMA_Config(void)
{ __HAL_RCC_DMA2_CLK_ENABLE();ADC1_DMA_Handler
.Instance
=DMA2_Stream0
; ADC1_DMA_Handler
.Init
.Channel
=DMA_CHANNEL_0; ADC1_DMA_Handler
.Init
.Direction
=DMA_PERIPH_TO_MEMORY; ADC1_DMA_Handler
.Init
.PeriphInc
=DMA_PINC_DISABLE; ADC1_DMA_Handler
.Init
.MemInc
=DMA_MINC_ENABLE; ADC1_DMA_Handler
.Init
.PeriphDataAlignment
=DMA_PDATAALIGN_HALFWORD; ADC1_DMA_Handler
.Init
.MemDataAlignment
=DMA_PDATAALIGN_HALFWORD; ADC1_DMA_Handler
.Init
.Mode
=DMA_CIRCULAR; ADC1_DMA_Handler
.Init
.Priority
=DMA_PRIORITY_MEDIUM; ADC1_DMA_Handler
.Init
.FIFOMode
=DMA_FIFOMODE_DISABLE; ADC1_DMA_Handler
.Init
.FIFOThreshold
=DMA_FIFO_THRESHOLD_FULL; ADC1_DMA_Handler
.Init
.MemBurst
=DMA_MBURST_SINGLE; ADC1_DMA_Handler
.Init
.PeriphBurst
=DMA_PBURST_SINGLE; __HAL_LINKDMA(&ADC1_Handler
,DMA_Handle
,ADC1_DMA_Handler
); ADC1_DMA_Handler
.Instance
->PAR = (u32
)&ADC1->DR;ADC1_DMA_Handler
.Instance
->M0AR = (vu32
)ADC_ConvertedValue
;ADC1_DMA_Handler
.Instance
->NDTR = 8;HAL_DMA_DeInit(&ADC1_DMA_Handler
); HAL_DMA_Init(&ADC1_DMA_Handler
);HAL_DMA_Start(&ADC1_DMA_Handler
, (u32
)&ADC1->DR, (vu32
)ADC_ConvertedValue
, N*ADC_CHANNELS);
}
void MY_ADC_Init(void)
{ ADC_ChannelConfTypeDef ADC1_ChanConf
;ADC1_Handler
.Instance
=ADC1;ADC1_Handler
.Init
.ClockPrescaler
=ADC_CLOCK_SYNC_PCLK_DIV4; ADC1_Handler
.Init
.Resolution
=ADC_RESOLUTION_12B; ADC1_Handler
.Init
.DataAlign
=ADC_DATAALIGN_RIGHT; ADC1_Handler
.Init
.ScanConvMode
=ENABLE; ADC1_Handler
.Init
.EOCSelection
=DISABLE; ADC1_Handler
.Init
.ContinuousConvMode
=ENABLE; ADC1_Handler
.Init
.NbrOfConversion
=8; ADC1_Handler
.Init
.DiscontinuousConvMode
=DISABLE; ADC1_Handler
.Init
.NbrOfDiscConversion
=0; ADC1_Handler
.Init
.ExternalTrigConv
=ADC_SOFTWARE_START; ADC1_Handler
.Init
.ExternalTrigConvEdge
=ADC_EXTERNALTRIGCONVEDGE_NONE;ADC1_Handler
.Init
.DMAContinuousRequests
=ENABLE; HAL_ADC_Init(&ADC1_Handler
); ADC1_ChanConf
.Channel
= ADC_CHANNEL_8;ADC1_ChanConf
.Rank
= 1; ADC1_ChanConf
.SamplingTime
= ADC_SAMPLETIME_480CYCLES;ADC1_ChanConf
.Offset
= 0;HAL_ADC_ConfigChannel(&ADC1_Handler
, &ADC1_ChanConf
);ADC1_ChanConf
.Channel
= ADC_CHANNEL_15;ADC1_ChanConf
.Rank
= 2; ADC1_ChanConf
.SamplingTime
= ADC_SAMPLETIME_480CYCLES;ADC1_ChanConf
.Offset
= 0;HAL_ADC_ConfigChannel(&ADC1_Handler
, &ADC1_ChanConf
);ADC1_ChanConf
.Channel
= ADC_CHANNEL_14;ADC1_ChanConf
.Rank
= 3; ADC1_ChanConf
.SamplingTime
= ADC_SAMPLETIME_480CYCLES;ADC1_ChanConf
.Offset
= 0;HAL_ADC_ConfigChannel(&ADC1_Handler
, &ADC1_ChanConf
);ADC1_ChanConf
.Channel
= ADC_CHANNEL_7;ADC1_ChanConf
.Rank
= 4; ADC1_ChanConf
.SamplingTime
= ADC_SAMPLETIME_480CYCLES;ADC1_ChanConf
.Offset
= 0;HAL_ADC_ConfigChannel(&ADC1_Handler
, &ADC1_ChanConf
);ADC1_ChanConf
.Channel
= ADC_CHANNEL_6;ADC1_ChanConf
.Rank
= 5; ADC1_ChanConf
.SamplingTime
= ADC_SAMPLETIME_480CYCLES;ADC1_ChanConf
.Offset
= 0;HAL_ADC_ConfigChannel(&ADC1_Handler
, &ADC1_ChanConf
);ADC1_ChanConf
.Channel
= ADC_CHANNEL_3;ADC1_ChanConf
.Rank
= 6; ADC1_ChanConf
.SamplingTime
= ADC_SAMPLETIME_480CYCLES;ADC1_ChanConf
.Offset
= 0;HAL_ADC_ConfigChannel(&ADC1_Handler
, &ADC1_ChanConf
);ADC1_ChanConf
.Channel
= ADC_CHANNEL_9;ADC1_ChanConf
.Rank
= 7; ADC1_ChanConf
.SamplingTime
= ADC_SAMPLETIME_480CYCLES;ADC1_ChanConf
.Offset
= 0;HAL_ADC_ConfigChannel(&ADC1_Handler
, &ADC1_ChanConf
);ADC1_ChanConf
.Channel
= ADC_CHANNEL_5;ADC1_ChanConf
.Rank
= 8; ADC1_ChanConf
.SamplingTime
= ADC_SAMPLETIME_480CYCLES;ADC1_ChanConf
.Offset
= 0;HAL_ADC_ConfigChannel(&ADC1_Handler
, &ADC1_ChanConf
);
MYDMA_Config();HAL_ADC_Start_DMA(&ADC1_Handler
, (vu32
*)&ADC_ConvertedValue
, N*ADC_CHANNELS);
}
void HAL_ADC_MspInit(ADC_HandleTypeDef
* hadc
)
{GPIO_InitTypeDef GPIO_Initure
;__HAL_RCC_ADC1_CLK_ENABLE(); __HAL_RCC_GPIOA_CLK_ENABLE(); __HAL_RCC_GPIOB_CLK_ENABLE(); __HAL_RCC_GPIOC_CLK_ENABLE(); GPIO_Initure
.Pin
=GPIO_PIN_3|GPIO_PIN_6|GPIO_PIN_7|GPIO_PIN_5; GPIO_Initure
.Mode
=GPIO_MODE_ANALOG; GPIO_Initure
.Pull
=GPIO_NOPULL; HAL_GPIO_Init(GPIOA,&GPIO_Initure
);GPIO_Initure
.Pin
=GPIO_PIN_0|GPIO_PIN_1; HAL_GPIO_Init(GPIOB,&GPIO_Initure
);GPIO_Initure
.Pin
=GPIO_PIN_4|GPIO_PIN_5; HAL_GPIO_Init(GPIOB,&GPIO_Initure
);
}
uint16
getADC_CH(uint8 channel
){u16 tbuf
[N];__IO u32 tdat
=0;u8 ti
;if(channel
>=ADC_CHANNELS){return 0;}for(ti
=0;ti
<N;ti
++){tbuf
[ti
]=ADC_ConvertedValue
[ti
][channel
];}bubbleSort(tbuf
, N);for(ti
=25;ti
<(N-25);ti
++){tdat
+=tbuf
[ti
];}tdat
/=50;if(tdat
<5){tdat
=0;}return tdat
;
}
源碼下載 https://download.csdn.net/download/wangluo515/14158061
改程序已經在正點原子開發板上驗證;
默認每通道開了100個緩存空間。
總結
以上是生活随笔為你收集整理的stm32f429之多通道ADC通过DMA数据采集的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。