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

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

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

CKS32F107xx系列ADC采樣DMA的原理和配置方法

中科芯MCU ? 來(lái)源:中科芯MCU ? 2024-06-29 10:37 ? 次閱讀

采樣DMA的原理和配置方法

因?yàn)?a href="http://wenjunhu.com/tags/adc/" target="_blank">ADC規(guī)則組數(shù)據(jù)寄存器ADC_DR只有一個(gè),如果使用多通道轉(zhuǎn)換,那轉(zhuǎn)換的數(shù)據(jù)就全部都擠在ADC_DR里面了,前一個(gè)時(shí)間點(diǎn)轉(zhuǎn)換的通道數(shù)據(jù),就會(huì)被下一個(gè)時(shí)間點(diǎn)的另外一個(gè)通道轉(zhuǎn)換的數(shù)據(jù)覆蓋掉,所以當(dāng)通道轉(zhuǎn)換完成后就應(yīng)該把數(shù)據(jù)取走,或者開(kāi)啟DMA模式,把數(shù)據(jù)傳輸?shù)絻?nèi)存里面,不然就會(huì)造成數(shù)據(jù)的覆蓋。多通道ADC采集一般使用DMA進(jìn)行數(shù)據(jù)傳輸,該方法更加高效方便。

注:只有ADC1擁有DMA功能。由ADC2轉(zhuǎn)化的數(shù)據(jù)可以通過(guò)雙ADC模式,利用ADC1的 DMA功能傳輸。

DMA間接

直接存儲(chǔ)器存取(DMA)用來(lái)提供在外設(shè)和存儲(chǔ)器之間或者存儲(chǔ)器和存儲(chǔ)器之間的高速數(shù)據(jù)傳輸。無(wú)須CPU干預(yù),數(shù)據(jù)可以通過(guò)DMA快速地移動(dòng),這就節(jié)省了CPU的資源來(lái)做其他操作。兩個(gè)DMA控制器有12個(gè)通道(DMA1有7個(gè)通道,DMA2有5個(gè)通道),每個(gè)通道專門(mén)用來(lái)管理來(lái)自于一個(gè)或多個(gè)外設(shè)對(duì)存儲(chǔ)器訪問(wèn)的請(qǐng)求。ADC1使用的是DMA1的通道1。

DMA初始化結(jié)構(gòu)體詳解

DMA_InitTypeDef初始化結(jié)構(gòu)體結(jié)構(gòu)體用于設(shè)置DMA的工作參數(shù),其具體的定義如下:

typedef struct

{

uint32_t DMA_PeripheralBaseAddr;

uint32_t DMA_MemoryBaseAddr;

uint32_t DMA_DIR;

uint32_t DMA_BufferSize;

uint32_t DMA_PeripheralInc;

uint32_t DMA_MemoryInc;

uint32_t DMA_PeripheralDataSize;

uint32_t DMA_MemoryDataSize;

uint32_t DMA_Mode;

uint32_t DMA_Priority;

uint32_t DMA_M2M;

}DMA_InitTypeDef;

1) DMA_PeripheralBaseAddr:外設(shè)地址,設(shè)定DMA_CPAR寄存器的值;一般設(shè)置為外設(shè)的數(shù)據(jù)寄存器地址,如果是存儲(chǔ)器到存儲(chǔ)器模式則設(shè)置為其中一個(gè)存儲(chǔ)器地址。我么是把ADC采集到的數(shù)據(jù)通過(guò)DMA傳輸?shù)酱鎯?chǔ)器上,則外設(shè)地址為ADC的數(shù)據(jù)寄存器。

2) DMA_Memory0BaseAddr:存儲(chǔ)器地址,設(shè)定DMA_CMAR寄存器值;一般設(shè)置為我們自定義的用來(lái)存放ADC數(shù)據(jù)的數(shù)組地址。

3) DMA_DIR:傳輸方向選擇,可選外設(shè)到存儲(chǔ)器、存儲(chǔ)器到外設(shè)。它設(shè)定 DMA_CCR寄存器的DIR[1:0]位的值。這里并沒(méi)有存儲(chǔ)器到存儲(chǔ)器的方向選擇,當(dāng)使用存儲(chǔ)器到存儲(chǔ)器時(shí),只需要把其中一個(gè)存儲(chǔ)器當(dāng)作外設(shè)使用即可。本章選擇為外設(shè)到存儲(chǔ)器。

