娇小w搡bbbb搡bbb,《第一次の人妻》,中国成熟妇女毛茸茸,边啃奶头边躁狠狠躁视频免费观看

歷史上的今天

今天是:2025年01月25日(星期六)

2021年01月25日 | ADC,DMA,多路,單次/連續轉換

發布者:初入茅廬 來源: eefocus關鍵字:ADC  DMA  多路  連續轉換 手機看文章 掃描二維碼
隨時隨地手機看文章

今天回答一個朋友的問題吧,ADC如何使用DMA采集多通道模擬電壓。


1寫在前面

這個問題其實之前寫過一些相關文章,原理我之前也有相關描述。如果想要徹底弄明白其原理,建議閱讀《參考手冊》、結合標準外設庫來理解。


現在很多人習慣使用STM32CubeMX來直接生成初始化代碼,如果沒有掌握STM32CubeMX、HAL庫,使用STM32CubeMX生成的代碼,或許就不能滿足你的應用。


同時,STM32CubeMX生成的代碼,想要根據代碼進一步了解其原理,其實很難


ADC轉換一些基礎原理,我這里就不過多描述了,請直接看下面標準外設庫源碼、及后面給的注釋。


下面寫2點:ADC軟件單次觸發轉換,和連續轉換。

2ADC,DMA,單次觸發轉換

這里以ADC,使用DMA,通過軟件單次觸發轉換為例。主要需注意幾個相關參數即可。

1.GPIO配置

2.DMA配置

3.ADC配置

4.ADC單次觸發轉換

5.源代碼

/* 靜態變量 ------------------------------------------------------------------*/

static volatile uint16_t sADC_Buf[3];


/************************************************

函數名稱 : ADC_GPIO_Configuration

功    能 : ADC引腳配置

參    數 : 無

返 回 值 : 無

作    者 : strongerHuang

*************************************************/

void ADC_GPIO_Configuration(void)

{

  GPIO_InitTypeDef GPIO_InitStructure;


  /* 使能時鐘 */

  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);


  GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3;

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;                      //模擬輸入

  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ;

  GPIO_Init(GPIOA, &GPIO_InitStructure);

}


/************************************************

函數名稱 : ADC_DMA_Configuration

功    能 : ADC DMA配置

參    數 : 無

返 回 值 : 無

作    者 : strongerHuang

*************************************************/

void ADC_DMA_Configuration(void)

{

  DMA_InitTypeDef DMA_InitStructure;


  /* 使能時鐘 */

  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2, ENABLE);


  /* 配置DMA */

  DMA_InitStructure.DMA_Channel = DMA_Channel_0;

  DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)(&(ADC1->DR));//外設地址

  DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)(&sADC_Buf[0]);  //內存地址

  DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory;            //傳輸方向:外設 -> 內存

  DMA_InitStructure.DMA_BufferSize = 3;                              //傳輸長度

  DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;   //外設遞增:關閉

  DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;            //內存遞增:打開

  DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;

  DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;//數據寬度

  DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;                      //正常模式

  DMA_InitStructure.DMA_Priority = DMA_Priority_Medium;              //優先級

  DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;

  DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_HalfFull;

  DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;

  DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;

  DMA_Init(DMA2_Stream0, &DMA_InitStructure);

}


/************************************************

函數名稱 : ADC_Configuration

功    能 : ADC參數配置

參    數 : 無

返 回 值 : 無

作    者 : strongerHuang

*************************************************/

void ADC_Configuration(void)

{

  ADC_InitTypeDef       ADC_InitStructure;

  ADC_CommonInitTypeDef ADC_CommonInitStructure;


  /* 使能時鐘 */

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);


  /* ADC配置 */

  ADC_CommonInitStructure.ADC_Mode = ADC_Mode_Independent;

  ADC_CommonInitStructure.ADC_Prescaler = ADC_Prescaler_Div2;

  ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_Disabled;

  ADC_CommonInitStructure.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_5Cycles;

  ADC_CommonInit(&ADC_CommonInitStructure);


  ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;

  ADC_InitStructure.ADC_ScanConvMode = ENABLE;                       //瀏覽模式(多通道)

  ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;                //連續轉化模式

  ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;

  ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T1_CC1;

  ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;             //數據右對齊

  ADC_InitStructure.ADC_NbrOfConversion = 3;                         //轉換通道數

  ADC_Init(ADC1, &ADC_InitStructure);


  /* 通道配置 */

  ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 1, ADC_SampleTime_3Cycles);

  ADC_RegularChannelConfig(ADC1, ADC_Channel_2, 2, ADC_SampleTime_3Cycles);

  ADC_RegularChannelConfig(ADC1, ADC_Channel_3, 3, ADC_SampleTime_3Cycles);


  ADC_DMARequestAfterLastTransferCmd(ADC1, ENABLE);


  ADC_DMACmd(ADC1, ENABLE);                                          //使能ADC的DMA功能

  ADC_Cmd(ADC1, ENABLE);                                             //使能ADC

}


/************************************************

函數名稱 : ADC_Initializes

功    能 : ADC初始化

參    數 : 無

返 回 值 : 無

作    者 : strongerHuang

*************************************************/

void ADC_Initializes(void)

{

  ADC_GPIO_Configuration();

  ADC_DMA_Configuration();

  ADC_Configuration();

}


/************************************************

函數名稱 : ADC_Get

功    能 : 轉換

參    數 : 無

返 回 值 : 無

作    者 : strongerHuang

*************************************************/

void ADC_Get(void)

{

  DMA_Cmd(DMA2_Stream0, DISABLE);                                    //關閉DMA

                                                                     //內存地址

  DMA_MemoryTargetConfig(DMA2_Stream0, (uint32_t)sADC_Buf, DMA_Memory_0);

  DMA_ClearFlag(DMA2_Stream0, DMA_FLAG_TCIF0);                       //清除標志位

  DMA_Cmd(DMA2_Stream0, ENABLE);                                     //使能DMA


  ADC_SoftwareStartConv(ADC1);                                       //啟動轉換


  while(RESET == DMA_GetFlagStatus(DMA2_Stream0, DMA_FLAG_TCIF0));   //等待轉換完成


  //得到3條通道轉換結果:sADC_Buf

  //進行相關換算,處理...

}


提示:以上源代碼只為方便學習和理解,請結合實際應用修改、或增減代碼。


3ADC,DMA,連續轉換

我這里寫的連續,是ADC連續轉換,同時,DMA循環存儲。大部分配置和上面差不多,這種方式也用的比較多,寫給大家。


1.DMA配置

2.ADC配置

3.源代碼



/* 靜態變量 ------------------------------------------------------------------*/

static volatile uint16_t sADC_Buf[3];


/************************************************

函數名稱 : ADC_GPIO_Configuration

功    能 : ADC引腳配置

參    數 : 無

返 回 值 : 無

作    者 : strongerHuang

*************************************************/

void ADC_GPIO_Configuration(void)

{

  GPIO_InitTypeDef GPIO_InitStructure;


  /* 使能時鐘 */

  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);


  GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3;

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;                      //模擬輸入

  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ;

  GPIO_Init(GPIOA, &GPIO_InitStructure);

}


/************************************************

函數名稱 : ADC_DMA_Configuration

功    能 : ADC DMA配置

參    數 : 無

返 回 值 : 無

作    者 : strongerHuang

*************************************************/

void ADC_DMA_Configuration(void)

{

  DMA_InitTypeDef DMA_InitStructure;


  /* 使能時鐘 */

  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2, ENABLE);


  /* 配置DMA */

  DMA_InitStructure.DMA_Channel = DMA_Channel_0;

  DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)(&(ADC1->DR));//外設地址

  DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)(&sADC_Buf[0]);  //內存地址

  DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory;            //傳輸方向:外設 -> 內存

  DMA_InitStructure.DMA_BufferSize = 3;                              //傳輸長度

  DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;   //外設遞增:關閉

  DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;            //內存遞增:打開

  DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;

  DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;//數據寬度

  DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;                    //循環模式

  DMA_InitStructure.DMA_Priority = DMA_Priority_Medium;              //優先級

  DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;

  DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_HalfFull;

  DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;

  DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;

  DMA_Init(DMA2_Stream0, &DMA_InitStructure);

}


/************************************************

函數名稱 : ADC_Configuration

功    能 : ADC參數配置

參    數 : 無

返 回 值 : 無

作    者 : strongerHuang

*************************************************/

void ADC_Configuration(void)

{

  ADC_InitTypeDef       ADC_InitStructure;

[1] [2]
關鍵字:ADC  DMA  多路  連續轉換 引用地址:ADC,DMA,多路,單次/連續轉換

上一篇:STM32中斷,及FreeRTOS中斷優先級配置
下一篇:你ADC采集的數據都準確嗎?

推薦閱讀

HT1380 EQU 0X06 COUNT0 EQU 0X10 TXBUF EQU 0X11 RXBUF EQU 0X12 DATABUF EQU 0X13 ADDRPOINT EQU 0X14 HT_SDA_IN EQU 0B01001000 HD_SDA_OUT EQU 0B00001000 HT_SCL EQU 0 HT_RST EQU 1 Ht_SDA EQU 2 ; TX_1380: MOV A,@HT_SDA_OUT IOW HT1380 BC HT1380,HT_SCL MOV A,@8 MOV COUNT0,A TX_1380_LP: BC ...
據外媒報道,亞馬遜周三宣布,正在華盛頓州斯諾霍米什縣測試一款名為“亞馬遜Scout”的送貨機器人。這一全電動六輪機器人由亞馬遜位于西雅圖總部的研發機構制造,尺寸只有一個小型冷卻器大小。從周一至周五白天,亞馬遜將在當地推出6個Scout機器人用于初步測試;在起始階段,所有的Scout機器人送貨服務將在一名亞馬遜員工陪同下進行。巡航速度大致相當于步...
2017年全球銷量38.1萬臺2017年全球工業機器人銷量達到38.1萬臺,同比增長30%;銷售額達162億美元,同比增長24%。預計到2020年,全球工業機器人銷量有望達到52.1萬臺。汽車是最大應用領域工業機器人下游應用廣泛,應用較多的行業主要包括汽車、電子電器、化工、 金屬制品、食品制造等行業,2017年全球范圍內工業機器人在上述行業中的應用占比分別為32.96...
據圖形研究部1月22日(Graphical Research)最新調研結果顯示,2019年,北美先進封裝技術收入超過30億美元,預計到2026年將達到50億美元,平均年增長率為7%。北美封裝增長的主要動力是高性能電子產品的體積越來越趨于緊湊,推動封裝技術朝更先進的方向發展。除了電子設備的小型化趨勢外,先進的封裝解決方案還具有諸多優勢,包括更小的占位面積,更低的功...

史海拾趣

問答坊 | AI 解惑

c51讀寫24c02

// extern void DelayMs(unsigned int);// extern void Read24c02(unsigned char *RamAddress,unsigned char RomAddress,unsigned char bytes);// extern void Write24c02(unsigned char *RamAddress,unsigned char RomAddress,unsigned char bytes ...…

查看全部問答∨

線性電路中的過渡過程

線性電路中的過渡過程…

查看全部問答∨

wince上電自啟動,如何不出現桌面,直接出現我的程序界面?

我現在用注冊表的方式,讓我的程序(窗口程序)在gwes,explore之后啟動。這樣會先出現桌面2,3秒再出現我的程序。 如果希望不出現桌面,要怎么做。…

查看全部問答∨

為什么有的驅動安裝完后會在任務欄顯示刪除硬件?

就像U盤驅動那樣?而有些就不會顯示,關鍵是在哪里呢?…

查看全部問答∨

VC程序移植的一個問題

我用VC寫的程序移植到WinCE中,原來用到了一個CHtmlView類,但在WinCE中不支持,怎么辦啊?…

查看全部問答∨

香帥,請教。MDK軟件仿真沒有CAN外設。

MDK 3.80 STM32F107 調試時,外設沒有CAN部分,我在網上聽說別人的有,我估計是不是安裝了什么插件。請教!上圖求真相! 下載 (31.08 KB) 2009-12-22 17:33 …

查看全部問答∨

求助:MSP430F149采樣問題

各位大俠,幫小弟看看這個問題: 我想用430做數據采集,雙通道數據采集,每個通道采集64個點之后,通過IO口來發送,現在是ADC這塊都有問題。采樣頻率為20KHz以上,使用TIMERA.OUT1為觸發源。 問題是:我單步運行運行到ADCTL0 |= ADC12SC;這條語句 ...…

查看全部問答∨

看看MSP430單片機

第一次看看MSP430,雖然買了,但還沒有學他,不知道好不好學,真很想學學他。…

查看全部問答∨

電壓跟隨器的作用有哪些?

在百度百科中看到 電壓跟隨器的其中一個好處是,提高了輸入阻抗,這樣,輸入電容的容量可以大幅度減小,為應用高品質的電容提供了前提保證。 為什么可以說:輸入電容的容量可以大幅度減小? 小弟初入模擬電子的世界,還請各位幫忙解釋一下,非 ...…

查看全部問答∨
小廣播
設計資源 培訓 開發板 精華推薦

最新單片機文章
何立民專欄 單片機及嵌入式寶典

北京航空航天大學教授,20余年來致力于單片機與嵌入式系統推廣工作。

 
EEWorld訂閱號

 
EEWorld服務號

 
汽車開發圈

 
機器人開發圈

電子工程世界版權所有 京ICP證060456號 京ICP備10001474號-1 電信業務審批[2006]字第258號函 京公網安備 11010802033920號 Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
主站蜘蛛池模板: 施甸县| 平遥县| 清涧县| 惠州市| 偃师市| 大理市| 常州市| 讷河市| 青田县| 岢岚县| 偃师市| 两当县| 仁怀市| 长治县| 利川市| 凤山市| 黔江区| 临夏市| 扎兰屯市| 延川县| 吉安市| 江西省| 措美县| 高阳县| 崇仁县| 张家界市| 曲水县| 庆城县| 伊春市| 万州区| 长顺县| 宁晋县| 宁海县| 东莞市| 清原| 专栏| 瑞安市| 乌兰浩特市| 呼伦贝尔市| 安乡县| 兴城市|