chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

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

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

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

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

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

掃碼添加小助手

加入工程師交流群

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

1寫(xiě)在前面

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

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

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

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

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

2

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

這里以ADC,使用DMA,通過(guò)軟件單次觸發(fā)轉(zhuǎn)換為例。主要需注意幾個(gè)相關(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ù)名稱(chēng) : ADC_GPIO_Configuration功 能 : ADC引腳配置參 數(shù) : 無(wú)返 回 值 : 無(wú)作 者 : strongerHuang*************************************************/void ADC_GPIO_Configuration(void){ GPIO_InitTypeDef GPIO_InitStructure; /* 使能時(shí)鐘 */ 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ù)名稱(chēng) : ADC_DMA_Configuration功 能 : ADC DMA配置參 數(shù) : 無(wú)返 回 值 : 無(wú)作 者 : strongerHuang*************************************************/void ADC_DMA_Configuration(void){ DMA_InitTypeDef DMA_InitStructure; /* 使能時(shí)鐘 */ 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; //傳輸長(zhǎng)度 DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; //外設(shè)遞增:關(guān)閉 DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; //內(nèi)存遞增:打開(kā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)先級(jí) 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ù)名稱(chēng) : ADC_Configuration功 能 : ADC參數(shù)配置參 數(shù) : 無(wú)返 回 值 : 無(wú)作 者 : strongerHuang*************************************************/void ADC_Configuration(void){ ADC_InitTypeDef ADC_InitStructure; ADC_CommonInitTypeDef ADC_CommonInitStructure; /* 使能時(shí)鐘 */ 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ù)右對(duì)齊 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ù)名稱(chēng) : ADC_Initializes功 能 : ADC初始化參 數(shù) : 無(wú)返 回 值 : 無(wú)作 者 : strongerHuang*************************************************/void ADC_Initializes(void){ ADC_GPIO_Configuration(); ADC_DMA_Configuration(); ADC_Configuration();}/************************************************函數(shù)名稱(chēng) : ADC_Get功 能 : 轉(zhuǎn)換參 數(shù) : 無(wú)返 回 值 : 無(wú)作 者 : 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); //啟動(dòng)轉(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í)和理解,請(qǐng)結(jié)合實(shí)際應(yīng)用修改、或增減代碼。

3

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

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

1.DMA配置

2.ADC配置

3.源代碼

/* 靜態(tài)變量 ------------------------------------------------------------------*/static volatile uint16_t sADC_Buf[3];/************************************************函數(shù)名稱(chēng) : ADC_GPIO_Configuration功 能 : ADC引腳配置參 數(shù) : 無(wú)返 回 值 : 無(wú)作 者 : strongerHuang*************************************************/void ADC_GPIO_Configuration(void){ GPIO_InitTypeDef GPIO_InitStructure; /* 使能時(shí)鐘 */ 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ù)名稱(chēng) : ADC_DMA_Configuration功 能 : ADC DMA配置參 數(shù) : 無(wú)返 回 值 : 無(wú)作 者 : strongerHuang*************************************************/void ADC_DMA_Configuration(void){ DMA_InitTypeDef DMA_InitStructure; /* 使能時(shí)鐘 */ 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; //傳輸長(zhǎng)度 DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; //外設(shè)遞增:關(guān)閉 DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; //內(nèi)存遞增:打開(kā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)先級(jí) 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ù)名稱(chēng) : ADC_Configuration功 能 : ADC參數(shù)配置參 數(shù) : 無(wú)返 回 值 : 無(wú)作 者 : strongerHuang*************************************************/void ADC_Configuration(void){ ADC_InitTypeDef ADC_InitStructure; ADC_CommonInitTypeDef ADC_CommonInitStructure; /* 使能時(shí)鐘 */ 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ù)右對(duì)齊 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); //啟動(dòng)轉(zhuǎn)換}/************************************************函數(shù)名稱(chēng) : ADC_Initializes功 能 : ADC初始化參 數(shù) : 無(wú)返 回 值 : 無(wú)作 者 : strongerHuang*************************************************/void ADC_Initializes(void){ ADC_GPIO_Configuration(); ADC_DMA_Configuration(); ADC_Configuration();}/************************************************函數(shù)名稱(chēng) : ADC_Get功 能 : 轉(zhuǎn)換參 數(shù) : 無(wú)返 回 值 : 無(wú)作 者 : strongerHuang*************************************************/void ADC_Get(void){ //得到3條通道轉(zhuǎn)換結(jié)果:sADC_Buf //進(jìn)行相關(guān)換算,處理...}

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

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

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

    關(guān)注

    99

    文章

    6709

    瀏覽量

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

    關(guān)注

    6

    文章

    64

    瀏覽量

    18629
  • GPIO
    +關(guān)注

    關(guān)注

    16

    文章

    1280

    瀏覽量

    54120
  • stm32cubemx
    +關(guān)注

    關(guān)注

    5

    文章

    286

    瀏覽量

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

掃碼添加小助手

加入工程師交流群

    評(píng)論

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

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

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

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

    stm32f4xx.h,標(biāo)準(zhǔn)外設(shè)庫(kù)
    發(fā)表于 06-08 09:49 ?0次下載

    STM32使用外部中斷觸發(fā)ADC采樣DMA搬運(yùn)出現(xiàn)兩進(jìn)入DMA中斷的異常情況,怎么解決?

    STM32使用外部中斷觸發(fā)ADC采樣DMA搬運(yùn)出現(xiàn)兩進(jìn)入DMA中斷的異常情況,使用的HAL庫(kù)+MX配置的,示波器觀察波形
    發(fā)表于 03-14 12:46

    STM32G030F6 ADC+DMA多通道非連續(xù)采樣無(wú)法正常工作怎么解決?

    配置:使用STM32G030F6 ADC外設(shè)時(shí),ADC使用兩個(gè)通道。DMA配置為循環(huán)模式,ADC掃描模式+非
    發(fā)表于 03-12 07:10

    請(qǐng)問(wèn)ADS1232轉(zhuǎn)換模式都是連續(xù)轉(zhuǎn)換模式嗎?

    請(qǐng)問(wèn)ADS1232轉(zhuǎn)換模式都是連續(xù)轉(zhuǎn)換模式嗎,如果轉(zhuǎn)換模式應(yīng)該怎樣設(shè)置,喚醒模式可以認(rèn)為是
    發(fā)表于 02-06 06:17

    ads1220連續(xù)轉(zhuǎn)換模式讀取數(shù)據(jù)時(shí)是正確的,但是配置成單模式時(shí)讀出的全是0,為什么?

    ads1220連續(xù)轉(zhuǎn)換模式讀取數(shù)據(jù)時(shí)是正確的,但是配置成單模式時(shí)讀出的全是0,模式的配置是不是有特別之處??
    發(fā)表于 12-17 08:29

    求助,關(guān)于模數(shù)轉(zhuǎn)換器ADS1115連續(xù)轉(zhuǎn)換的問(wèn)題求解

    采集端口,從寄存器讀取的值還是之前端口的值。所以針對(duì)轉(zhuǎn)換連續(xù)轉(zhuǎn)換的問(wèn)題,我希望可以得到一個(gè)詳細(xì)的解釋?zhuān)瑪?shù)據(jù)手冊(cè)感覺(jué)不太清楚
    發(fā)表于 11-29 14:26

    ADC器件連續(xù)轉(zhuǎn)換轉(zhuǎn)換的區(qū)別是什么?

    轉(zhuǎn)換指的是, ADC根據(jù)信號(hào)請(qǐng)求對(duì)輸入信號(hào)進(jìn)行一切換,將轉(zhuǎn)換值存儲(chǔ)到內(nèi)部
    發(fā)表于 11-28 06:23

    ADS1291為什么無(wú)法應(yīng)用轉(zhuǎn)換模式?

    您好,我最近在用ADS1291采集心電信號(hào),使用連續(xù)模式時(shí),可以正常采集信號(hào),但使用轉(zhuǎn)換模式時(shí),DRDY引腳一直是高電平,無(wú)法讀取數(shù)據(jù),調(diào)試的過(guò)程中有兩
    發(fā)表于 11-26 06:19

    用于ADCDMA乒乓

    電子發(fā)燒友網(wǎng)站提供《用于ADCDMA乒乓.pdf》資料免費(fèi)下載
    發(fā)表于 09-07 11:27 ?1次下載
    用于<b class='flag-5'>ADC</b>的<b class='flag-5'>DMA</b>乒乓

    運(yùn)用MSPM0的DMA和Event功能實(shí)現(xiàn)ADC多路周期性采樣

    電子發(fā)燒友網(wǎng)站提供《運(yùn)用MSPM0的DMA和Event功能實(shí)現(xiàn)ADC多路周期性采樣.pdf》資料免費(fèi)下載
    發(fā)表于 09-06 15:01 ?12次下載
    運(yùn)用MSPM0的<b class='flag-5'>DMA</b>和Event功能實(shí)現(xiàn)<b class='flag-5'>ADC</b><b class='flag-5'>多路</b>周期性采樣

    STM32CUBEMX(3)--ADC通過(guò)DMA方式采樣,USART打印

    @TOC 概述 直接存儲(chǔ)器訪問(wèn)(DMA)用于在外設(shè)與存儲(chǔ)器之間以及存儲(chǔ)器與存儲(chǔ)器之間提供高速數(shù)據(jù)傳輸??梢栽跓o(wú)需任何CPU操作的情況下通過(guò)DMA快速傳輸傳輸。這樣節(jié)省的CPU資源可供其它操作
    發(fā)表于 09-04 14:08

    AD7124轉(zhuǎn)換速率突然變慢是為什么

    AD7124程序中根據(jù)設(shè)定的次數(shù)進(jìn)行轉(zhuǎn)換,發(fā)現(xiàn)有時(shí)候轉(zhuǎn)換的速率會(huì)變很慢,這是為什么呢
    發(fā)表于 08-07 10:56

    ADS1110精密、連續(xù)自校準(zhǔn)模數(shù)轉(zhuǎn)換器(ADC)英文手冊(cè)

    電子發(fā)燒友網(wǎng)站提供《ADS1110精密、連續(xù)自校準(zhǔn)模數(shù)轉(zhuǎn)換器(ADC)英文手冊(cè).pdf》資料免費(fèi)下載
    發(fā)表于 07-25 12:24 ?0次下載

    ADS1112精密、連續(xù)自校準(zhǔn)模數(shù)轉(zhuǎn)換器(ADC)數(shù)據(jù)表

    電子發(fā)燒友網(wǎng)站提供《ADS1112精密、連續(xù)自校準(zhǔn)模數(shù)轉(zhuǎn)換器(ADC)數(shù)據(jù)表.pdf》資料免費(fèi)下載
    發(fā)表于 07-24 09:52 ?0次下載
    ADS1112精密、<b class='flag-5'>連續(xù)</b>自校準(zhǔn)模數(shù)<b class='flag-5'>轉(zhuǎn)換</b>器(<b class='flag-5'>ADC</b>)數(shù)據(jù)表