4) DMA_Bu?erSize:設(shè)定待傳輸數(shù)據(jù)數(shù)目,初始化設(shè)定DMA_CNDTR寄存器的值,其大小等于我們定義的存儲(chǔ)ADC數(shù)據(jù)的數(shù)組大小。

5)DMA_PeripheralInc:如果配置為 DMA_PeripheralInc_Enable,使能外設(shè)地址自動(dòng)遞增功能,它設(shè)定DMA_CCR寄存器的PINC位的值;因?yàn)锳DC轉(zhuǎn)換的數(shù)據(jù)都存放在一個(gè)數(shù)據(jù)寄存器中,則外設(shè)地址不變。

6) DMA_MemoryInc:如果配置為 DMA_MemoryInc_Enable,使能存儲(chǔ)器地址自動(dòng)遞增功能,它設(shè)定DMA_CCR寄存器的MINC位的值;因?yàn)槲覀冏远x的數(shù)組用來(lái)存放兩個(gè)數(shù)據(jù),所以要使能存儲(chǔ)器地址自動(dòng)遞增功能。

7) DMA_PeripheralDataSize:外設(shè)數(shù)據(jù)寬度,可選字節(jié)(8位)、半字(16位) 和字(32位),它設(shè)定DMA_CCR寄存器的PSIZE[1:0]位的值。

8) DMA_MemoryDataSize:存儲(chǔ)器數(shù)據(jù)寬度,可選字節(jié)(8位)、半字(16位) 和字(32位),它設(shè)定DMA_CCR寄存器的MSIZE[1:0]位的值。外設(shè)和存儲(chǔ)器單位均為兩個(gè)字節(jié)。

9) DMA_Mode:DMA傳輸模式選擇,可選一次傳輸或者循環(huán)傳輸,它設(shè)定 DMA_CCR寄存器的CIRC位的值。例程我們的ADC采集是持續(xù)循環(huán)進(jìn)行的,所以使用循環(huán)傳輸模式。當(dāng)啟動(dòng)了循環(huán)模式,數(shù)據(jù)傳輸?shù)臄?shù)目變?yōu)?時(shí),將會(huì)自動(dòng)地被恢復(fù)成配置通道時(shí)設(shè)置的初值,DMA操作將會(huì)繼續(xù)進(jìn)行。

ADC的工作參數(shù)配置

// 只使用一個(gè)ADC,屬于單模式

ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;

// 掃描模式

ADC_InitStructure.ADC_ScanConvMode = ENABLE ;

// 連續(xù)轉(zhuǎn)換模式

ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;

// 不用外部觸發(fā)轉(zhuǎn)換,軟件開(kāi)啟即可

ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;

// 轉(zhuǎn)換結(jié)果右對(duì)齊

ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;

// 轉(zhuǎn)換通道個(gè)數(shù)

ADC_InitStructure.ADC_NbrOfChannel = 2;

// 初始化ADC

ADC_Init(ADC1, &ADC_InitStructure);

// 配置ADC時(shí)鐘N狿CLK2的8分頻,即9MHz

RCC_ADCCLKConfig(RCC_PCLK2_Div8);

// 配置ADC 通道的轉(zhuǎn)換順序和采樣時(shí)間

ADC_RegularChannelConfig(ADC1, ADC_CHANNEL1, 1, ADC_SampleTime_55Cycles5);

ADC_RegularChannelConfig(ADC1, ADC_CHANNEL2, 2, ADC_SampleTime_55Cycles5);

// 使能ADC DMA 請(qǐng)求

ADC_DMACmd(ADC1, ENABLE);

// 開(kāi)啟ADC ,并開(kāi)始轉(zhuǎn)換

ADC_Cmd(ADC1, ENABLE);

// 初始化ADC 校準(zhǔn)寄存器

ADC_ResetCalibration(ADC1);

// 等待校準(zhǔn)寄存器初始化完成

while(ADC_GetResetCalibrationStatus(ADC1));

// ADC開(kāi)始校準(zhǔn)

ADC_StartCalibration(ADC1);

// 等待校準(zhǔn)完成

while(ADC_GetCalibrationStatus(ADC1));

// 由于沒(méi)有采用外部觸發(fā),所以使用軟件觸發(fā)ADC轉(zhuǎn)換

ADC_SoftwareStartConvCmd(ADC1, ENABLE);

因?yàn)橹皇鞘褂靡粋€(gè) ADC,所以模式配置為獨(dú)立模式;例程中使用了ADC1的兩個(gè)通道進(jìn)行采集,因此需要開(kāi)啟掃描模式,當(dāng)一個(gè)通道轉(zhuǎn)換結(jié)束時(shí),同一組的下一個(gè)通道將被自動(dòng)轉(zhuǎn)換;例程實(shí)現(xiàn)不間斷的對(duì)外部模擬數(shù)據(jù)進(jìn)行采集,因此使能連續(xù)轉(zhuǎn)換模式。ADC的轉(zhuǎn)換采用軟件觸發(fā)的方式,因此不使用外部觸發(fā)轉(zhuǎn)換信號(hào)。轉(zhuǎn)換結(jié)果右對(duì)齊;轉(zhuǎn)換通道數(shù)為2;因?yàn)槭莾蓚€(gè)通道進(jìn)行采集,所以調(diào)用ADC_RegularChannelConfig()函數(shù)設(shè)置每個(gè)通道的轉(zhuǎn)換順序和采樣時(shí)間。

聲明:本文內(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)投訴
  • 寄存器
    +關(guān)注

    關(guān)注

    31

    文章

    5343

    瀏覽量

    120348
  • 存儲(chǔ)器
    +關(guān)注

    關(guān)注

    38

    文章

    7492

    瀏覽量

    163828
  • adc
    adc
    +關(guān)注

    關(guān)注

    98

    文章

    6498

    瀏覽量

    544628
  • dma
    dma
    +關(guān)注

    關(guān)注

    3

    文章

    561

    瀏覽量

    100583

原文標(biāo)題:MCU微課堂|CKS32F107xx系列 ADC(二)

