STM32F407 ADC DMA 采樣實驗


轉載:http://home.eeworld.com.cn/my/space-uid-361439-blogid-239703.html

STM32F407ADC采樣實驗

熱度 1已有 5472 次閱讀2014-10-8 18:30 |個人分類:STM32F4XX/1XX/2XX/3XX/stm8s

    最近公司又做了一款407的樣板,正好需要用到407的ADC功能,需要用PC.2來檢測RFID芯片的射頻電源功率,首先看了下407的數據手冊

  
可以配置到ADC1/2/3任何一個控制器的信道12上面.我打算將PC.2映射到ADC3上面和使用DMA功能,又看了下DMA的請求映射表,ADC3使用的DMA2的流0信道2

.............................................................................................

編程思路:

首先將DMA和IO以及ADC的時鍾使能,其次將相應的IO配置成輸入模式,最后配置DMA和ADC

注意

/*定義ADC3的數據寄存器地址,DMA功能要用到外設的數據地址
 *ADC3的數據地址為外設基地址+偏移地址,基地址在RM0090 Reference
 *manual(參考手冊)的地址映射表里,為0x40012200,ADC_DR
 *偏移地址為0x4C,故實際地址為0x40012200+0x4C = 0x4001224C */
#define ADC3_DR_Address   ((uint32_t)0x4001224C)

代碼詳見:

void Adc3_Init(void)

{

/* Enable peripheral clocks ------------------------------------------------*/

/* Enable DMA1 clock */ 

RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2 | RCC_AHB1Periph_GPIOC, ENABLE);

               RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC3, ENABLE);

GPIO_Configuration();

DMA_Configuration();

 

}

void DMA_Configuration(void)

{

ADC_InitTypeDef ADC_InitStructure;

  DMA_InitTypeDef DMA_InitStructure;

ADC_CommonInitTypeDef ADC_CommonInitStructure;

  /* DMA2 Stream0 channel0 configuration **************************************/

  DMA_InitStructure.DMA_Channel = DMA_Channel_2;  

  DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)ADC3_DR_Address;

  DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)&ADCConvertedValue;

  DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory;

  DMA_InitStructure.DMA_BufferSize = 1;

  DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;

  DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Disable;

  DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;

  DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;

  DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;

  DMA_InitStructure.DMA_Priority = DMA_Priority_High;

  DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;         

  DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_HalfFull;

  DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;

  DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;

  DMA_Init(DMA2_Stream0, &DMA_InitStructure);

  DMA_Cmd(DMA2_Stream0, ENABLE);

  /* ADC Common Init **********************************************************/

  ADC_CommonInitStructure.ADC_Mode = ADC_Mode_Independent;

  ADC_CommonInitStructure.ADC_Prescaler = ADC_Prescaler_Div2;

  ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_Disabled;

  ADC_CommonInitStructure.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_5Cycles;

  ADC_CommonInit(&ADC_CommonInitStructure);

  /* ADC3 Init ****************************************************************/

  ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;

  ADC_InitStructure.ADC_ScanConvMode = DISABLE;         // PS :  在多通道 2個通道以上 該選項應該使能

  ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;

  ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;

  ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;

  ADC_InitStructure.ADC_NbrOfConversion = 1;

  ADC_Init(ADC3, &ADC_InitStructure);

  /* ADC3 regular channel12 configuration *************************************/

  ADC_RegularChannelConfig(ADC3, ADC_Channel_12, 1, ADC_SampleTime_3Cycles);

 /* Enable DMA request after last transfer (Single-ADC mode) */

  ADC_DMARequestAfterLastTransferCmd(ADC3, ENABLE);

  /* Enable ADC3 DMA */

  ADC_DMACmd(ADC3, ENABLE);

  /* Enable ADC3 */

  ADC_Cmd(ADC3, ENABLE);

/* Start ADC3 Software Conversion */ 

  ADC_SoftwareStartConv(ADC3);   //如果不是外部觸發則必須軟件開始轉換

}

 

 

 

/**

  * @brief  Configures the different GPIO ports.

  * @param  None

  * @retval None

  */

void GPIO_Configuration(void)

{

  GPIO_InitTypeDef GPIO_InitStructure;

  /* Configure PC.2 (ADC Channel2) PC.1 (ADC Channel1) as analog input -------------------------*/

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1|GPIO_Pin_2;

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;

  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ;

  GPIO_Init(GPIOC, &GPIO_InitStructure);

}

 

PS:   以上程序有錯誤:  在配置DMA的時候需要先使能DMA時鍾

 


免責聲明!

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



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