感覺直接貼代碼會好點。。。。。。 有些註釋直接從Keil5裡面粘出來到這裡就不支持了。。。。。。。好尷尬。。。。下次碼代碼註釋還是全英算了、、、 哈哈。。有什麼問題可以一起來探討、、、不知道為啥分類不到嵌入式那裡只好點Linux那裡了。。 ...
感覺直接貼代碼會好點。。。。。。
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那裡了。。