STM32之DMA+ADC

      借用小甲魚的經典:各位互聯網的廣大網友們、你們早上中午晚上好、、(打下小廣告,由於小甲魚的視頻真的很不錯)、每次看小甲魚的視頻自學都是比較輕鬆愉快的、、我在想,若是小甲魚出STM32的視頻,我會一集不漏的聽的、哈、好了、、學習到了STM32的DMA模塊、、琢磨了一下中文參考手冊,官方是這樣描述的:編程

     直接存儲器存取(DMA)用來提供在外設和存儲器之間或者存儲器和存儲器之間的高速數據傳輸。無須CPU干預,數據能夠經過DMA快速地移動,這就節省了CPU的資源來作其餘操做。數組

     是的,無需CPU干預,能夠想象得出這速度是有多快、那STM32的DMA有哪些特色呢?爲了方便你們,我在這裏就列出來哈:函數

     ● 12個獨立的可配置的通道(請求):DMA1有7個通道,DMA2有5個通道學習

     ● 每一個通道都直接鏈接專用的硬件DMA請求,每一個通道都一樣支持軟件觸發。這些功能經過軟件來配置。es5

     ● 在同一個DMA模塊上,多個請求間的優先權能夠經過軟件編程設置(共有四級:很高、高、中等和低),優先權設置相等時由硬件決定(請求0優先於請求1,依此類推) 。spa

     ● 獨立數據源和目標數據區的傳輸寬度(字節、半字、全字),模擬打包和拆包的過程。源和目標地址必須按數據傳輸寬度對齊。code

     ● 支持循環的緩衝器管理視頻

     ● 每一個通道都有3個事件標誌(DMA半傳輸、DMA傳輸完成和DMA傳輸出錯),這3個事件標誌邏輯或成爲一個單獨的中斷請求。blog

     ● 存儲器和存儲器間的傳輸事件

     ● 外設和存儲器、存儲器和外設之間的傳輸

     ● 閃存、SRAM、外設的SRAM、APB一、APB2和AHB外設都可做爲訪問的源和目標。

     ● 可編程的數據傳輸數目:最大爲65535

    是的,你也能夠看出、這特色還真的是有點多、、

    此次來點特別的,直接上代碼:  爲何直接?下文有講緣由,(具體看註釋)-----ADC採集數據經過DMA傳輸

 extern u32 adcx;
void ADC_DMA_Init(void)
{
       ADC_InitTypeDef ADC_InitStructure;
      GPIO_InitTypeDef GPIO_InitStructure;
    DMA_InitTypeDef DMA_InitStructure;                 //模塊定義初始化結構
    
   /* Enable ADC1 and GPIOA clock */    
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 | RCC_APB2Periph_GPIOA, ENABLE);
      /* Enable DMA1 clock */
  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
    
    RCC_ADCCLKConfig(RCC_PCLK2_Div6);//12MHZ 
    
//如下的步驟,哪一步該作什麼,不應作什麼、你均可以參考官方給的例程、、裏面都有詳細的步驟、、官方的別浪費了哈、、在這我就不截圖官方的例程了哈、、你們能夠去看看、借鑑下
/* Configure PA.1 (ADC Channel) as analog input -------------------------*/ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; //ADC_CH1 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; GPIO_Init(GPIOA, &GPIO_InitStructure); DMA_DeInit(DMA1_Channel1);
DMA_InitStructure.DMA_PeripheralBaseAddr
=(u32)&ADC1->DR;//取數據的源地址,此地址是你傳輸數據的開頭、也能夠直接寫地址,不用&這個取地址符號、ADC1->DR的地址爲0x4001244C DMA_InitStructure.DMA_MemoryBaseAddr = (u32)&adcx;//須要存放數據的地址 也就是目的地址 你傳輸數據的結尾,記住是一個地址來的,也別忘了取地址符號,假如是數組,則只要數組名便可 DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;//ADC1_DR做爲數據的來源 DMA_InitStructure.DMA_BufferSize = 4;//緩衝區的大小 這通常跟你目的地址的空間大小有關 DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;// DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Disable;//不遞增,由於傳的時候目的地址只有一個地址空間,不要傳到別的地址去、因此這裏不要遞增 DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;//16位數據 DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;//16位數據 DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;//循環、、這個循環是說當傳輸完以後自動從新從頭開始傳輸 DMA_InitStructure.DMA_Priority = DMA_Priority_High;//高優先級、、此處若只有一個的話無所謂優先級、、有多個請求時設置此處纔有意義 DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; DMA_Init(DMA1_Channel1, &DMA_InitStructure); /* Enable DMA1 channel1 */ DMA_Cmd(DMA1_Channel1, ENABLE);//看英文註釋 /* ADC1 configuration ------------------------------------------------------*/ ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; ADC_InitStructure.ADC_ScanConvMode = DISABLE; ADC_InitStructure.ADC_ContinuousConvMode = ENABLE; ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; ADC_InitStructure.ADC_NbrOfChannel = 1; ADC_Init(ADC1, &ADC_InitStructure);//ADC模塊初始化、、在這裏就不介紹了 /* ADC1 regular channel14 configuration */ //如下看英文註釋 ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 1, ADC_SampleTime_239Cycles5); /* Enable ADC1 DMA */ ADC_DMACmd(ADC1, ENABLE); /* Enable ADC1 */ ADC_Cmd(ADC1, ENABLE); /* Enable ADC1 reset calibration register */ ADC_ResetCalibration(ADC1); /* Check the end of ADC1 reset calibration register */ while(ADC_GetResetCalibrationStatus(ADC1)); /* Start ADC1 calibration */ ADC_StartCalibration(ADC1); /* Check the end of ADC1 calibration */ while(ADC_GetCalibrationStatus(ADC1)); /* Start ADC1 Software Conversion */ ADC_SoftwareStartConvCmd(ADC1, ENABLE); }

這裏我要說明的一點就是:當你從目的地址裏取數據時,此時此變量的類型必定要當心、、若是採集電壓的話顯示過大的話、你能夠嘗試把你定義的數據類型給加寬、、好比以前是定義u1六、能夠嘗試改成u3二、記住、此時,adcx這個變量裏存放的直接是你的數據、在這裏的數據就是ADC轉換後的值

        有時候找BUG真是一件痛苦的事、我找了整整一個晚上、次日上完通訊原理回來再找了一會、偶然發現我在主函數裏的ADC_DMA_Init()沒有寫、、這種無奈、、這種、、已經沒法用普通話能表達的了、找各類BUG的時候、相信你們都有體會、、在這裏就很少說了哈、、但願能幫到大家、、在這裏爲何這麼直接的講DMA、、由於DMA很直接、、因此我也很直接、、因此你懂的、、

相關文章
相關標籤/搜索