1. 程式人生 > 實用技巧 >stm32 多通道adc資料dma傳輸配置

stm32 多通道adc資料dma傳輸配置

注:程式碼中所涉及的暫存器配置都是依據與stm32f103c8t6微控制器而來。

#include "adc.h"
vu16 ADC_DMA_IN[2]; //ADC數值存放的變數

void ADC_DMA_Init(void){ //DMA初始化設定
    DMA_InitTypeDef DMA_InitStructure;//定義DMA初始化結構體
    DMA_DeInit(DMA1_Channel1);//復位DMA通道1
    DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address; //定義 DMA通道外設基地址=ADC1_DR_Address
DMA_InitStructure.DMA_MemoryBaseAddr = (u32)&ADC_DMA_IN; //!!!定義DMA通道ADC資料儲存器(其他函式可直接讀此變數即是ADC值) DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;//指定外設為源地址 DMA_InitStructure.DMA_BufferSize = 2;//!!!定義DMA緩衝區大小(根據ADC採集通道數量修改) DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;//
當前外設暫存器地址不變 DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;//!!! 當前儲存器地址:Disable不變,Enable遞增(用於多通道採集) DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;//定義外設資料寬度16位 DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord; //定義儲存器資料寬度16位 DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;//
DMA通道操作模式位環形緩衝模式 DMA_InitStructure.DMA_Priority = DMA_Priority_High;//DMA通道優先順序高 DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;//禁止DMA通道儲存器到儲存器傳輸 DMA_Init(DMA1_Channel1, &DMA_InitStructure);//初始化DMA通道1 DMA_Cmd(DMA1_Channel1, ENABLE); //使能DMA通道1 } void ADC_GPIO_Init(void){ //GPIO初始化設定 GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC,ENABLE); RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);//使能DMA時鐘(用於ADC的資料傳送) RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);//使能ADC1時鐘 GPIO_InitStructure.GPIO_Pin = ADC_CH6 | ADC_CH7; //!!!選擇埠 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; //選擇IO介面工作方式 GPIO_Init(ADCPORT, &GPIO_InitStructure); } void ADC_Configuration(void){ //初始化設定 ADC_InitTypeDef ADC_InitStructure;//定義ADC初始化結構體變數 ADC_GPIO_Init();//GPIO初始化設定 ADC_DMA_Init();//DMA初始化設定 ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;//ADC1和ADC2工作在獨立模式 ADC_InitStructure.ADC_ScanConvMode = ENABLE; //使能掃描 ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;//ADC轉換工作在連續模式 ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;//有軟體控制轉換 ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;//轉換資料右對齊 ADC_InitStructure.ADC_NbrOfChannel = 2;//!!!順序進行規則轉換的ADC通道的數目(根據ADC採集通道數量修改) ADC_Init(ADC1, &ADC_InitStructure); //根據ADC_InitStruct中指定的引數初始化外設ADCx的暫存器 //設定指定ADC的規則組通道,設定它們的轉化順序和取樣時間 //ADC1,ADC通道x,規則取樣順序值為y,取樣時間為28週期 ADC_RegularChannelConfig(ADC1, ADC_Channel_6, 1, ADC_SampleTime_28Cycles5);//!!! ADC1選擇通道x,取樣順序y,取樣時間n個週期 ADC_RegularChannelConfig(ADC1, ADC_Channel_7, 2, ADC_SampleTime_28Cycles5);//!!! ADC1選擇通道x,取樣順序y,取樣時間n個週期 ADC_DMACmd(ADC1, ENABLE);// 開啟ADC的DMA支援(要實現DMA功能,還需獨立配置DMA通道等引數) ADC_Cmd(ADC1, ENABLE);//使能ADC1 ADC_ResetCalibration(ADC1); //重置ADC1校準暫存器 while(ADC_GetResetCalibrationStatus(ADC1));//等待ADC1校準重置完成 ADC_StartCalibration(ADC1);//開始ADC1校準 while(ADC_GetCalibrationStatus(ADC1));//等待ADC1校準完成 ADC_SoftwareStartConvCmd(ADC1, ENABLE); //使能ADC1軟體開始轉換 }