文章出處:【微信號(hào):中科芯MCU,微信公眾號(hào):中科芯MCU】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    MCU微課堂|CKS32F4xx系列產(chǎn)品時(shí)鐘配置

    ,并且高時(shí)鐘頻率將導(dǎo)致功耗增加、抗電磁干擾能力變?nèi)酰虼耍?b class='flag-5'>CKS32F4xx系列產(chǎn)品內(nèi)部具備多個(gè)時(shí)鐘源。本文將對(duì)CKS32F4xx系列產(chǎn)品時(shí)鐘組成進(jìn)行分析,并講解該系統(tǒng)單片機(jī)的時(shí)鐘的
    發(fā)表于 12-12 10:17 ?843次閱讀

    CKS32F4xx系列ETH通信詳解

    CKS32F4xx系列芯片自帶以太網(wǎng)模塊,該模塊包括帶專用DMA控制器的MAC 802.3(介質(zhì)訪問(wèn)控制)控制器
    的頭像 發(fā)表于 11-10 11:13 ?1007次閱讀
    <b class='flag-5'>CKS32F4xx</b><b class='flag-5'>系列</b>ETH通信詳解

    基于CKS32F4xx系列的MCU互補(bǔ)PWM方案

    互補(bǔ)輸出實(shí)際跟比較輸出章節(jié)一樣使用的是定時(shí)器的功能,所以相關(guān)的函數(shù)設(shè)置同樣在庫(kù)函數(shù)文件CKS32f4xx_tim.h和CKS32f4xx_tim.c文件中。 1)開(kāi)啟TIM1和GPIO時(shí)鐘,配置PA7、PA8選擇復(fù)用功能GPIO
    發(fā)表于 12-02 10:13 ?644次閱讀
    基于<b class='flag-5'>CKS32F4xx</b><b class='flag-5'>系列</b>的MCU互補(bǔ)PWM方案

    CKS32F4xx系列產(chǎn)品串口DMA傳輸

    在上一講,我們講過(guò)CKS32F4xx系列的6個(gè)串口都支持DMA傳輸。因此本節(jié)我們對(duì)CKS32F4xx系列
    的頭像 發(fā)表于 04-10 11:18 ?1042次閱讀

    CKS32F4xx系列DAC功能

    CKS32F4xx系列DAC功能
    的頭像 發(fā)表于 11-06 16:56 ?853次閱讀
    <b class='flag-5'>CKS32F4xx</b><b class='flag-5'>系列</b>DAC功能

    CKS32F4xx系列ADC多通道DMA電壓采集

    CKS32F4xx系列ADC多通道DMA電壓采集
    的頭像 發(fā)表于 11-06 16:53 ?1103次閱讀

    CKS32F4xx系列ADC單通道電壓采集

    CKS32F4xx系列ADC單通道電壓采集
    的頭像 發(fā)表于 11-06 16:54 ?989次閱讀
    <b class='flag-5'>CKS32F4xx</b><b class='flag-5'>系列</b><b class='flag-5'>ADC</b>單通道電壓采集

    CKS32F4xx系列產(chǎn)品Timer的基本使用方法-比較輸出

    CKS32F4xx系列產(chǎn)品Timer的基本使用方法-比較輸出
    的頭像 發(fā)表于 11-09 17:39 ?858次閱讀
    <b class='flag-5'>CKS32F4xx</b><b class='flag-5'>系列</b>產(chǎn)品Timer的基本使用<b class='flag-5'>方法</b>-比較輸出

    CKS32F4xx系列產(chǎn)品Timer的基本使用方法-定時(shí)操作

    CKS32F4xx系列產(chǎn)品Timer的基本使用方法-定時(shí)操作
    的頭像 發(fā)表于 11-09 17:41 ?620次閱讀
    <b class='flag-5'>CKS32F4xx</b><b class='flag-5'>系列</b>產(chǎn)品Timer的基本使用<b class='flag-5'>方法</b>-定時(shí)操作

    MCU微課堂 | CKS32F4xx系列產(chǎn)品GPIO口配置

    MCU微課堂 | CKS32F4xx系列產(chǎn)品GPIO口配置
    的頭像 發(fā)表于 10-24 15:14 ?785次閱讀
    MCU微課堂 | <b class='flag-5'>CKS32F4xx</b><b class='flag-5'>系列</b>產(chǎn)品GPIO口<b class='flag-5'>配置</b>

    CKS32F107xx系列時(shí)鐘系統(tǒng)具體配置方法講解

    上一章節(jié)對(duì)CKS32F107xx系列時(shí)鐘做了整體介紹,本章節(jié)以使用HSI內(nèi)部高速時(shí)鐘為例對(duì)時(shí)鐘具體配置方法進(jìn)行講解。
    的頭像 發(fā)表于 05-28 10:05 ?602次閱讀
    <b class='flag-5'>CKS32F107xx</b><b class='flag-5'>系列</b>時(shí)鐘系統(tǒng)具體<b class='flag-5'>配置</b><b class='flag-5'>方法</b>講解

    CKS32F107xx系列MCU中ADC介紹

    CKS32F107xx系列產(chǎn)品提供2個(gè)12位的模擬/數(shù)字轉(zhuǎn)換器(ADC),每個(gè)ADC共用多達(dá)16個(gè)外部通道,各通道的A/D轉(zhuǎn)換可以單次、連續(xù)、掃描或間斷模式執(zhí)行。
    的頭像 發(fā)表于 06-22 11:04 ?708次閱讀

    CKS32F107xx系列MCU的雙重ADC模式

    獨(dú)立模式的ADC采集需要在一個(gè)通道采集并且轉(zhuǎn)換完成后才會(huì)進(jìn)行下一個(gè)通道的采集。而雙重ADC的機(jī)制就是使用兩個(gè)ADC同時(shí)采樣一個(gè)或者多個(gè)通道。雙重AD
    的頭像 發(fā)表于 07-22 09:19 ?484次閱讀
    <b class='flag-5'>CKS32F107xx</b><b class='flag-5'>系列</b>MCU的雙重<b class='flag-5'>ADC</b>模式

    CKS32F107xx系列MCU的GPIO內(nèi)部硬件結(jié)構(gòu)和工作模式

    16個(gè)引腳,如型號(hào)為CKS2F107VET6型號(hào)的芯片有GPIOA、GPIOB、GPIOC至GPIOE共5組GPIO,芯片一共100個(gè)引腳,其中GPIO就占了一大部分,所有的GPIO引腳都有基本的輸入輸出功能。
    的頭像 發(fā)表于 07-22 09:23 ?701次閱讀
    <b class='flag-5'>CKS32F107xx</b><b class='flag-5'>系列</b>MCU的GPIO內(nèi)部硬件結(jié)構(gòu)和工作模式

    詳解CKS32F107xx系列的定時(shí)器同步功能

    CKS32F107xx系列部分定時(shí)器在內(nèi)部是相連的,可用于定時(shí)器同步或鏈接,方便用戶配置不同的同步模式,以便在電機(jī)控制、數(shù)據(jù)采集和PWM信號(hào)生成等應(yīng)用中,實(shí)現(xiàn)復(fù)雜的時(shí)間序列和多通道的同步操作。本節(jié)課
    的頭像 發(fā)表于 11-26 17:51 ?369次閱讀
    詳解<b class='flag-5'>CKS32F107xx</b><b class='flag-5'>系列</b>的定時(shí)器同步功能