一、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;
還望路過大神指點其中理解錯誤之處!!!
