日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

stm32f429之多通道ADC通过DMA数据采集

發布時間:2024/3/13 编程问答 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 stm32f429之多通道ADC通过DMA数据采集 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

stm32f429之多通道ADC通過DMA數據采集

原來的程序使用時stm32f103的芯片,現在給為stm32f429的芯片,查看一下幾家開發板例程,發現沒有使用adc+dma的,在網上也搜索了一下,沒找到直接可以用的,花一些時間,現在分享出來,供大家參考。
中心思想,dma循環將ADC數據存儲到指定位置,需用讀取adc數據值,直接從緩存區提取;
時間有限,直接上代碼。

DMA初始化 void MYDMA_Config(void) { __HAL_RCC_DMA2_CLK_ENABLE();//DMA2時鐘使能 //Tx DMA配置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; //外設數據長度:16位ADC1_DMA_Handler.Init.MemDataAlignment=DMA_PDATAALIGN_HALFWORD; //存儲器數據長度:16位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); //將DMA與USART1聯系起來(發送DMA)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); } /*************************************************************************************************** *名稱: MY_ADC_Init() *描述: 配置AD轉換,使用ADC1,DMA2,轉換8個通道 *入口參數: 無 *出口參數: 無 ***************************************************************************************************/ void MY_ADC_Init(void) { ADC_ChannelConfTypeDef ADC1_ChanConf;ADC1_Handler.Instance=ADC1;ADC1_Handler.Init.ClockPrescaler=ADC_CLOCK_SYNC_PCLK_DIV4; //4分頻,ADCCLK=PCLK2/4=90/4=22.5MHZADC1_Handler.Init.Resolution=ADC_RESOLUTION_12B; //12位模式ADC1_Handler.Init.DataAlign=ADC_DATAALIGN_RIGHT; //右對齊ADC1_Handler.Init.ScanConvMode=ENABLE; //掃描模式?ADC1_Handler.Init.EOCSelection=DISABLE; //關閉EOC中斷ADC1_Handler.Init.ContinuousConvMode=ENABLE; //開啟連續轉換ADC1_Handler.Init.NbrOfConversion=8; //8個轉換在規則序列中 也就是只轉換規則序列1 ADC1_Handler.Init.DiscontinuousConvMode=DISABLE; //禁止不連續采樣模式ADC1_Handler.Init.NbrOfDiscConversion=0; //不連續采樣通道數為0ADC1_Handler.Init.ExternalTrigConv=ADC_SOFTWARE_START; //軟件觸發ADC1_Handler.Init.ExternalTrigConvEdge=ADC_EXTERNALTRIGCONVEDGE_NONE;//使用軟件觸發ADC1_Handler.Init.DMAContinuousRequests=ENABLE; //開啟DMA請求HAL_ADC_Init(&ADC1_Handler); //初始化 //轉換序列ADC1_ChanConf.Channel = ADC_CHANNEL_8;ADC1_ChanConf.Rank = 1; //第1個序列,序列1ADC1_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; //第1個序列,序列2ADC1_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; //第1個序列,序列3ADC1_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; //第1個序列,序列4ADC1_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; //第1個序列,序列5ADC1_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; //第1個序列,序列6ADC1_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; //第1個序列,序列6ADC1_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; //第1個序列,序列6ADC1_ChanConf.SamplingTime = ADC_SAMPLETIME_480CYCLES;ADC1_ChanConf.Offset = 0;HAL_ADC_ConfigChannel(&ADC1_Handler, &ADC1_ChanConf); // HAL_ADC_Start(&ADC1_Handler);MYDMA_Config();//初始化并開啟DMAHAL_ADC_Start_DMA(&ADC1_Handler, (vu32*)&ADC_ConvertedValue, N*ADC_CHANNELS); }//ADC,引腳配置,時鐘使能 //此函數會被HAL_ADC_Init()調用 //hadc:ADC句柄 void HAL_ADC_MspInit(ADC_HandleTypeDef* hadc) {GPIO_InitTypeDef GPIO_Initure;__HAL_RCC_ADC1_CLK_ENABLE(); //使能ADC1時鐘__HAL_RCC_GPIOA_CLK_ENABLE(); //開啟GPIOA時鐘__HAL_RCC_GPIOB_CLK_ENABLE(); //開啟GPIOA時鐘__HAL_RCC_GPIOC_CLK_ENABLE(); //開啟GPIOA時鐘GPIO_Initure.Pin=GPIO_PIN_3|GPIO_PIN_6|GPIO_PIN_7|GPIO_PIN_5; //PA3,6,7, 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; //PB0,1HAL_GPIO_Init(GPIOB,&GPIO_Initure);GPIO_Initure.Pin=GPIO_PIN_4|GPIO_PIN_5; //PC4,5HAL_GPIO_Init(GPIOB,&GPIO_Initure); }/*************************************************************************************************** *名稱:getAdc() *描述:讀取指定通道AD值 *入口參數:通道號channel,取值分為0到(ADC_CHANNELS-1) *出口參數:AD值 ***************************************************************************************************/ 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数据采集的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。