DMA多通道单次触发
OK打开我们之前写好的ADC的代码,将我们写的DMA的初始化加进去
整体代码如下,后面开始解释- //adc.c文件
- uint16_t addr[2]={0};
- static void AD_Init(void)
- {
- GPIO_InitTypeDef GPIO_InitStruct;
- ADC_InitTypeDef ADC_InitStruct;
-
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);
-
- GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AIN;
- GPIO_InitStruct.GPIO_Pin=GPIO_Pin_1 | GPIO_Pin_2;
- GPIO_InitStruct.GPIO_Speed=GPIO_Speed_10MHz;
- GPIO_Init(GPIOC,&GPIO_InitStruct);
-
- RCC_ADCCLKConfig(RCC_PCLK2_Div6);
-
- ADC_RegularChannelConfig(ADC1,ADC_Channel_11,1,ADC_SampleTime_1Cycles5);
- ADC_RegularChannelConfig(ADC1,ADC_Channel_12,2,ADC_SampleTime_1Cycles5);
-
- ADC_InitStruct.ADC_ContinuousConvMode=DISABLE;
- ADC_InitStruct.ADC_DataAlign=ADC_DataAlign_Right;
- ADC_InitStruct.ADC_ExternalTrigConv=ADC_ExternalTrigConv_None;
- ADC_InitStruct.ADC_Mode=ADC_Mode_Independent;
- ADC_InitStruct.ADC_NbrOfChannel=2;
- ADC_InitStruct.ADC_ScanConvMode=ENABLE;
- ADC_Init(ADC1,&ADC_InitStruct);
-
- ADC_DMACmd(ADC1,ENABLE);
- ADC_Cmd(ADC1,ENABLE);
-
- //校验
- ADC_ResetCalibration(ADC1);
- while(ADC_GetResetCalibrationStatus(ADC1) == SET);
- ADC_StartCalibration(ADC1);
- while(ADC_GetCalibrationStatus(ADC1) == SET);
- }
-
-
- static void MyDMA_Init(void)
- {
- DMA_InitTypeDef DMA_InitStruct;
-
- RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,ENABLE);
- DMA_InitStruct.DMA_BufferSize=2;
- DMA_InitStruct.DMA_DIR=DMA_DIR_PeripheralSRC;
- DMA_InitStruct.DMA_M2M=DMA_M2M_Disable;
- DMA_InitStruct.DMA_Mode=DMA_Mode_Normal;
- DMA_InitStruct.DMA_Priority=DMA_Priority_High;
- DMA_InitStruct.DMA_MemoryBaseAddr=(uint32_t)addr;
- DMA_InitStruct.DMA_MemoryDataSize=DMA_MemoryDataSize_HalfWord;
- DMA_InitStruct.DMA_MemoryInc=DMA_MemoryInc_Enable;
- DMA_InitStruct.DMA_PeripheralBaseAddr=(uint32_t)&ADC1->DR;
- DMA_InitStruct.DMA_PeripheralDataSize=DMA_PeripheralDataSize_HalfWord;
- DMA_InitStruct.DMA_PeripheralInc=DMA_PeripheralInc_Disable;
- DMA_Init(DMA1_Channel1,&DMA_InitStruct);
- DMA_Cmd(DMA1_Channel1,ENABLE);
- }
-
- void MyAD_Init(void)
- {
- AD_Init();
- MyDMA_Init();
- }
-
- void AD_GetValue(void)
- {
-
- DMA_Cmd(DMA1_Channel1,DISABLE);
- DMA_SetCurrDataCounter(DMA1_Channel1,2);
- DMA_Cmd(DMA1_Channel1,ENABLE);
-
- ADC_SoftwareStartConvCmd(ADC1,ENABLE);
-
- /*等待传输完成*/
- while(DMA_GetFlagStatus(DMA1_FLAG_TC1) == RESET);
- DMA_ClearFlag(DMA1_FLAG_TC1);
- }
|