日B视频 亚洲,啪啪啪网站一区二区,91色情精品久久,日日噜狠狠色综合久,超碰人妻少妇97在线,999青青视频,亚洲一区二卡,让本一区二区视频,日韩网站推荐

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

ADC,DMA,多路,單次/連續(xù)轉(zhuǎn)換 (標(biāo)準(zhǔn)外設(shè)庫)

黃工的嵌入式技術(shù)圈 ? 來源:黃工的嵌入式技術(shù)圈 ? 作者:黃工的嵌入式技術(shù) ? 2020-03-04 11:26 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

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

1寫在前面

這個問題其實(shí)之前寫過一些相關(guān)文章,原理我之前也有相關(guān)描述。如果想要徹底弄明白其原理,建議閱讀《參考手冊》、結(jié)合標(biāo)準(zhǔn)外設(shè)庫來理解。

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

同時,STM32CubeMX生成的代碼,想要根據(jù)代碼進(jìn)一步了解其原理,其實(shí)很難

ADC轉(zhuǎn)換一些基礎(chǔ)原理,我這里就不過多描述了,請直接看下面標(biāo)準(zhǔn)外設(shè)庫源碼、及后面給的注釋。

下面寫2點(diǎn):ADC軟件單次觸發(fā)轉(zhuǎn)換,和連續(xù)轉(zhuǎn)換。

2

ADC,DMA,單次觸發(fā)轉(zhuǎn)換

這里以ADC,使用DMA,通過軟件單次觸發(fā)轉(zhuǎn)換為例。主要需注意幾個相關(guān)參數(shù)即可。

1.GPIO配置

2.DMA配置

3.ADC配置

4.ADC單次觸發(fā)轉(zhuǎn)換

5.源代碼

/* 靜態(tài)變量 ------------------------------------------------------------------*/static volatile uint16_t sADC_Buf[3];/************************************************函數(shù)名稱 : ADC_GPIO_Configuration功 能 : ADC引腳配置參 數(shù) : 無返 回 值 : 無作 者 : 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);}/************************************************函數(shù)名稱 : ADC_DMA_Configuration功 能 : ADC DMA配置參 數(shù) : 無返 回 值 : 無作 者 : 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));//外設(shè)地址 DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)(&sADC_Buf[0]); //內(nèi)存地址 DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory; //傳輸方向:外設(shè) -> 內(nèi)存 DMA_InitStructure.DMA_BufferSize = 3; //傳輸長度 DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; //外設(shè)遞增:關(guān)閉 DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; //內(nèi)存遞增:打開 DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord; DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;//數(shù)據(jù)寬度 DMA_InitStructure.DMA_Mode = DMA_Mode_Normal; //正常模式 DMA_InitStructure.DMA_Priority = DMA_Priority_Medium; //優(yōu)先級 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);}/************************************************函數(shù)名稱 : ADC_Configuration功 能 : ADC參數(shù)配置參 數(shù) : 無返 回 值 : 無作 者 : 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; //連續(xù)轉(zhuǎn)化模式 ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None; ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T1_CC1; ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; //數(shù)據(jù)右對齊 ADC_InitStructure.ADC_NbrOfConversion = 3; //轉(zhuǎn)換通道數(shù) 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}/************************************************函數(shù)名稱 : ADC_Initializes功 能 : ADC初始化參 數(shù) : 無返 回 值 : 無作 者 : strongerHuang*************************************************/void ADC_Initializes(void){ ADC_GPIO_Configuration(); ADC_DMA_Configuration(); ADC_Configuration();}/************************************************函數(shù)名稱 : ADC_Get功 能 : 轉(zhuǎn)換參 數(shù) : 無返 回 值 : 無作 者 : strongerHuang*************************************************/void ADC_Get(void){ DMA_Cmd(DMA2_Stream0, DISABLE); //關(guān)閉DMA //內(nèi)存地址 DMA_MemoryTargetConfig(DMA2_Stream0, (uint32_t)sADC_Buf, DMA_Memory_0); DMA_ClearFlag(DMA2_Stream0, DMA_FLAG_TCIF0); //清除標(biāo)志位 DMA_Cmd(DMA2_Stream0, ENABLE); //使能DMA ADC_SoftwareStartConv(ADC1); //啟動轉(zhuǎn)換 while(RESET == DMA_GetFlagStatus(DMA2_Stream0, DMA_FLAG_TCIF0)); //等待轉(zhuǎn)換完成 //得到3條通道轉(zhuǎn)換結(jié)果:sADC_Buf //進(jìn)行相關(guān)換算,處理...}

提示:以上源代碼只為方便學(xué)習(xí)和理解,請結(jié)合實(shí)際應(yīng)用修改、或增減代碼。

3

ADC,DMA,連續(xù)轉(zhuǎn)換

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

1.DMA配置

2.ADC配置

3.源代碼

/* 靜態(tài)變量 ------------------------------------------------------------------*/static volatile uint16_t sADC_Buf[3];/************************************************函數(shù)名稱 : ADC_GPIO_Configuration功 能 : ADC引腳配置參 數(shù) : 無返 回 值 : 無作 者 : 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);}/************************************************函數(shù)名稱 : ADC_DMA_Configuration功 能 : ADC DMA配置參 數(shù) : 無返 回 值 : 無作 者 : 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));//外設(shè)地址 DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)(&sADC_Buf[0]); //內(nèi)存地址 DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory; //傳輸方向:外設(shè) -> 內(nèi)存 DMA_InitStructure.DMA_BufferSize = 3; //傳輸長度 DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; //外設(shè)遞增:關(guān)閉 DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; //內(nèi)存遞增:打開 DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord; DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;//數(shù)據(jù)寬度 DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; //循環(huán)模式 DMA_InitStructure.DMA_Priority = DMA_Priority_Medium; //優(yōu)先級 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);}/************************************************函數(shù)名稱 : ADC_Configuration功 能 : ADC參數(shù)配置參 數(shù) : 無返 回 值 : 無作 者 : 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 = ENABLE; //連續(xù)轉(zhuǎn)化模式 ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None; ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T1_CC1; ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; //數(shù)據(jù)右對齊 ADC_InitStructure.ADC_NbrOfConversion = 3; //轉(zhuǎn)換通道數(shù) 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_SoftwareStartConv(ADC1); //啟動轉(zhuǎn)換}/************************************************函數(shù)名稱 : ADC_Initializes功 能 : ADC初始化參 數(shù) : 無返 回 值 : 無作 者 : strongerHuang*************************************************/void ADC_Initializes(void){ ADC_GPIO_Configuration(); ADC_DMA_Configuration(); ADC_Configuration();}/************************************************函數(shù)名稱 : ADC_Get功 能 : 轉(zhuǎn)換參 數(shù) : 無返 回 值 : 無作 者 : strongerHuang*************************************************/void ADC_Get(void){ //得到3條通道轉(zhuǎn)換結(jié)果:sADC_Buf //進(jìn)行相關(guān)換算,處理...}

這種方式比較簡單,直接去讀取轉(zhuǎn)換結(jié)果就行。實(shí)際應(yīng)用需要濾波,求平均之類的操作。

提示:以上源代碼只為方便學(xué)習(xí)和理解,請結(jié)合實(shí)際應(yīng)用修改、或增減代碼。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • adc
    adc
    +關(guān)注

    關(guān)注

    100

    文章

    7950

    瀏覽量

    557033
  • 模擬電壓
    +關(guān)注

    關(guān)注

    6

    文章

    67

    瀏覽量

    18905
  • GPIO
    +關(guān)注

    關(guān)注

    16

    文章

    1334

    瀏覽量

    56485
  • stm32cubemx
    +關(guān)注

    關(guān)注

    5

    文章

    290

    瀏覽量

    17490
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點(diǎn)推薦

    如何在S32K358中使用軟件觸發(fā)器配置具有DMAADC多通道?

    我正在開發(fā)S32K358,我想將ADC配置為使用DMA讀取多個通道。具體來說,我想: 使用軟件觸發(fā)器啟動ADC轉(zhuǎn)換。 配置 DMA,以便將來
    發(fā)表于 04-28 06:30

    ADC轉(zhuǎn)換-DMA傳輸

    初始化 ADC_InitStruct.ADC_OpMode = ADC_SingleChOneMode; //單通道轉(zhuǎn)換模式
    發(fā)表于 01-27 07:27

    CW32L052 DMA直接內(nèi)存訪問介紹

    源:ADC轉(zhuǎn)換完成標(biāo)志DMA_Init(CW_DMACHANNEL1, DMA_InitSt
    發(fā)表于 12-12 07:21

    立體聲模擬到數(shù)字轉(zhuǎn)換器與端模擬電壓輸入的ADC芯片-CJC1808

    CJC1808是一款高性能、低成本、芯片,立體聲模擬到數(shù)字轉(zhuǎn)換器與端模擬電壓輸入的24位立體聲模數(shù)轉(zhuǎn)換器(ADC芯片).
    的頭像 發(fā)表于 12-05 09:41 ?1771次閱讀
    立體聲模擬到數(shù)字<b class='flag-5'>轉(zhuǎn)換</b>器與<b class='flag-5'>單</b>端模擬電壓輸入的<b class='flag-5'>ADC</b>芯片-CJC1808

    利用DMA如何降低MCU功耗?

    (而非持續(xù)運(yùn)行)。 避免軟件輪詢開銷 傳統(tǒng)無DMA方案:CPU需循環(huán)檢查外設(shè)狀態(tài)(如UART接收標(biāo)志、ADC轉(zhuǎn)換完成標(biāo)志),消耗大量周期。 DMA
    發(fā)表于 11-18 07:34

    CW32的ADC視線,DMA擴(kuò)展采樣思路

    如果需要對超過 4 路的模擬量進(jìn)行采樣,則需要結(jié)合 DMA 的功能,以實(shí)現(xiàn)較少的 CPU 參與。其思路如下: 1.ADC 配置為單通道轉(zhuǎn)換
    發(fā)表于 11-13 08:09

    哪些場景適合使用DMA?

    : 模數(shù)轉(zhuǎn)換器(ADC)采集數(shù)據(jù): 當(dāng)ADC連續(xù)采樣時,通常會產(chǎn)生大量數(shù)據(jù)。使用DMA可以將ADC
    發(fā)表于 11-12 07:13

    RVMCU課堂「22」: 手把手教你玩轉(zhuǎn)RVSTAR—ADC應(yīng)用篇

    。各種通道的A/D轉(zhuǎn)換可以配置成單連續(xù)、掃描或間斷轉(zhuǎn)換模式。ADC轉(zhuǎn)換的結(jié)果可以按照左對齊或
    發(fā)表于 10-29 06:56

    STM32G030K6Tx使用ADC+DMA進(jìn)行6通道ADC采集,DMA傳輸錯位怎么解決?

    到了adc_dma_buff[0],而且數(shù)值也都是正確的。網(wǎng)上又說把`ADC_CFGR1.DMACFG置0的,但是這個置0后就不會自動連續(xù)傳輸了,而且成功的轉(zhuǎn)這次轉(zhuǎn)換,也是如上述一樣錯
    發(fā)表于 09-09 06:30

    STM32F405RGT6 ADC2+TIM4觸發(fā)+DMA(DMA2_Stream2_CH1)+DMA中斷會死機(jī),怎么解決?

    ;;//連續(xù)轉(zhuǎn)換模式 使用(連續(xù)模式)ADC_InitStructure.ADC_ScanConvMode = DISABLE;;//掃面模式 使用(掃描
    發(fā)表于 08-04 07:16

    FPGA利用DMA IP核實(shí)現(xiàn)ADC數(shù)據(jù)采集

    本文介紹如何利用FPGA和DMA技術(shù)處理來自AD9280和AD9708 ADC的數(shù)據(jù)。首先,探討了這兩種ADC的特點(diǎn)及其與FPGA的接口兼容性。接著,詳細(xì)說明了使用Xilinx VIVADO環(huán)境下
    的頭像 發(fā)表于 07-29 14:12 ?5363次閱讀

    無法配置 ADC1 來觸發(fā) DMA 傳輸,怎么解決?

    SCU->DMAP_ADC.bit.ADC1_SQ1 = 1u;并配置和啟用DMA。 考慮通過 SQ1 事件觸發(fā) DMA 通道 3,我認(rèn)為這應(yīng)該是 SQ1 轉(zhuǎn)換結(jié)束事件。
    發(fā)表于 07-21 06:57

    基于APM32F411 DMA_ADC Handler模式分析及解決

    最近在編寫DMA_ADC例程的過程中出現(xiàn)了一個中斷配置的問題,在ADC采集過程中,結(jié)合手冊進(jìn)行ADC連續(xù)轉(zhuǎn)換模式配置采集,手冊上給出需要進(jìn)行
    的頭像 發(fā)表于 06-24 14:30 ?1235次閱讀
    基于APM32F411 <b class='flag-5'>DMA_ADC</b> Handler模式分析及解決

    STM32F723ZET6使用ADC捕獲標(biāo)準(zhǔn)正弦波并通過USB主動上報,正弦波重新擬合后存在凹陷峰怎么解決?

    捕獲5KHZ頻率的正弦波,使用的是100khz定時器2溢出事件觸發(fā)ADC采樣,采樣144cyc,使用DMA方式傳輸ADC采樣數(shù)據(jù)(軟件觸發(fā)和連續(xù)采樣都試過沒有對波形產(chǎn)生幫助)。之后通過
    發(fā)表于 06-20 07:22

    STM32F4標(biāo)準(zhǔn)外設(shè)資料

    stm32f4xx.h,標(biāo)準(zhǔn)外設(shè)
    發(fā)表于 06-08 09:49 ?5次下載
    岱山县| 永平县| 丰顺县| 新沂市| 越西县| 依兰县| 高雄县| 晋江市| 手游| 库尔勒市| 秦皇岛市| 黔南| 镶黄旗| 易门县| 沙雅县| 阿合奇县| 宁津县| 宁夏| 乌审旗| 洪泽县| 朔州市| 奉化市| 榆树市| 井研县| 福清市| 大悟县| 阳东县| 靖州| 区。| 蓝山县| 黄山市| 夹江县| 油尖旺区| 长寿区| 双城市| 龙井市| 竹山县| 和静县| 泽库县| 南溪县| 马鞍山市|