歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux綜合 >> 學習Linux >> STM32 ADC 同步規則模式(兩通道),stm32adc

STM32 ADC 同步規則模式(兩通道),stm32adc

日期:2017/3/3 18:10:21   编辑:學習Linux

STM32 ADC 同步規則模式(兩通道),stm32adc

STM32 ADC 同步規則模式(兩通道),stm32adc


  感覺直接貼代碼會好點。。。。。。

  

  1 #include "adc.h"
  2 
  3 float AD1_Value[N];
  4 float AD2_Value[N];
  5 volatile u32 ADCConvertedValue[N];//ADת»»»º³åÇø,Õ¼ÓÃRAM 0.8KB
  6 
  7 
  8 void  Adc_Init(void)
  9 {     
 10     TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
 11     ADC_InitTypeDef ADC_InitStructure; 
 12     GPIO_InitTypeDef GPIO_InitStructure;
 13     DMA_InitTypeDef DMA_InitStructure;
 14     NVIC_InitTypeDef NVIC_InitStructure;
 15     ////////////////////////////////////  Enable Clock   ///////////////////////////////////////////////////////////////////////
 16     RCC_ADCCLKConfig(RCC_PCLK2_Div6); //72M/6=12,ADC the Max Time Is Lager Than 14M
 17     RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE); 
 18     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA |RCC_APB2Periph_ADC1    , ENABLE );      //ʹÄÜADC1ͨµÀʱÖÓ
 19     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA |RCC_APB2Periph_ADC2    , ENABLE );      //ʹÄÜADC2ͨµÀʱÖÓ
 20 //    RCC_ADCCLKConfig(RCC_PCLK2_Div6); //72M/6=12,ADC the Max Time Is Lager Than 14M        
 21     
 22     //PA0.PA1.PA4.PA5 ×÷ΪģÄâͨµÀÊäÈëÒý½Å                         
 23     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_1;
 24     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;        //Ä£ÄâÊäÈëÒý½Å
 25     GPIO_Init(GPIOA, &GPIO_InitStructure);    
 26     
 27 ////////////////////////////////////////Initialize DMA /////////////////////////////////////////////////////////////////////    
 28     DMA_DeInit(DMA1_Channel1); //Reset DMA_Channel_1's Register To Default Value
 29     DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)&ADC1->DR; //DMA Device to ADC's Base Address
 30     DMA_InitStructure.DMA_MemoryBaseAddr = (u32)&ADCConvertedValue; //DMA Memory Base Address    
 31 //    DMA_InitStructure.DMA_MemoryBaseAddr = (u32)&ADCConvertedValue; //DMA Memory Base Address
 32     DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC; //Memory be use to Data Chansminsion's Destination
 33     DMA_InitStructure.DMA_BufferSize = N; //DMA Channel's DMA Buffer Size
 34     DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; //Outside Address's Register Is not Change 
 35     DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; //Buffer Address's Register Is Increasing
 36     DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Word; //Data size is 16 Bit
 37     DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Word; //Data Size Is 16 Bit 
 38     DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; //Work in Cycle Cache Mode
 39 
 40     DMA_InitStructure.DMA_Priority = DMA_Priority_High; //DMA Channel X Have The Higest Priority
 41     DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; //DMA Channel X do not set up to Chansmission in Memory to Memory
 42     DMA_Init(DMA1_Channel1, &DMA_InitStructure); //According to DMA_InitStruct to Initialize the DMA Channel    
 43     DMA_Cmd(DMA1_Channel1,ENABLE);                               //ʹÄÜDMA1ͨµÀ1
 44 
 45 
 46 ////////////////////////////////////////Initialize NVIC /////////////////////////////////////////////////////////////////////    
 47     NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
 48     NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel1_IRQn;
 49     NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
 50     NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
 51     NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
 52     NVIC_Init(&NVIC_InitStructure);
 53     DMA_ITConfig(DMA1_Channel1,DMA_IT_TC,ENABLE);            //ʹÄÜDMA CH1ÖÐ¶Ï  
 64 ////////////////////////////////////////Initialize ADC /////////////////////////////////////////////////////////////////////    
 65 
 66     ADC_DeInit(ADC1);  //¸´Î»ADC1,½«ÍâÉè ADC1 µÄÈ«²¿¼Ä´æÆ÷ÖØÉèΪȱʡֵ
 67     ADC_DeInit(ADC2);  //¸´Î» ADC1,½«ÍâÉè ADC1 µÄÈ«²¿¼Ä´æÆ÷ÖØÉèΪȱʡֵ
 68     
 69     ADC_InitStructure.ADC_Mode = ADC_Mode_RegSimult;    //ADC¹¤×÷ģʽ:ADC1ºÍADC2¹¤×÷ÔÚ¶ÀÁ¢Ä£Ê½
 70     ADC_InitStructure.ADC_ScanConvMode = ENABLE;    //ADC Works in Scan Model
 71     ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;    //ADC works in Continious Changing Model
 72     ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;    //ADC is triggered by sofeware instead of Outside
 73     ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;    //ADC Data Right Align
 74     ADC_InitStructure.ADC_NbrOfChannel = 1;    //˳Ðò½øÐйæÔòת»»µÄADCͨµÀµÄÊýÄ¿
 75     ADC_Init(ADC1, &ADC_InitStructure);    //¸ù¾ÝADC_InitStructÖÐÖ¸¶¨µÄ²ÎÊý³õʼ»¯ÍâÉèADCxµÄ¼Ä´æÆ÷   
 76     ADC_RegularChannelConfig(ADC1, ADC_Channel_1,  1, ADC_SampleTime_1Cycles5 );
 77     ADC_DMACmd(ADC1,ENABLE);                         //ʹÄÜADC1 DMA
84 ADC_InitStructure.ADC_Mode = ADC_Mode_RegSimult; //ADC¹¤×÷ģʽ:ADC2¹¤×÷ÔÚ¶ÀÁ¢Ä£Ê½ 85 ADC_InitStructure.ADC_ScanConvMode = ENABLE; //ADC Works in Scan Model 86 ADC_InitStructure.ADC_ContinuousConvMode = ENABLE; //ADC works in Continious Changing Model 87 ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; //ADC is triggered by sofeware instead of Outside 88 ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; //ADC Data Right Align 89 ADC_InitStructure.ADC_NbrOfChannel = 1; //˳Ðò½øÐйæÔòת»»µÄADCͨµÀµÄÊýÄ¿ 90 ADC_RegularChannelConfig(ADC2, ADC_Channel_2, 1, ADC_SampleTime_1Cycles5 ); 91 ADC_Init(ADC2, &ADC_InitStructure); //¸ù¾ÝADC_InitStructÖÐÖ¸¶¨µÄ²ÎÊý³õʼ»¯ÍâÉèADCxµÄ¼Ä´æÆ÷ 92 ADC_ExternalTrigConvCmd(ADC2, ENABLE); 93 94 95 ADC_DMACmd(ADC1, ENABLE); 96 ADC_Cmd(ADC1, ENABLE); //ʹÄÜÖ¸¶¨µÄADC1 98 99 ADC_ResetCalibration(ADC1); //ʹÄܸ´Î»Ð£×¼ 100 while(ADC_GetResetCalibrationStatus(ADC1)); //µÈ´ý¸´Î»Ð£×¼½áÊø 101 ADC_StartCalibration(ADC1); //¿ªÆôADУ׼ 102 while(ADC_GetCalibrationStatus(ADC1)); //µÈ´ýУ׼½áÊø 103 104 ADC_Cmd(ADC2, ENABLE); 105 ADC_ResetCalibration(ADC2); //ʹÄܸ´Î»Ð£×¼ 106 while(ADC_GetResetCalibrationStatus(ADC2)); //µÈ´ý¸´Î»Ð£×¼½áÊø 107 ADC_StartCalibration(ADC2); //¿ªÆôADУ׼ 108 while(ADC_GetCalibrationStatus(ADC2)); //µÈ´ýУ׼½áÊø 109 110 // delay_ms(10); 111 ADC_SoftwareStartConvCmd(ADC1, ENABLE); //ʹÄÜÖ¸¶¨µÄADC1µÄÈí¼þת»»Æô¶¯¹¦ÄÜ 112 } 113 114 115 void DMA1_Channel1_IRQHandler() 116 { 117 u16 i; 118 u16 temp1,temp2; 119 DMA_ClearFlag(DMA1_FLAG_TC1); //清除DMA傳輸完成中斷 120 DMA_Cmd(DMA1_Channel1,DISABLE); 121 for(i = 0; i < N ; i++) 122 { 123 temp1 = (ADCConvertedValue[i]<<16)>>16; 124 temp2 = ADCConvertedValue[i] >> 16; 125 AD1_Value[i] =((float)temp1)*(3.3/4096); 126 AD2_Value[i] =((float)temp2)*(3.3/4096); 127 Get_tem_buf(i); 128 } 129 DMA_Cmd(DMA1_Channel1,ENABLE); 131 LED0 = ~LED0; 132 }

有些注釋直接從Keil5裡面粘出來到這裡就不支持了。。。。。。。好尴尬。。。。下次碼代碼注釋還是全英算了、、、

哈哈。。有什麼問題可以一起來探討、、、不知道為啥分類不到嵌入式那裡只好點Linux那裡了。。

http://xxxxxx/Linuxjc/1164650.html TechArticle

Copyright © Linux教程網 All Rights Reserved