#define ADC1_DMA_ON 1void ADC1_Init(int channelnum){ __HAL_RCC_ADC1_CLK_ENABLE(); __HAL_RCC_GPIOA_CLK_ENABLE(); ADC1_Handler.Instance=ADC1; ADC1_Handler.Init.ClockPrescaler=ADC_CLOCK_SYNC_PCLK_DIV4; //二分频 ADC1_Handler.Init.Resolution = ADC_RESOLUTION_12B; //十二位模式 ADC1_Handler.Init.ExternalTrigConvEdge=ADC_EXTERNALTRIGCONVEDGE_NONE; //使用软件触发 ADC1_Handler.Init.DataAlign=ADC_DATAALIGN_RIGHT; //右对齐模式 ADC1_Handler.Init.ScanConvMode=DISABLE; //非扫描模式 ADC1_Handler.Init.ContinuousConvMode=ENABLE; //禁止连续转换模式 ADC1_Handler.Init.DiscontinuousConvMode=DISABLE; //禁止连续不采样模式 if(channelnum>1) ADC1_Handler.Init.NbrOfConversion=channelnum; //转换规则序列 else if(channelnum==1) ADC1_Handler.Init.NbrOfConversion=1; //只转换规则序列1 ADC1_Handler.Init.DMAContinuousRequests=ENABLE; //开启DMA请求 ADC1_Handler.Init.EOCSelection=ADC_EOC_SINGLE_CONV; GPIO_Initure.Pin=GPIO_PIN_0|GPIO_PIN_1; GPIO_Initure.Mode=GPIO_MODE_ANALOG; GPIO_Initure.Pull=GPIO_NOPULL; HAL_GPIO_Init(GPIOA,&GPIO_Initure); #if ADC1_DMA_ON __HAL_RCC_DMA2_CLK_ENABLE(); ADC1_DMA_Handler.Instance = DMA2_Stream4; ADC1_DMA_Handler.Init.Channel = DMA_CHANNEL_0; ADC1_DMA_Handler.Init.Direction = DMA_PERIPH_TO_MEMORY; ADC1_DMA_Handler.Init.PeriphInc = DMA_PINC_DISABLE; ADC1_DMA_Handler.Init.MemInc = DMA_MINC_DISABLE; ADC1_DMA_Handler.Init.PeriphDataAlignment = DMA_PDATAALIGN_WORD; //外设数据存储格式为字(两个字节) ADC1_DMA_Handler.Init.MemDataAlignment = DMA_PDATAALIGN_WORD; //内存数据存储格式为字(两个字节) ADC1_Handler.Init.ContinuousConvMode=ENABLE; //启动连续转换模式 ADC1_DMA_Handler.Init.Mode = DMA_CIRCULAR; ADC1_DMA_Handler.Init.Priority = DMA_PRIORITY_LOW; ADC1_DMA_Handler.Init.FIFOMode = DMA_FIFOMODE_DISABLE; HAL_ADC_Init(&ADC1_Handler); HAL_DMA_Init(&ADC1_DMA_Handler); __HAL_LINKDMA(&ADC1_Handler,DMA_Handle,ADC1_DMA_Handler); #endif}int ADC1_GetValue(int channel,int chanque) { int val; ADC1_ChanConf.Channel=channel; ADC1_ChanConf.SamplingTime=ADC_SAMPLETIME_3CYCLES; ADC1_ChanConf.Rank=chanque; ADC1_ChanConf.SamplingTime=ADC_SAMPLETIME_480CYCLES; //采样时间 ADC1_ChanConf.Offset=0; HAL_ADC_ConfigChannel(&ADC1_Handler,&ADC1_ChanConf); ADC1status=HAL_ADC_Start(&ADC1_Handler); if(ADC1status!=1) {#if ADC1_DMA_ON HAL_ADC_Start_DMA(&ADC1_Handler,(uint32_t*)&dma_val,1); val=dma_val; return val;#else val=(int)HAL_ADC_GetValue(&ADC1_Handler); return val;#endif } else return -1;}