diff --git a/Device/ADC.cpp b/Device/ADC.cpp index eef6be0e..c587c42d 100644 --- a/Device/ADC.cpp +++ b/Device/ADC.cpp @@ -1,8 +1,6 @@ #include "ADC.h" -#include "Platform\stm32.h" - -Pin ADC_Pins[] = ADC1_PINS; +//Pin _Pins[] = ADC1_PINS; ADConverter::ADConverter(byte line, uint channel) { @@ -20,15 +18,17 @@ ADConverter::ADConverter(byte line, uint channel) Buffer(Data, sizeof(Data)).Clear(); - ADC_TypeDef* const g_ADCs[]= ADCS; - _ADC = g_ADCs[line - 1]; + _PinCount = 0; + _ADC = nullptr; + + OnInit(); } void ADConverter::Add(Pin pin) { - for(int i=0; iDR; //ADC地址 - //dma.DMA_MemoryBaseAddr = (uint)&Data; //内存地址 - //dma.DMA_DIR = DMA_DIR_PeripheralSRC; - dma.DMA_BufferSize = Count; - dma.DMA_PeripheralInc = DMA_PeripheralInc_Disable; //外设地址固定 - dma.DMA_MemoryInc = DMA_MemoryInc_Enable; //内存地址固定 - dma.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord; //半字 - dma.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord; - dma.DMA_Mode = DMA_Mode_Circular; //循环传输 - dma.DMA_Priority = DMA_Priority_High; - //dma.DMA_M2M = DMA_M2M_Disable; - DMA_Init(DMA1_Stream0, &dma); - - /* Enable DMA channel1 */ - DMA_Cmd(DMA1_Stream0, ENABLE); -#else - DMA_DeInit(DMA1_Channel1); - - DMA_InitTypeDef dma; - DMA_StructInit(&dma); - dma.DMA_PeripheralBaseAddr = (uint)&at->DR; //ADC地址 - dma.DMA_MemoryBaseAddr = (uint)&Data; //内存地址 - dma.DMA_DIR = DMA_DIR_PeripheralSRC; - dma.DMA_BufferSize = Count; - dma.DMA_PeripheralInc = DMA_PeripheralInc_Disable; //外设地址固定 - dma.DMA_MemoryInc = DMA_MemoryInc_Enable; //内存地址固定 - dma.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord; //半字 - dma.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord; - dma.DMA_Mode = DMA_Mode_Circular; //循环传输 - dma.DMA_Priority = DMA_Priority_High; - dma.DMA_M2M = DMA_M2M_Disable; - DMA_Init(DMA1_Channel1, &dma); - - /* Enable DMA channel1 */ - DMA_Cmd(DMA1_Channel1, ENABLE); -#endif - - /* ADC configuration */ - ADC_InitTypeDef adc; - ADC_StructInit(&adc); - -#if defined(STM32F1) || defined(GD32) - adc.ADC_Mode = ADC_Mode_Independent; //独立ADC模式 - adc.ADC_ScanConvMode = ENABLE ; //禁止扫描模式,扫描模式用于多通道采集 - adc.ADC_ContinuousConvMode = ENABLE; //开启连续转换模式,即不停地进行ADC转换 - adc.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; //不使用外部触发转换 - adc.ADC_DataAlign = ADC_DataAlign_Right; //采集数据右对齐 - adc.ADC_NbrOfChannel = Count; //要转换的通道数目1 - ADC_Init(at, &adc); - -#if defined(GD32) - RCC_ADCCLKConfig(RCC_ADCCLK_APB2_DIV6); -#else - /*配置ADC时钟,为PCLK2的8分频,即9MHz*/ - RCC_ADCCLKConfig(RCC_PCLK2_Div8); -#endif - - /*配置ADC1的通道10 11为55. 5个采样周期,序列为1 */ - //ADC_RegularChannelConfig(at, ADC_Channel_10, 1, ADC_SampleTime_55Cycles5); - dat = 1; - uint n = 1; - for(byte i=0; iDR; //ADC地址 + //dma.DMA_MemoryBaseAddr = (uint)&Data; //内存地址 + //dma.DMA_DIR = DMA_DIR_PeripheralSRC; + dma.DMA_BufferSize = Count; + dma.DMA_PeripheralInc = DMA_PeripheralInc_Disable; //外设地址固定 + dma.DMA_MemoryInc = DMA_MemoryInc_Enable; //内存地址固定 + dma.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord; //半字 + dma.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord; + dma.DMA_Mode = DMA_Mode_Circular; //循环传输 + dma.DMA_Priority = DMA_Priority_High; + //dma.DMA_M2M = DMA_M2M_Disable; + DMA_Init(DMA1_Stream0, &dma); + + /* Enable DMA channel1 */ + DMA_Cmd(DMA1_Stream0, ENABLE); +#else + DMA_DeInit(DMA1_Channel1); + + DMA_InitTypeDef dma; + DMA_StructInit(&dma); + dma.DMA_PeripheralBaseAddr = (uint)&at->DR; //ADC地址 + dma.DMA_MemoryBaseAddr = (uint)&Data; //内存地址 + dma.DMA_DIR = DMA_DIR_PeripheralSRC; + dma.DMA_BufferSize = Count; + dma.DMA_PeripheralInc = DMA_PeripheralInc_Disable; //外设地址固定 + dma.DMA_MemoryInc = DMA_MemoryInc_Enable; //内存地址固定 + dma.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord; //半字 + dma.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord; + dma.DMA_Mode = DMA_Mode_Circular; //循环传输 + dma.DMA_Priority = DMA_Priority_High; + dma.DMA_M2M = DMA_M2M_Disable; + DMA_Init(DMA1_Channel1, &dma); + + /* Enable DMA channel1 */ + DMA_Cmd(DMA1_Channel1, ENABLE); +#endif + + /* ADC configuration */ + ADC_InitTypeDef adc; + ADC_StructInit(&adc); + +#if defined(STM32F1) || defined(GD32) + adc.ADC_Mode = ADC_Mode_Independent; //独立ADC模式 + adc.ADC_ScanConvMode = ENABLE ; //禁止扫描模式,扫描模式用于多通道采集 + adc.ADC_ContinuousConvMode = ENABLE; //开启连续转换模式,即不停地进行ADC转换 + adc.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; //不使用外部触发转换 + adc.ADC_DataAlign = ADC_DataAlign_Right; //采集数据右对齐 + adc.ADC_NbrOfChannel = Count; //要转换的通道数目1 + ADC_Init(at, &adc); + +#if defined(GD32) + RCC_ADCCLKConfig(RCC_ADCCLK_APB2_DIV6); +#else + /*配置ADC时钟,为PCLK2的8分频,即9MHz*/ + RCC_ADCCLKConfig(RCC_PCLK2_Div8); +#endif + + /*配置ADC1的通道10 11为55. 5个采样周期,序列为1 */ + //ADC_RegularChannelConfig(at, ADC_Channel_10, 1, ADC_SampleTime_55Cycles5); + uint dat = 1; + uint n = 1; + for(byte i=0; i