ADC----DMA方式采集電壓


一、DMA介紹篇

1、DMA(存儲器直接存取)  

2、功能:為CPU分擔相當大一部分的”數據搬運”!!!解放CPU資源(CPU去負責更深的運算)  

插入: 微控制器由CPU,存儲器,外設三部分構成,各部分之間的協調與交互由CPU完成  (大腦,腳與手的關系)   (CPU每次都是從A外設拿到一個數據送到B外設使用,中間通過一個”橋”)        而 DMA可實現存儲器和存儲器之間,外設和存儲器之間,存儲器和外設之間的傳輸(跳過CPU)!!!

3、我們來看一下CPU 與DMA在搬運數據上的不同吧!

 

(1)  基於CPU的單通道中斷方式轉換數據

extern __IO uint16_t ADC_ConvertedValue;     //這里DMA方式 與CPU中斷方式都引用一個外部變量(分析代碼便可得出不同)

void ADC_IRQHandler(void)                   //ADC轉換完成后會進入中斷服務函數,(在中斷函數內,通過CPU的“搬運”,對ADC轉換后的值進行存儲與轉送)如下顯示:
{
if (ADC_GetITStatus(ADCx,ADC_IT_EOC)==SET)
{
// 讀取ADC的轉換值
ADC_ConvertedValue = ADC_GetConversionValue(ADCx);   // 獲取ADC轉換結果值的庫函數(CPU讀出ADC轉換后的12數值先存儲在ADC數據寄存器,然后CPU通過庫函數提取到CPU寄存器里,然后再轉附送到ADC_ConvertedValue地址的變量里 。                                                                                                                                                                                                                
}
ADC_ClearITPendingBit(ADCx,ADC_IT_EOC);
}

 

(2)基於DMA的單通道轉換數據

 

extern __IO uint16_t ADC_ConvertedValue;     //這里DMA方式 與CPU中斷方式都引用一個外部變量(分析代碼便可得出不同)

//DMA傳輸不需要 ADC_GetConversionValue(ADCx); 中間變量(CPU寄存器)
//將ADC轉換后的數據直接傳送到B變量 (這個過程只需要經過CPU允許及DMA請求即可,關鍵在於配置DMA,下圖為部分)

// 配置 DMA 初始化結構體
// 外設基址為:ADC 數據寄存器地址
DMA_InitStructure.DMA_PeripheralBaseAddr = ( uint32_t ) ( & ( ADCx->DR ) );

// 存儲器地址,實際上就是一個內部SRAM的變量
DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)&ADC_ConvertedValue;   //直接將外設的數據寄存器提取到變量

// 數據源來自外設
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;

 

還望路過大神指點其中理解錯誤之處!!!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM