/******************************************************************************* * 函 数 名: * 功 能: * 参 数: * 返 回: *******************************************************************************/ void ADC1_Init() { ADC_InitTypeDef ADC_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE ); //初始化ADC的IO ADC1_PinInit(GPIOA, GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3); //72M/6=12,ADC最大时间不能超过14M RCC_ADCCLKConfig(RCC_PCLK2_Div6); ADC_DeInit(ADC1); //独立工作模式 ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; ADC_InitStructure.ADC_ScanConvMode = DISABLE; //单次转换 ADC_InitStructure.ADC_ContinuousConvMode = DISABLE; //不使用外部触发 ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; //顺序进行规则转换的ADC通道的数目 ADC_InitStructure.ADC_NbrOfChannel = 1; ADC_Init(ADC1, &ADC_InitStructure); ADC_TempSensorVrefintCmd(ENABLE); ADC_Cmd(ADC1, ENABLE); //重置指定的ADC1的校准寄存器 ADC_ResetCalibration(ADC1); //获取ADC1重置校准寄存器的状态,等待设置状态结束 while(ADC_GetResetCalibrationStatus(ADC1)); //开始指定ADC1的校准状态 ADC_StartCalibration(ADC1); //获取指定ADC1的校准程序,设置状态则等待 while(ADC_GetCalibrationStatus(ADC1)); //使能指定的ADC1的软件转换启动功能 ADC_SoftwareStartConvCmd(ADC1, ENABLE); }
void ADC_Configuration(void) { ADC_InitTypeDef ADC_InitStructure; ADC_DeInit(ADC1); RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE); ADC_InitStructure.ADC_ContinuousConvMode = ENABLE; ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; ADC_InitStructure.ADC_NbrOfChannel = 12; ADC_InitStructure.ADC_ScanConvMode = ENABLE; ADC_Init(ADC1, &ADC_InitStructure); /* Convert the ADC1 Channel 11 with 239.5 Cycles as sampling time */ //ACS712 0-2.5 V ADC_RegularChannelConfig(ADC1, ADC_Channel_13, 1, ADC_SampleTime_239Cycles5); //12 ADC_RegularChannelConfig(ADC1, ADC_Channel_12, 2, ADC_SampleTime_239Cycles5); //5 ADC_RegularChannelConfig(ADC1, ADC_Channel_11, 3, ADC_SampleTime_239Cycles5); //3.3 //Resistance ADC_RegularChannelConfig(ADC1, ADC_Channel_6, 4, ADC_SampleTime_239Cycles5); //3.3 ADC_RegularChannelConfig(ADC1, ADC_Channel_14, 5, ADC_SampleTime_239Cycles5); //5 ADC_RegularChannelConfig(ADC1, ADC_Channel_7, 6, ADC_SampleTime_239Cycles5); //12 //Voltmetr ADC_RegularChannelConfig(ADC1, ADC_Channel_3, 7, ADC_SampleTime_239Cycles5); //12 ADC_RegularChannelConfig(ADC1, ADC_Channel_2, 8, ADC_SampleTime_239Cycles5); //5 ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 9, ADC_SampleTime_239Cycles5); //3.3 ADC_RegularChannelConfig(ADC1, ADC_Channel_4, 10,ADC_SampleTime_239Cycles5);//5 ST ADC_RegularChannelConfig(ADC1, ADC_Channel_10, 11,ADC_SampleTime_239Cycles5);//POWER ADC_RegularChannelConfig(ADC1, ADC_Channel_0,12,ADC_SampleTime_239Cycles5);//Power good /* Enable ADCperipheral */ ADC_Cmd(ADC1, ENABLE); ADC_DMACmd(ADC1, ENABLE); ADC_ResetCalibration(ADC1); //while(ADC_GetResetCalibrationStatus(ADC1)); ADC_StartCalibration(ADC1); //while(ADC_GetCalibrationStatus(ADC1)); ADC_SoftwareStartConvCmd(ADC1,ENABLE); };
/* * ===================================================================================== * * Filename: thermcouple.c * * Description: * * Version: 1.0 * Created: 2013/3/23 20:10:37 * Revision: none * Compiler: gcc * * Author: RY (good lucky), [email protected] * Organization: * * ===================================================================================== */ #include "thermcouple.h" uint16_t oldTemparture; void thermcoupleIOinit(void)/*{{{*/ { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); //GPIOB时钟 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //口线翻转速度为50MHz GPIO_InitStructure.GPIO_Pin = ThermcoupleSck_Pin; GPIO_Init(ThermcoupleSck_Port, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = ThermcoupleCs_Pin; GPIO_Init(ThermcoupleCs_Port, &GPIO_InitStructure); // GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_InitStructure.GPIO_Pin = ThermcoupleDo_Pin; GPIO_Init(ThermcoupleDo_Port, &GPIO_InitStructure); oldTemparture=25; }/*}}}*/ uint16_t thermcoupleReadTemp(void)/*{{{*/ { uint16_t data=0; uint8_t i,result; bool badTemperature=false; bool haveData=false; GPIO_ResetBits(ThermcoupleSck_Port,ThermcoupleSck_Pin); GPIO_ResetBits(ThermcoupleCs_Port,ThermcoupleCs_Pin); delay_us(20); for(i=0;i<16;i++) { GPIO_SetBits(ThermcoupleSck_Port,ThermcoupleSck_Pin); delay_us(1); if(i>=1 && i<11) { data=data<<1; if(GPIO_ReadInputDataBit(ThermcoupleDo_Port,ThermcoupleDo_Pin)) { data=data|0x01; haveData=true; } } if(i==13) { if(GPIO_ReadInputDataBit(ThermcoupleDo_Port,ThermcoupleDo_Pin)) badTemperature=true; } delay_us(1); GPIO_ResetBits(ThermcoupleSck_Port,ThermcoupleSck_Pin); delay_us(2); } GPIO_SetBits(ThermcoupleCs_Port,ThermcoupleCs_Pin); delay_us(20); GPIO_ResetBits(ThermcoupleSck_Port,ThermcoupleSck_Pin); if(badTemperature) { data=oldTemparture; } else { } return data; }/*}}}*/ void thermistorIOinit(void)/*{{{*/ { GPIO_InitTypeDef GPIO_InitStructure; ADC_InitTypeDef ADC_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); //GPIOC时钟 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //口线翻转速度为50MHz GPIO_InitStructure.GPIO_Pin = HeaterBoardTherm_Pin; GPIO_Init(HeaterBoardTherm_Port,&GPIO_InitStructure); RCC_ADCCLKConfig(RCC_CFGR_ADCPRE_DIV6);//ADC时钟PLCK2的6分频 12M。ADC最大时钟不能超过14M! RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE); ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;//工作在独立模式 ADC_InitStructure.ADC_ScanConvMode = ENABLE; //使能扫描 ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;//ADC转换工作在连续模式 ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;//有软件控制转换 ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;//转换数据右对齐 ADC_InitStructure.ADC_NbrOfChannel = 1;//转换通道1个 ADC_Init(ADC1, &ADC_InitStructure); //初始化ADC ADC_RegularChannelConfig(ADC1, ADC_Channel_11,1, ADC_SampleTime_239Cycles5);//选择ADC1 通道11(因为是ADC_11),次序1,采样239.5周期 ADC_Cmd(ADC1, ENABLE);//使能ADC1 ADC_ResetCalibration(ADC1); //重置ADC1校准寄存器 while(ADC_GetResetCalibrationStatus(ADC1));//等待ADC1校准重置完成 ADC_StartCalibration(ADC1);//开始ADC1校准 while(ADC_GetCalibrationStatus(ADC1));//等待ADC1校准完成 ADC_SoftwareStartConvCmd(ADC1, ENABLE); //使能ADC1软件开始转换 }/*}}}*/
/******************************************************************************* * Function Name : adc_Config * Description : adc配置 * Input : none * Output : None * Return : none *******************************************************************************/ void Adc_Config(void) { ADC_InitTypeDef ADC_InitStructure; /* ADC1 configuration ------------------------------------------------------*/ ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; //独立模式 ADC_InitStructure.ADC_ScanConvMode = ENABLE; //连续多通道模式 ADC_InitStructure.ADC_ContinuousConvMode = ENABLE; //连续转换 ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; //转换不受外界决定 ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; //右对齐 ADC_InitStructure.ADC_NbrOfChannel = 2; //扫描通道数 //设置转换序列长度为2 ADC_Init(ADC1, &ADC_InitStructure); ////调用函数,初始化ADC1 /* ADC1 regular channel9 configuration */ ADC_RegularChannelConfig(ADC1, ADC_Channel_4, 1, ADC_SampleTime_55Cycles5); ADC_RegularChannelConfig(ADC1, ADC_Channel_9, 2, ADC_SampleTime_55Cycles5); //通道X,采样时间为1.5周期,1代表规则通道第1个 /* Enable ADC1 DMA [使能ADC1 DMA]*/ ADC_DMACmd(ADC1, ENABLE); /* Enable ADC1 */ ADC_Cmd(ADC1, ENABLE); /******下面是ADC自动校准,开机后需执行一次,保证精度*******/ /* Enable ADC1 reset calibaration register */ ADC_ResetCalibration(ADC1); /* Check the end of ADC1 reset calibration register */ while(ADC_GetResetCalibrationStatus(ADC1)); /* Start ADC1 calibaration */ ADC_StartCalibration(ADC1); /* Check the end of ADC1 calibration */ while(ADC_GetCalibrationStatus(ADC1)); /*****************************************************/ /* Start ADC1 Software Conversion */ ADC_SoftwareStartConvCmd(ADC1, ENABLE); }
/** * @brief Main program * @param None * @retval : None */ int main(void) { /* System clocks configuration ---------------------------------------------*/ RCC_Configuration(); /* NVIC configuration ------------------------------------------------------*/ NVIC_Configuration(); /* GPIO configuration ------------------------------------------------------*/ GPIO_Configuration(); /* DMA1 channel1 configuration ----------------------------------------------*/ DMA_DeInit(DMA1_Channel1); DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address; DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)&ADC1ConvertedValue; DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC; DMA_InitStructure.DMA_BufferSize = 1; DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Disable; DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord; DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord; DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; DMA_InitStructure.DMA_Priority = DMA_Priority_High; DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; DMA_Init(DMA1_Channel1, &DMA_InitStructure); /* Enable DMA1 channel1 */ DMA_Cmd(DMA1_Channel1, ENABLE); /* DMA2 channel5 configuration ----------------------------------------------*/ DMA_DeInit(DMA2_Channel5); DMA_InitStructure.DMA_PeripheralBaseAddr = ADC3_DR_Address; DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)&ADC3ConvertedValue; DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC; DMA_InitStructure.DMA_BufferSize = 1; DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Disable; DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord; DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord; DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; DMA_InitStructure.DMA_Priority = DMA_Priority_High; DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; DMA_Init(DMA2_Channel5, &DMA_InitStructure); /* Enable DMA2 channel5 */ DMA_Cmd(DMA2_Channel5, ENABLE); /* ADC1 configuration ------------------------------------------------------*/ ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; ADC_InitStructure.ADC_ScanConvMode = DISABLE; ADC_InitStructure.ADC_ContinuousConvMode = ENABLE; ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; ADC_InitStructure.ADC_NbrOfChannel = 1; ADC_Init(ADC1, &ADC_InitStructure); /* ADC1 regular channels configuration */ ADC_RegularChannelConfig(ADC1, ADC_Channel_14, 1, ADC_SampleTime_28Cycles5); /* Enable ADC1 DMA */ ADC_DMACmd(ADC1, ENABLE); /* ADC2 configuration ------------------------------------------------------*/ ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; ADC_InitStructure.ADC_ScanConvMode = DISABLE; ADC_InitStructure.ADC_ContinuousConvMode = ENABLE; ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; ADC_InitStructure.ADC_NbrOfChannel = 1; ADC_Init(ADC2, &ADC_InitStructure); /* ADC2 regular channels configuration */ ADC_RegularChannelConfig(ADC2, ADC_Channel_13, 1, ADC_SampleTime_28Cycles5); /* Enable ADC2 EOC interupt */ ADC_ITConfig(ADC2, ADC_IT_EOC, ENABLE); /* ADC3 configuration ------------------------------------------------------*/ ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; ADC_InitStructure.ADC_ScanConvMode = DISABLE; ADC_InitStructure.ADC_ContinuousConvMode = ENABLE; ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; ADC_InitStructure.ADC_NbrOfChannel = 1; ADC_Init(ADC3, &ADC_InitStructure); /* ADC3 regular channel14 configuration */ ADC_RegularChannelConfig(ADC3, ADC_Channel_12, 1, ADC_SampleTime_28Cycles5); /* Enable ADC3 DMA */ ADC_DMACmd(ADC3, ENABLE); /* Enable ADC1 */ ADC_Cmd(ADC1, ENABLE); /* Enable ADC1 reset calibaration register */ ADC_ResetCalibration(ADC1); /* Check the end of ADC1 reset calibration register */ while(ADC_GetResetCalibrationStatus(ADC1)); /* Start ADC1 calibaration */ ADC_StartCalibration(ADC1); /* Check the end of ADC1 calibration */ while(ADC_GetCalibrationStatus(ADC1)); /* Enable ADC2 */ ADC_Cmd(ADC2, ENABLE); /* Enable ADC2 reset calibaration register */ ADC_ResetCalibration(ADC2); /* Check the end of ADC2 reset calibration register */ while(ADC_GetResetCalibrationStatus(ADC2)); /* Start ADC2 calibaration */ ADC_StartCalibration(ADC2); /* Check the end of ADC2 calibration */ while(ADC_GetCalibrationStatus(ADC2)); /* Enable ADC3 */ ADC_Cmd(ADC3, ENABLE); /* Enable ADC3 reset calibaration register */ ADC_ResetCalibration(ADC3); /* Check the end of ADC3 reset calibration register */ while(ADC_GetResetCalibrationStatus(ADC3)); /* Start ADC3 calibaration */ ADC_StartCalibration(ADC3); /* Check the end of ADC3 calibration */ while(ADC_GetCalibrationStatus(ADC3)); /* Start ADC1 Software Conversion */ ADC_SoftwareStartConvCmd(ADC1, ENABLE); /* Start ADC2 Software Conversion */ ADC_SoftwareStartConvCmd(ADC2, ENABLE); /* Start ADC3 Software Conversion */ ADC_SoftwareStartConvCmd(ADC3, ENABLE); while (1) { } }
void ADC1Stop(void) { ADC_ClearFlag(ADC1, ADC_FLAG_EOC); ADC_SoftwareStartConvCmd(ADC1, DISABLE); ADC_Cmd(ADC1, DISABLE); }
void ADC_Configuration(void) { ADC1_Convertion_buff=malloc(ADC_BUFF_SIZE); //64 samples * 2 for interleaving, * 2bytes/sample==256 ADC_InitTypeDef ADC_InitStructure; DMA_InitTypeDef DMA_InitStructure; /* PCLK2 is the APB2 clock */ /* ADCCLK = PCLK2/6 = 72/6 = 12MHz*/ RCC_ADCCLKConfig(RCC_PCLK2_Div6); /* Enable ADC1,2 clock so that we can talk to them */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC2, ENABLE); /*Enable the DMA1 clk*/ RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE); /* Put everything back to power-on defaults */ ADC_DeInit(ADC1); ADC_DeInit(ADC2); /* ADC2 Configuration ------------------------------------------------------*/ /* ADC1 and ADC2 operate independently */ ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; /* Enable the scan conversion so we do three at a time */ ADC_InitStructure.ADC_ScanConvMode = ENABLE; /* Don't do contimuous conversions - do them on demand */ ADC_InitStructure.ADC_ContinuousConvMode = DISABLE; /* Start conversin by software, not an external trigger */ ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; /* Conversions are 12 bit - put them in the lower 12 bits of the result */ ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; /* Say how many channels would be used by the sequencer */ ADC_InitStructure.ADC_NbrOfChannel = 1; /* Now do the setup */ ADC_Init(ADC2, &ADC_InitStructure); /* ADC2 injected channel configuration */ #if BOARD<3 ADC_InjectedSequencerLengthConfig(ADC2, 2);//two conversions #else ADC_InjectedSequencerLengthConfig(ADC2, 3);//three conversions on the version 3 pcb - thermistor on the sensor #endif ADC_InjectedChannelConfig(ADC2, PRESSURE_ADC_CHAN, 1, ADC_SampleTime_239Cycles5); //ADC_InjectedChannelConfig(ADC2, 16, 3, ADC_SampleTime_239Cycles5);//on die temperature sensor - only on adc1 :-( ADC_InjectedChannelConfig(ADC2, BATTERY_ADC_CHAN, 2, ADC_SampleTime_239Cycles5); #if BOARD>=3 ADC_InjectedChannelConfig(ADC2, THERMISTOR_ADC_CHAN, 3, ADC_SampleTime_239Cycles5); #endif ADC_ExternalTrigInjectedConvConfig(ADC2, ADC_ExternalTrigInjecConv_None);//set sw injected channels /* Set the analogue watchdog on the battery voltage conversion*/ ADC_AnalogWatchdogCmd(ADC2,ADC_AnalogWatchdog_SingleInjecEnable); ADC_AnalogWatchdogThresholdsConfig(ADC2,0x0FFF,(uint16_t)((float)SAMPLING_FACTOR*MINIMUM_VOLTAGE));//watchdog fires on low voltage ADC_AnalogWatchdogSingleChannelConfig(ADC2, BATTERY_ADC_CHAN);//set the watchdog to the battery voltage channel ADC_ITConfig(ADC2, ADC_IT_AWD, ENABLE);//enable the analogue watchdog interrupt /* Enable the die temperature sensing and vref internal inputs to adc1*/ //ADC_TempSensorVrefintCmd(ENABLE); /* Enable ADC2 */ ADC_Cmd(ADC2, ENABLE); /* Enable ADC2 reset calibaration register */ ADC_ResetCalibration(ADC2); /* Check the end of ADC2 reset calibration register */ while(ADC_GetResetCalibrationStatus(ADC2)); /* Start ADC2 calibaration */ ADC_StartCalibration(ADC2); /* Check the end of ADC2 calibration */ while(ADC_GetCalibrationStatus(ADC2)); readADC2(BATTERY_ADC_CHAN);//Have to flush this for some reason /* ADC2 is now set up - move the ADC1 using DMA*/ /* DMA1 channel1(ADC1) configuration -------------------------------------------*/ DMA_DeInit(DMA1_Channel1); DMA_StructInit(&DMA_InitStructure); DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&ADC1->DR; DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)ADC1_Convertion_buff; DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC; DMA_InitStructure.DMA_BufferSize = ADC_BUFF_SIZE/2;//2bytes/sample DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord; DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord; DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; DMA_InitStructure.DMA_Priority = DMA_Priority_High; DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; DMA_Init(DMA1_Channel1, &DMA_InitStructure); DMA_ITConfig(DMA1_Channel1, DMA_IT_TC | DMA_IT_HT, ENABLE);//interrupt on complete and half complete DMA_ClearFlag(DMA1_FLAG_TC1|DMA1_FLAG_HT1); //make sure flags are clear /* Enable DMA1 channel1 */ DMA_Cmd(DMA1_Channel1, ENABLE); /* ADC1 configuration ------------------------------------------------------*/ ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; ADC_InitStructure.ADC_ScanConvMode = DISABLE; ADC_InitStructure.ADC_ContinuousConvMode = ENABLE; ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; ADC_InitStructure.ADC_NbrOfChannel = 1; ADC_Init(ADC1, &ADC_InitStructure); /* ADC1 regular channel configuration */ ADC_RegularChannelConfig(ADC1, CRT_PPG_ADC_CHAN, 1, ADC_SampleTime_1Cycles5);/*239Cycles5);*/ /* Enable ADC1 DMA */ ADC_DMACmd(ADC1, ENABLE); /* Enable ADC1 */ ADC_Cmd(ADC1, ENABLE); /* Calibrate the ADC1*/ ADC_ResetCalibration(ADC1); while (ADC_GetResetCalibrationStatus(ADC1)); ADC_StartCalibration(ADC1); while (ADC_GetCalibrationStatus(ADC1)); ADC_SoftwareStartConvCmd(ADC1, ENABLE); /* Enable the NVIC interrupt */ DMA_ISR_Config(); }
/* * @brief Read the analog value of a pin. * Should return a 16-bit value, 0-65536 (0 = LOW, 65536 = HIGH) * Note: ADC is 12-bit. Currently it returns 0-4096 */ int32_t analogRead(uint16_t pin) { // Allow people to use 0-7 to define analog pins by checking to see if the values are too low. if (pin < FIRST_ANALOG_PIN) { pin = pin + FIRST_ANALOG_PIN; } // SPI safety check if (SPI.isEnabled() == true && (pin == SCK || pin == MOSI || pin == MISO)) { return LOW; } // I2C safety check if (Wire.isEnabled() == true && (pin == SCL || pin == SDA)) { return LOW; } // Serial1 safety check if (Serial1.isEnabled() == true && (pin == RX || pin == TX)) { return LOW; } if (pin >= TOTAL_PINS || PIN_MAP[pin].adc_channel == NONE ) { return LOW; } int i = 0; if (adcChannelConfigured != PIN_MAP[pin].adc_channel) { digitalPinModeSaved = PIN_MAP[pin].pin_mode; pinMode(pin, AN_INPUT); } if (adcInitFirstTime == true) { ADC_DMA_Init(); adcInitFirstTime = false; } if (adcChannelConfigured != PIN_MAP[pin].adc_channel) { // ADC1 regular channel configuration ADC_RegularChannelConfig(ADC1, PIN_MAP[pin].adc_channel, 1, ADC_Sample_Time); // ADC2 regular channel configuration ADC_RegularChannelConfig(ADC2, PIN_MAP[pin].adc_channel, 1, ADC_Sample_Time); // Save the ADC configured channel adcChannelConfigured = PIN_MAP[pin].adc_channel; } for(i = 0 ; i < ADC_DMA_BUFFERSIZE ; i++) { ADC_DualConvertedValues[i] = 0; } // Reset the number of data units in the DMA1 Channel1 transfer DMA_SetCurrDataCounter(DMA1_Channel1, ADC_DMA_BUFFERSIZE); // Enable ADC2 external trigger conversion ADC_ExternalTrigConvCmd(ADC2, ENABLE); // Enable DMA1 Channel1 DMA_Cmd(DMA1_Channel1, ENABLE); // Enable ADC1 DMA ADC_DMACmd(ADC1, ENABLE); // Start ADC1 Software Conversion ADC_SoftwareStartConvCmd(ADC1, ENABLE); // Test on Channel 1 DMA1_FLAG_TC flag while(!DMA_GetFlagStatus(DMA1_FLAG_TC1)); // Clear Channel 1 DMA1_FLAG_TC flag DMA_ClearFlag(DMA1_FLAG_TC1); // Disable ADC1 DMA ADC_DMACmd(ADC1, DISABLE); // Disable DMA1 Channel1 DMA_Cmd(DMA1_Channel1, DISABLE); uint16_t ADC1_ConvertedValue = 0; uint16_t ADC2_ConvertedValue = 0; uint32_t ADC_SummatedValue = 0; uint16_t ADC_AveragedValue = 0; for(int i = 0 ; i < ADC_DMA_BUFFERSIZE ; i++) { // Retrieve the ADC2 converted value and add to ADC_SummatedValue ADC2_ConvertedValue = ADC_DualConvertedValues[i] >> 16; ADC_SummatedValue += ADC2_ConvertedValue; // Retrieve the ADC1 converted value and add to ADC_SummatedValue ADC1_ConvertedValue = ADC_DualConvertedValues[i] & 0xFFFF; ADC_SummatedValue += ADC1_ConvertedValue; } ADC_AveragedValue = (uint16_t)(ADC_SummatedValue / (ADC_DMA_BUFFERSIZE * 2)); // Return ADC averaged value return ADC_AveragedValue; }
void ADC1_Mode_Config() { DMA_InitTypeDef DMA_InitStructure; ADC_InitTypeDef ADC_InitStructure; DMA_DeInit(DMA1_Channel1); DMA_InitStructure.DMA_PeripheralBaseAddr=ADC1_DR_Address; DMA_InitStructure.DMA_MemoryBaseAddr=(u32)&ADC_ConvertedValue; DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC; DMA_InitStructure.DMA_BufferSize = 4; DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord; DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord; DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; DMA_InitStructure.DMA_Priority = DMA_Priority_High; DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; DMA_Init(DMA1_Channel1, &DMA_InitStructure); /* Enable DMA channel1 */ DMA_Cmd(DMA1_Channel1, ENABLE); /* ADC1 configuration ------------------------------------------------------*/ ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; //独立模式 CR1 ADC_InitStructure.ADC_ScanConvMode = ENABLE; //扫描模式使能 ADC_InitStructure.ADC_ContinuousConvMode = ENABLE; //连续转换模式使能 ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; //启动转换的外部事件--无 CR2 ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; //转换后的数据右对齐 ADC_InitStructure.ADC_NbrOfChannel = 4; //转换的通道数为1 ADC_Init(ADC1, &ADC_InitStructure); /* ADC1 regular channel14 configuration */ //ADC12_IN8 //ADC12_IN9 //ADC12_IN10 //ADC12_IN14 ADC_RegularChannelConfig(ADC1, ADC_Channel_8, 1, ADC_SampleTime_41Cycles5); //通道11采样时间 ADC_RegularChannelConfig(ADC1, ADC_Channel_9, 2, ADC_SampleTime_41Cycles5); ADC_RegularChannelConfig(ADC1, ADC_Channel_10, 3, ADC_SampleTime_41Cycles5); //通道11采样时间 ADC_RegularChannelConfig(ADC1, ADC_Channel_14, 4, ADC_SampleTime_41Cycles5); /* Enable ADC1 DMA */ ADC_DMACmd(ADC1, ENABLE);//允许ADC1进行DMA传送 /* Enable ADC1 */ ADC_Cmd(ADC1, ENABLE);//使能ADC1 /* Enable ADC1 reset calibaration register */ ADC_ResetCalibration(ADC1);//允许ADC1复位校准寄存器 /* Check the end of ADC1 reset calibration register */ // while(ADC_GetResetCalibrationStatus(ADC1)); //检测校准寄存器是否复位完成 /* Start ADC1 calibaration */ ADC_StartCalibration(ADC1);//启动ADC1 校准 /* Check the end of ADC1 calibration */ while(ADC_GetCalibrationStatus(ADC1)); //检测校准是否完成 /* Start ADC1 Software Conversion */ ADC_SoftwareStartConvCmd(ADC1, ENABLE);//软件触发启动ADC1转换 }
static void ADCSample_DMATransmit_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; DMA_InitTypeDef DMA_InitStructure; ADC_InitTypeDef ADC_InitStructure; /* Enable ADC1 and GPIOC clock */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 |RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC, ENABLE); /* Configure PC. as analog input */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; GPIO_Init(GPIOC, &GPIO_InitStructure); // GPIO_ResetBits(GPIOC , GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; GPIO_Init(GPIOB, &GPIO_InitStructure); // GPIO_ResetBits(GPIOB , GPIO_Pin_0|GPIO_Pin_1); #if 1 /* Enable DMA clock */ RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE); /* DMA channel1 configuration */ DMA_DeInit(DMA1_Channel1); DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address; //ADC地址 DMA_InitStructure.DMA_MemoryBaseAddr = (u32)ADC_Value_Raw;//内存地址 DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC; DMA_InitStructure.DMA_BufferSize = ADC_RANK_NUM; DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; //内存地址递增 DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord; //半字 DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord; DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; //循环传输 DMA_InitStructure.DMA_Priority = DMA_Priority_High; DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; DMA_Init(DMA1_Channel1, &DMA_InitStructure); /* 开启DMA传输完成中断 */ DMA_ITConfig(DMA1_Channel1, DMA_IT_TC, ENABLE); /* Enable DMA channel1 */ DMA_Cmd(DMA1_Channel1, ENABLE); #endif /* ADC1 configuration */ ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; //独立ADC模式 ADC_InitStructure.ADC_ScanConvMode = ENABLE ; //扫描模式用于多通道采集 ADC_InitStructure.ADC_ContinuousConvMode = ENABLE; //开启连续转换模式,即不停地进行ADC转换 ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; //不使用外部触发转换 ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; //采集数据右对齐 ADC_InitStructure.ADC_NbrOfChannel = ADC_RANK_NUM; //要转换的通道数目 ADC_Init(ADC1, &ADC_InitStructure); /*配置ADC1的通道为55. 5个采样周期,序列为 */ #if 1 RCC_ADCCLKConfig(RCC_PCLK2_Div8); ADC_RegularChannelConfig(ADC1, ADC_Channel_10, RANK_NO_1, ADC_SampleTime_55Cycles5); ADC_RegularChannelConfig(ADC1, ADC_Channel_11, RANK_NO_2, ADC_SampleTime_55Cycles5); ADC_RegularChannelConfig(ADC1, ADC_Channel_12, RANK_NO_3, ADC_SampleTime_55Cycles5); ADC_RegularChannelConfig(ADC1, ADC_Channel_13, RANK_NO_4, ADC_SampleTime_55Cycles5); ADC_RegularChannelConfig(ADC1, ADC_Channel_14, RANK_NO_5, ADC_SampleTime_55Cycles5); ADC_RegularChannelConfig(ADC1, ADC_Channel_15, RANK_NO_6, ADC_SampleTime_55Cycles5); ADC_RegularChannelConfig(ADC1, ADC_Channel_8, RANK_NO_7, ADC_SampleTime_55Cycles5); ADC_RegularChannelConfig(ADC1, ADC_Channel_9, RANK_NO_8, ADC_SampleTime_55Cycles5); #endif /* Enable ADC1 DMA */ ADC_DMACmd(ADC1, ENABLE); /* Enable ADC1 */ ADC_Cmd(ADC1, ENABLE); /*复位校准寄存器 */ ADC_ResetCalibration(ADC1); /*等待校准寄存器复位完成 */ while(ADC_GetResetCalibrationStatus(ADC1)); /* ADC校准 */ ADC_StartCalibration(ADC1); /* 等待校准完成*/ while(ADC_GetCalibrationStatus(ADC1)); /* 由于没有采用外部触发,所以使用软件触发ADC转换 */ ADC_SoftwareStartConvCmd(ADC1, ENABLE); /* Enable DMA channel1 */ // DMA_Cmd(DMA1_Channel1, ENABLE); }
int ybs_drv_init(void) { GPIO_InitTypeDef GPIO_InitStructure; ADC_InitTypeDef ADC_InitStructure; TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; NVIC_InitTypeDef NVIC_InitStructure; //mos ctrl, PB0, high off, low on RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; GPIO_Init(GPIOB, &GPIO_InitStructure); //adc, PA1, ADC12_IN1 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); RCC_ADCCLKConfig(RCC_PCLK2_Div8); /*72Mhz/8 = 9Mhz*/ RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; GPIO_Init(GPIOA, &GPIO_InitStructure); ADC_DeInit(ADC1); ADC_StructInit(&ADC_InitStructure); ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; ADC_InitStructure.ADC_ScanConvMode = DISABLE; ADC_InitStructure.ADC_ContinuousConvMode = DISABLE; ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; ADC_Init(ADC1, &ADC_InitStructure); ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 1, ADC_SampleTime_71Cycles5); //9Mhz/(71.5 + 12.5) = 107.1Khz ADC_Cmd(ADC1, ENABLE); /* Enable ADC1 reset calibaration register */ ADC_ResetCalibration(ADC1); while(ADC_GetResetCalibrationStatus(ADC1)); ADC_StartCalibration(ADC1); while (ADC_GetCalibrationStatus(ADC1)); ADC_Cmd(ADC1, ENABLE); ADC_SoftwareStartConvCmd(ADC1, ENABLE); //TIM4 TIMEBASE RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE); TIM_TimeBaseStructure.TIM_Period = YBS_US - 1; TIM_TimeBaseStructure.TIM_Prescaler = 72 - 1; //Fapb1 = TIM_clk = 72Mhz, Tick = 1us TIM_TimeBaseStructure.TIM_ClockDivision = 0; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseStructure.TIM_RepetitionCounter = 0; TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure); //TIM_ARRPreloadConfig(TIM4, ENABLE); TIM_Cmd(TIM4, DISABLE); TIM_ClearFlag(TIM4, TIM_FLAG_Update); TIM_ITConfig(TIM4, TIM_IT_Update, ENABLE); //IRQ OF TIM4 NVIC_InitStructure.NVIC_IRQChannel = TIM4_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); //DAC static const struct ad5663_cfg_s ad5663_cfg = { .spi = &spi1, .gpio_cs = SPI_1_NSS, .gpio_ldac = SPI_CS_PA2, .gpio_clr = SPI_CS_PA3, }; dev_register("ad5663", &ad5663_cfg); ybs_fd_dac = dev_open("dac0", 0); dev_ioctl(ybs_fd_dac, DAC_SET_CH, 1); //for fast ch1 write purpose return 0; }
/******************************************************************************* *Функция инициализации портов кнопок ******************************************************************************/ void keyInit(uint8_t mode) { #ifdef SYSTEM_STM32 GPIO_InitTypeDef GPIO_InitStructure; //Структура настройки GPIO EXTI_InitTypeDef EXTI_InitStructure; ADC_InitTypeDef ADC_InitStructure;//Структура настройки АЦП NVIC_InitTypeDef NVIC_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);//Включаем порт А if(mode == MODE_ADC) { //Настроим пин джойстика АЦП GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;//Это свободный вход GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;// Это ADC2 нога PA0 GPIO_Init(GPIOA, &GPIO_InitStructure); RCC_ADCCLKConfig(RCC_PCLK2_Div2);//Частота ADC (max 14MHz --> 72/2=9MHz) RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC2, ENABLE);//Включаем тактирование АЦП //Определяем конфигурацию ADC ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; ADC_InitStructure.ADC_ScanConvMode = DISABLE; ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;//Работаем в режиме одноразового преобразования ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; ADC_InitStructure.ADC_NbrOfChannel = 1; ADC_RegularChannelConfig(ADC2, ADC_Channel_0, 1, ADC_SampleTime_1Cycles5);//Время выборки АЦП ADC_Init(ADC2, &ADC_InitStructure);//Применить конфигурацию ADC2 ADC_Cmd(ADC2, ENABLE);//Включаем ADC. Необходимо для калибровки // ADC calibration (optional, but recommended at power on) ADC_ResetCalibration(ADC2);// Reset previous calibration while (ADC_GetResetCalibrationStatus(ADC2)); ADC_StartCalibration(ADC2);// Start new calibration (ADC must be off at that time) while (ADC_GetCalibrationStatus(ADC2)); // start conversion ADC_Cmd(ADC2, ENABLE);//enable ADC2 ADC_SoftwareStartConvCmd(ADC2, ENABLE);// start conversion (will be endless as we are in continuous mode) SysTick_task_add(&readKey, 10); //Заряжаем таймер на чтение кнопок через каждые 10 миллисекунд } else if(mode == MODE_INT) { SysTick_task_del(&readKey); //Удаляем задачу чтения нажатий RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE);//Включаем тактирование порта A и альтернативной функции GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //Это свободный вход GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;// GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;// Это PA0 GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0);// выбор порта на котором хотим получить внешнее прерывание EXTI_InitStructure.EXTI_Line = EXTI_Line0;// выбираем линию порта EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;// настраиваем на внешнее прерывание EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; EXTI_InitStructure.EXTI_LineCmd = ENABLE; EXTI_Init(&EXTI_InitStructure); //далее идут настройки приоритета прерываний. NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 13; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 15; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); NVIC_EnableIRQ(EXTI0_IRQn);//разрешаем прерывание } state.button = BUTTON_LOCK; //Блокируем первое нажатие клавиши #endif }
/*----------------------------------------------------------------------------*/ void sys_adc_init() { GPIO_InitTypeDef GPIO_InitStructure; ADC_InitTypeDef ADC_InitStructure; DMA_InitTypeDef DMA_InitStructure; /* Enable DMA1 clock */ RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE); #define DIV RCC_PCLK2_Div2 //#define DIV RCC_PCLK2_Div4 //#define DIV RCC_PCLK2_Div6 //#define DIV RCC_PCLK2_Div8 RCC_ADCCLKConfig(DIV); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE); /* GPIO */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; //GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOC, &GPIO_InitStructure); /* DMA1 channel1 configuration ----------------------------------------------*/ DMA_DeInit(DMA1_Channel1); DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address; DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)&adc_buffer; DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC; DMA_InitStructure.DMA_BufferSize = ADC_BUFFER_SIZE; DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord; DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord; DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; DMA_InitStructure.DMA_Priority = DMA_Priority_High; DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; DMA_Init(DMA1_Channel1, &DMA_InitStructure); /* Enable DMA1 channel1 */ DMA_Cmd(DMA1_Channel1, ENABLE); /* ADC1 configuration ------------------------------------------------------*/ ADC_Cmd(ADC1, DISABLE); ADC_DeInit(ADC1); ADC_StructInit(&ADC_InitStructure); ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; ADC_InitStructure.ADC_ScanConvMode = ENABLE; ADC_InitStructure.ADC_ContinuousConvMode = ENABLE; ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; ADC_InitStructure.ADC_NbrOfChannel = 1; ADC_Init(ADC1, &ADC_InitStructure); /* ADC1 regular channel12 configuration */ //#define SAMPLE_TIME ADC_SampleTime_1Cycles5 //#define SAMPLE_TIME ADC_SampleTime_7Cycles5 //#define SAMPLE_TIME ADC_SampleTime_13Cycles5 #define SAMPLE_TIME ADC_SampleTime_28Cycles5 //#define SAMPLE_TIME ADC_SampleTime_41Cycles5 //#define SAMPLE_TIME ADC_SampleTime_55Cycles5 //#define SAMPLE_TIME ADC_SampleTime_71Cycles5 //#define SAMPLE_TIME ADC_SampleTime_239Cycles5 ADC_RegularChannelConfig(ADC1, ADC_Channel_12, 1, SAMPLE_TIME); /* Enable ADC1 DMA */ ADC_DMACmd(ADC1, ENABLE); /* Enable ADC1 */ ADC_Cmd(ADC1, ENABLE); sys_sleep(2); /* Enable ADC1 reset calibration register */ ADC_ResetCalibration(ADC1); /* Check the end of ADC1 reset calibration register */ while(ADC_GetResetCalibrationStatus(ADC1)); /* Start ADC1 calibration */ ADC_StartCalibration(ADC1); /* Check the end of ADC1 calibration */ while(ADC_GetCalibrationStatus(ADC1)); /* Start ADC1 Software Conversion */ ADC_SoftwareStartConvCmd(ADC1, ENABLE); #ifdef USE_CONSOLE console_cmd_init(&adc_console1); adc_console1.cmd = "adc"; adc_console1.help = "adc - ADC read ADC DMA statistic"; adc_console1.handler = adc_cmd1; console_add_cmd(&adc_console1); #endif //USE_CONSOLE }
/******************************************************************************* * Function Name : main * Description : Main program * Input : None * Output : None * Return : None *******************************************************************************/ int main(void) { /* define local values */ u16 DataValue = 0x0; u16 Keta = 0; u16 cnt = 0; // counter u32 wcnt = 0; // counter for wait u16 Temperature = 0 ; u8 a, b, c, d; #ifdef DEBUG debug(); #endif /* System Clocks Configuration */ RCC_Configuration(); /* NVIC configuration */ NVIC_Configuration(); /* Configure the GPIO ports */ GPIO_Configuration(); // ADC用のGPIOの設定はしなくていいよね。 /* USART2 configuration ------------------------------------------------------*/ /* USART2 configured as follow: - BaudRate = 115200 baud - Word Length = 8 Bits - One Stop Bit - No parity - Hardware flow control enabled (RTS and CTS signals) - Receive and transmit enabled */ USART_InitStructure.USART_BaudRate = 115200; USART_InitStructure.USART_WordLength = USART_WordLength_8b; USART_InitStructure.USART_StopBits = USART_StopBits_1; USART_InitStructure.USART_Parity = USART_Parity_No ; USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_RTS_CTS; USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; USART_Init(USART2, &USART_InitStructure); /* Enable the USART2 */ USART_Cmd(USART2, ENABLE); /* ADC1 configuration ------------------------------------------------------*/ ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; ADC_InitStructure.ADC_ScanConvMode = ENABLE; ADC_InitStructure.ADC_ContinuousConvMode = ENABLE; ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; ADC_InitStructure.ADC_NbrOfChannel = 1; ADC_Init(ADC1, &ADC_InitStructure); /* ADC1 regular channels configuration */ ADC_RegularChannelConfig(ADC1, ADC_Channel_16, 1, ADC_SampleTime_239Cycles5); ADC_RegularChannelConfig(ADC1, ADC_Channel_17, 2, ADC_SampleTime_239Cycles5); /* Enable ADC1 DMA */ // ADC_DMACmd(ADC1, ENABLE); /* Enable Vrefint channel17 */ ADC_TempSensorVrefintCmd(ENABLE); /* Enable ADC1 */ ADC_Cmd(ADC1, ENABLE); /* Enable ADC1 reset calibaration register */ ADC_ResetCalibration(ADC1); /* Check the end of ADC1 reset calibration register */ while(ADC_GetResetCalibrationStatus(ADC1)); /* Start ADC1 calibaration */ ADC_StartCalibration(ADC1); /* Check the end of ADC1 calibration */ while(ADC_GetCalibrationStatus(ADC1)); /* Start ADC1 Software Conversion */ ADC_SoftwareStartConvCmd(ADC1, ENABLE); /* Test on DMA1 channel1 transfer complete flag */ //while(!DMA_GetFlagStatus(DMA1_FLAG_TC1)); /* Clear DMA1 channel1 transfer complete flag */ //DMA_ClearFlag(DMA1_FLAG_TC1); /* DEBUG MARKER */ /* ************* */ /* Turn on led connected to PC.06 pin */ //GPIO_SetBits(GPIOC, GPIO_Pin_6); /* Turn off led connected to PC.06 pin */ GPIO_ResetBits(GPIOC, GPIO_Pin_6); /* Communication hyperterminal-USART2 using hardware flow control -------------*/ /* Send a buffer from USART to hyperterminal */ while(NbrOfDataToTransfer--) { USART_SendData(USART2, TxBuffer[TxCounter++]); while(USART_GetFlagStatus(USART2, USART_FLAG_TXE) == RESET); } /* ************* */ while (1){ //while( ADC_GetFlagStatus( ADC1, ADC_FLAG_EOC) == RESET ); //DataValue = ADCConvertedValue; while( ADC_GetFlagStatus( ADC1, ADC_FLAG_EOC) == RESET ); while( ( wcnt++ % 0x400000) != 0x0 ){ // wait loop DataValue = ADC_GetConversionValue(ADC1); } Temperature= (1.42 - DataValue*3.3/4096)*1000/4.35 + 25; DataValue = Temperature; // rotate value. Keta = ( DataValue & 0xf000 ) / 0x1000 ; Keta = (( DataValue & 0x0f00 ) / 0x10 ) + Keta ; Keta = (( DataValue & 0x00f0 ) * 0x10 ) + Keta ; Keta = (( DataValue & 0x000f ) * 0x1000 ) + Keta ; DataValue = Keta ; // printf ( "%s", DataValue ); for ( cnt = 0 ; cnt < 4 ; cnt++ ){ Keta = 0 ; if ( DataValue % 16 >= 10 ){ Keta = 'A' + ( DataValue % 16 - 10 ); } else { Keta = '0' + ( DataValue % 16 ); } DataValue = DataValue /16 ; USART_SendData(USART2, Keta ); while(USART_GetFlagStatus(USART2, USART_FLAG_TXE) == RESET); } // printf( "\n\r" ); USART_SendData(USART2, '\n'); while(USART_GetFlagStatus(USART2, USART_FLAG_TXE) == RESET); USART_SendData(USART2, '\r'); while(USART_GetFlagStatus(USART2, USART_FLAG_TXE) == RESET); } /* Receive a string (Max RxBufferSize bytes) from the Hyperterminal ended by '\r' (Enter key) */ do { if((USART_GetFlagStatus(USART2, USART_FLAG_RXNE) != RESET)&&(RxCounter < RxBufferSize)) { RxBuffer[RxCounter] = USART_ReceiveData(USART2); USART_SendData(USART2, RxBuffer[RxCounter++]); } } while((RxBuffer[RxCounter - 1] != '\r')&&(RxCounter != RxBufferSize)); while (1) { } }
/** * @brief Main program * @param None * @retval : None */ int main(void) { /* System Clocks Configuration */ RCC_Configuration(); /* Configure the GPIO ports */ GPIO_Configuration(); /* DMA1 Channel5 configuration ----------------------------------------------*/ DMA_DeInit(DMA1_Channel5); DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)TIM1_CCR1_Address; DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)ADC1_DR_Address; DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST; DMA_InitStructure.DMA_BufferSize = 1; DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Disable; DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord; DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord; DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; DMA_InitStructure.DMA_Priority = DMA_Priority_High; DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; DMA_Init(DMA1_Channel5, &DMA_InitStructure); /* Enable DMA1 Channel5 */ DMA_Cmd(DMA1_Channel5, ENABLE); /* ADC1 configuration ------------------------------------------------------*/ ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; ADC_InitStructure.ADC_ScanConvMode = DISABLE; ADC_InitStructure.ADC_ContinuousConvMode = ENABLE; ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; ADC_InitStructure.ADC_NbrOfChannel = 1; ADC_Init(ADC1, &ADC_InitStructure); /* ADC1 RegularChannelConfig Test */ ADC_RegularChannelConfig(ADC1, ADC_Channel_14, 1, ADC_SampleTime_55Cycles5); /* TIM1 configuration ------------------------------------------------------*/ /* Time Base configuration */ TIM_TimeBaseStructInit(&TIM_TimeBaseStructure); TIM_TimeBaseStructure.TIM_Period = 0xFF0; TIM_TimeBaseStructure.TIM_Prescaler = 0x0; TIM_TimeBaseStructure.TIM_ClockDivision = 0x0; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure); /* Channel1 Configuration in PWM mode */ TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; TIM_OC1Init(TIM1, &TIM_OCInitStructure); /* Enable TIM1 */ TIM_Cmd(TIM1, ENABLE); /* Enable TIM1 outputs */ TIM_CtrlPWMOutputs(TIM1, ENABLE); /* Enable TIM1 DMA interface */ TIM_DMACmd(TIM1, TIM_DMA_Update, ENABLE); /* Enable ADC1 */ ADC_Cmd(ADC1, ENABLE); /* Enable ADC1 reset calibaration register */ ADC_ResetCalibration(ADC1); /* Check the end of ADC1 reset calibration register */ while(ADC_GetResetCalibrationStatus(ADC1)); /* Start ADC1 calibaration */ ADC_StartCalibration(ADC1); /* Check the end of ADC1 calibration */ while(ADC_GetCalibrationStatus(ADC1)); /* Start ADC1 conversion */ ADC_SoftwareStartConvCmd(ADC1, ENABLE); while (1) { } }
void ADCwithDMA_Config(void){ ADC_InitTypeDef ADC_InitStructure; DMA_InitTypeDef DMA_InitStructure; //DMA RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE); /* PCLK2 is the APB2 clock */ /* ADCCLK = PCLK2/6 = 72/6 = 12MHz*/ RCC_ADCCLKConfig(RCC_PCLK2_Div6); /* Enable ADC1 clock so that we can talk to it */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE); /* Put everything back to power-on defaults */ ADC_DeInit(ADC1); /* DMA1 channel1 configuration ----------------------------------------------*/ DMA_DeInit(DMA1_Channel1); DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address; DMA_InitStructure.DMA_MemoryBaseAddr = (u32)&(ADC.raw[0]); // Data direction: Peripheral is source DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC; // Data Buffer Size DMA_InitStructure.DMA_BufferSize = 9; // Do not increment Peripheral Address Register DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; // Do increment destination memory pointer DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord; DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord; // Transport data repeatedly DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; DMA_InitStructure.DMA_Priority = DMA_Priority_High; // Memory to Memory Mode Disabled DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; // Enable DMA Channel DMA_Init(DMA1_Channel1, &DMA_InitStructure); #ifdef ADC_DMA_TransferCompleteInterrupt /* Enable DMA1 Channel Transfer Complete interrupt */ DMA_ITConfig(DMA1_Channel1, DMA_IT_TC, ENABLE); #endif //ADC_DMA_TransferCompleteInterrupt /* Enable DMA1 channel1 */ DMA_Cmd(DMA1_Channel1, ENABLE); /* ADC1 configuration ------------------------------------------------------*/ ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; ADC_InitStructure.ADC_ScanConvMode = ENABLE; ADC_InitStructure.ADC_ContinuousConvMode = ENABLE; ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; // number of ADC channels that will be converted using the sequencer ADC_InitStructure.ADC_NbrOfChannel = 9; ADC_Init(ADC1, &ADC_InitStructure); /* ADC1 regular channels configuration */ ADC_RegularChannelConfig(ADC1, ADC_Channel_10, 1, ADC_SampleTime_71Cycles5); //AIN0 ADC_RegularChannelConfig(ADC1, ADC_Channel_11, 2, ADC_SampleTime_71Cycles5); //AIN1 ADC_RegularChannelConfig(ADC1, ADC_Channel_4, 3, ADC_SampleTime_71Cycles5); //MOTORCURRENT ADC_RegularChannelConfig(ADC1, ADC_Channel_5, 4, ADC_SampleTime_71Cycles5); //THERM0 ADC_RegularChannelConfig(ADC1, ADC_Channel_6, 5, ADC_SampleTime_71Cycles5); //THERM1 ADC_RegularChannelConfig(ADC1, ADC_Channel_14, 6, ADC_SampleTime_71Cycles5); //PVCC ADC_RegularChannelConfig(ADC1, ADC_Channel_15, 7, ADC_SampleTime_71Cycles5); //24V ADC_RegularChannelConfig(ADC1, ADC_Channel_8, 8, ADC_SampleTime_71Cycles5); //12V ADC_RegularChannelConfig(ADC1, ADC_Channel_9, 9, ADC_SampleTime_71Cycles5); //5V /* Enable ADC1 DMA */ ADC_DMACmd(ADC1, ENABLE); /* Enable ADC1 */ ADC_Cmd(ADC1, ENABLE); /* Enable ADC1 reset calibaration register */ ADC_ResetCalibration(ADC1); /* Check the end of ADC1 reset calibration register */ while(ADC_GetResetCalibrationStatus(ADC1)); /* Start ADC1 calibaration */ ADC_StartCalibration(ADC1); /* Check the end of ADC1 calibration */ while(ADC_GetCalibrationStatus(ADC1)); /* Start ADC1 Software Conversion */ ADC_SoftwareStartConvCmd(ADC1, ENABLE); ADC.uVoltsPerUnit = 7975; ADC.unitsOffset = 0; ADC.logicZeroMax_mV = 6000; ADC.logicOneMin_mV = 18000; }
/**************************************************************************** * 名 称:void ADC_Configuration(void) * 功 能:ADC 配置函数 * 入口参数:无 * 出口参数:无 * 说 明: * 调用方法: ****************************************************************************/ void ADC_Configuration(void) { GPIO_InitTypeDef GPIO_InitStructure; ADC_InitTypeDef ADC_InitStructure; // GPIO_InitTypeDef GPIO_InitStructure; DMA_InitTypeDef DMA_InitStructure; // //设置AD模拟输入端口为输入 1路AD 规则通道 // GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; // GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; // GPIO_Init(GPIOC, &GPIO_InitStructure); /* Enable DMA clock */ RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE); /* Enable ADC1 and GPIOC clock */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE); /* DMA channel1 configuration ----------------------------------------------*/ //使能DMA DMA_DeInit(DMA1_Channel1); DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address; //DMA通道1的地址 DMA_InitStructure.DMA_MemoryBaseAddr = (u32)&ADC_ConvertedValue[0]; //DMA传送地址 DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC; //传送方向 DMA_InitStructure.DMA_BufferSize = 10; //传送内存大小,100个16位 DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; //传送内存地址递增 DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord; //ADC1转换的数据是16位 DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord; //传送的目的地址是16位宽度 DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; //循环 DMA_InitStructure.DMA_Priority = DMA_Priority_Medium; DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; DMA_Init(DMA1_Channel1, &DMA_InitStructure); /* 允许DMA1通道1传输结束中断 */ //DMA_ITConfig(DMA1_Channel1,DMA_IT_TC, ENABLE); //使能DMA通道1 DMA_Cmd(DMA1_Channel1, ENABLE); //配置PA2模拟输入,检测电池电压 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; GPIO_Init(GPIOA, &GPIO_InitStructure); // PA2,输入时不用设置速率 //ADC配置 /* Resets ADC1 */ ADC_DeInit(ADC1); ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; //ADC1工作在独立模式 ADC_InitStructure.ADC_ScanConvMode = ENABLE; //模数转换工作在扫描模式(多通道)还是单次(单通道)模式 ADC_InitStructure.ADC_ContinuousConvMode = ENABLE; //模数转换工作在扫描模式(多通道)还是单次(单通道)模式 ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;//转换由软件而不是外部触发启动 ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;//ADC数据右对齐 ADC_InitStructure.ADC_NbrOfChannel = 2; //规定了顺序进行规则转换的ADC通道的数目。这个数目的取值范围是1到16 ADC_Init(ADC1, &ADC_InitStructure); /* ADC1 regular channels configuration [规则模式通道配置]*/ //ADC1 规则通道配置 ADC_RegularChannelConfig(ADC1, ADC_Channel_16, 1, ADC_SampleTime_239Cycles5); //通道16样时间 239.5周期 ADC_RegularChannelConfig(ADC1, ADC_Channel_2, 2, ADC_SampleTime_239Cycles5); //通道16样时间 239.5周期 ADC_TempSensorVrefintCmd(ENABLE); //使能ADC1 DMA ADC_DMACmd(ADC1, ENABLE); //使能ADC1 ADC_Cmd(ADC1, ENABLE); // 初始化ADC1校准寄存器 ADC_ResetCalibration(ADC1); //检测ADC1校准寄存器初始化是否完成 while(ADC_GetResetCalibrationStatus(ADC1)); //开始校准ADC1 ADC_StartCalibration(ADC1); //检测是否完成校准 while(ADC_GetCalibrationStatus(ADC1)); //ADC1转换启动 ADC_SoftwareStartConvCmd(ADC1, ENABLE); }
/** * @brief Main program * @param None * @retval None */ int main(void) { /*!< At this stage the microcontroller clock setting is already configured, this is done through SystemInit() function which is called from startup file (startup_stm32f10x_xx.s) before to branch to application main. To reconfigure the default setting of SystemInit() function, refer to system_stm32f10x.c file */ /* System clocks configuration ---------------------------------------------*/ RCC_Configuration(); /* GPIO configuration ------------------------------------------------------*/ GPIO_Configuration(); /* DMA1 channel1 configuration ----------------------------------------------*/ DMA_DeInit(DMA1_Channel1); DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)ADC1_DR_Address; DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)ADC_DualConvertedValueTab; DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC; DMA_InitStructure.DMA_BufferSize = 16; DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Word; DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Word; DMA_InitStructure.DMA_Mode = DMA_Mode_Normal; DMA_InitStructure.DMA_Priority = DMA_Priority_High; DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; DMA_Init(DMA1_Channel1, &DMA_InitStructure); /* Enable DMA1 Channel1 */ DMA_Cmd(DMA1_Channel1, ENABLE); /* ADC1 configuration ------------------------------------------------------*/ ADC_InitStructure.ADC_Mode = ADC_Mode_RegSimult; ADC_InitStructure.ADC_ScanConvMode = ENABLE; ADC_InitStructure.ADC_ContinuousConvMode = ENABLE; ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; ADC_InitStructure.ADC_NbrOfChannel = 2; ADC_Init(ADC1, &ADC_InitStructure); /* ADC1 regular channels configuration */ ADC_RegularChannelConfig(ADC1, ADC_Channel_14, 1, ADC_SampleTime_239Cycles5); ADC_RegularChannelConfig(ADC1, ADC_Channel_17, 2, ADC_SampleTime_239Cycles5); /* Enable ADC1 DMA */ ADC_DMACmd(ADC1, ENABLE); /* ADC2 configuration ------------------------------------------------------*/ ADC_InitStructure.ADC_Mode = ADC_Mode_RegSimult; ADC_InitStructure.ADC_ScanConvMode = ENABLE; ADC_InitStructure.ADC_ContinuousConvMode = ENABLE; ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; ADC_InitStructure.ADC_NbrOfChannel = 2; ADC_Init(ADC2, &ADC_InitStructure); /* ADC2 regular channels configuration */ ADC_RegularChannelConfig(ADC2, ADC_Channel_11, 1, ADC_SampleTime_239Cycles5); ADC_RegularChannelConfig(ADC2, ADC_Channel_12, 2, ADC_SampleTime_239Cycles5); /* Enable ADC2 external trigger conversion */ ADC_ExternalTrigConvCmd(ADC2, ENABLE); /* Enable ADC1 */ ADC_Cmd(ADC1, ENABLE); /* Enable Vrefint channel17 */ ADC_TempSensorVrefintCmd(ENABLE); /* Enable ADC1 reset calibaration register */ ADC_ResetCalibration(ADC1); /* Check the end of ADC1 reset calibration register */ while(ADC_GetResetCalibrationStatus(ADC1)); /* Start ADC1 calibaration */ ADC_StartCalibration(ADC1); /* Check the end of ADC1 calibration */ while(ADC_GetCalibrationStatus(ADC1)); /* Enable ADC2 */ ADC_Cmd(ADC2, ENABLE); /* Enable ADC2 reset calibaration register */ ADC_ResetCalibration(ADC2); /* Check the end of ADC2 reset calibration register */ while(ADC_GetResetCalibrationStatus(ADC2)); /* Start ADC2 calibaration */ ADC_StartCalibration(ADC2); /* Check the end of ADC2 calibration */ while(ADC_GetCalibrationStatus(ADC2)); /* Start ADC1 Software Conversion */ ADC_SoftwareStartConvCmd(ADC1, ENABLE); /* Test on DMA1 channel1 transfer complete flag */ while(!DMA_GetFlagStatus(DMA1_FLAG_TC1)); /* Clear DMA1 channel1 transfer complete flag */ DMA_ClearFlag(DMA1_FLAG_TC1); while (1) { } }
static void adc1_mode_config( void) { DMA_InitTypeDef dma_init_structure; ADC_InitTypeDef adc_init_structure; /* 复位 ADC1,将与DMA有关的寄存器设我初始值; */ DMA_DeInit( DMA1_Channel1); /*定义DMA外设基地址, 这里的ADC1_DR_Address 是用户自己定义的,即为存放转换结果的寄存器; ,他的作用就是告诉DMA取数就到ADC1_DR_Address 这里来取。;*/ dma_init_structure.DMA_PeripheralBaseAddr = ADC1_DR_ADDRESS; /*定义内存基地址,即告诉DMA要将从AD中取来的数放到ADC_ConvertedValue中 ;*/ dma_init_structure.DMA_MemoryBaseAddr = ( uint32_t)&s_adc1_converted_value; /*定义AD外设作为数据传输的来源,即告诉DMA是将AD中的数据取出放到内存中,不能反过来;*/ dma_init_structure.DMA_DIR = DMA_DIR_PeripheralSRC; /*指定DMA通道的DMA缓存的大小,即告诉DMA开辟几个内存空间,由于我们只取通道10的AD数据所以只需开辟一个内存空间;*/ dma_init_structure.DMA_BufferSize = 1; //dma_init_structure.DMA_BufferSize = 2; /*设定寄存器地址固定,即告诉DMA,只从固定的一个地方取数;*/ dma_init_structure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; /*设定内存地址固定,即每次DMA,,只将数搬到固定的内存中;*/ dma_init_structure.DMA_MemoryInc = DMA_MemoryInc_Disable; /*设定内存地址递加,即每次DMA都是将该外设寄存器中的值传到两个内存空间中;*/ //DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; /*设定外设数据宽度,即告诉DMA要取的数的大小,半字(16位);*/ dma_init_structure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord; /*设定内存的的宽度;*/ dma_init_structure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord; /*设定DMA工作再循环缓存模式,即告诉DMA要不停的搬运,不能偷懒;*/ dma_init_structure.DMA_Mode = DMA_Mode_Circular; /*设定DMA选定的通道软件优先级;*/ dma_init_structure.DMA_Priority = DMA_Priority_High; dma_init_structure.DMA_M2M = DMA_M2M_Disable; DMA_Init( DMA1_Channel1, &dma_init_structure); DMA_Cmd( DMA1_Channel1, ENABLE); /* ADC1 configuration */ /*设置ADC工作在独立模式;*/ adc_init_structure.ADC_Mode = ADC_Mode_Independent; /*规定AD转换工作在扫描模式,即对多个通道采样;*/ //ADC_InitStructure.ADC_ScanConvMode = ENABLE /*规定AD转换工作在单次模式,即对一个通道采样;*/ adc_init_structure.ADC_ScanConvMode = DISABLE; /*设定AD转化在连续模式;*/ adc_init_structure.ADC_ContinuousConvMode = ENABLE; /*不使用外部促发转换;*/ adc_init_structure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; /*采集的数据在寄存器中以右对齐的方式存放;*/ adc_init_structure.ADC_DataAlign = ADC_DataAlign_Right; /*设定要转换的AD通道数目;*/ adc_init_structure.ADC_NbrOfChannel = 1; //adc_init_structure.ADC_NbrOfChannel = 2; ADC_Init( ADC1, &adc_init_structure); /*配置ADC时钟,为PCLK2的8分频,即9MHz;*/ RCC_ADCCLKConfig( RCC_PCLK2_Div8); /*配置ADC1的通道11为55.5个采样周期; */ ADC_RegularChannelConfig( ADC1,ADC_Channel_10,1,ADC_SampleTime_55Cycles5); //ADC_RegularChannelConfig( ADC1,ADC_Channel_11,1,ADC_SampleTime_55Cycles5); ADC_DMACmd( ADC1, ENABLE); ADC_Cmd( ADC1, ENABLE); ADC_ResetCalibration( ADC1); while( ADC_GetResetCalibrationStatus( ADC1) ); ADC_StartCalibration( ADC1); while( ADC_GetCalibrationStatus( ADC1)); /* 由于没有采用外部触发,所以使用软件触发ADC转换; */ ADC_SoftwareStartConvCmd( ADC1, ENABLE); }
void adcInit(drv_adc_config_t *init) { #if defined(CJMCU) || defined(CC3D) UNUSED(init); #endif uint8_t i; uint8_t configuredAdcChannels = 0; memset(&adcConfig, 0, sizeof(adcConfig)); GPIO_InitTypeDef GPIO_InitStructure; GPIO_StructInit(&GPIO_InitStructure); GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; #ifdef ADC1_GPIO if (init->channelMask & ADC_CHANNEL1_ENABLE) { GPIO_InitStructure.GPIO_Pin = ADC1_GPIO_PIN; GPIO_Init(ADC1_GPIO, &GPIO_InitStructure); adcConfig[ADC_CHANNEL_1].adcChannel = ADC1_CHANNEL; adcConfig[ADC_CHANNEL_1].dmaIndex = configuredAdcChannels++; adcConfig[ADC_CHANNEL_1].enabled = true; adcConfig[ADC_CHANNEL_1].sampleTime = ADC_SampleTime_239Cycles5; } #endif #ifdef ADC2_GPIO if (init->channelMask & ADC_CHANNEL2_ENABLE) { GPIO_InitStructure.GPIO_Pin = ADC2_GPIO_PIN; GPIO_Init(ADC2_GPIO, &GPIO_InitStructure); adcConfig[ADC_CHANNEL_2].adcChannel = ADC2_CHANNEL; adcConfig[ADC_CHANNEL_2].dmaIndex = configuredAdcChannels++; adcConfig[ADC_CHANNEL_2].enabled = true; adcConfig[ADC_CHANNEL_2].sampleTime = ADC_SampleTime_239Cycles5; } #endif #ifdef ADC3_GPIO if (init->channelMask & ADC_CHANNEL3_ENABLE) { GPIO_InitStructure.GPIO_Pin = ADC3_GPIO_PIN; GPIO_Init(ADC3_GPIO, &GPIO_InitStructure); adcConfig[ADC_CHANNEL_3].adcChannel = ADC3_CHANNEL; adcConfig[ADC_CHANNEL_3].dmaIndex = configuredAdcChannels++; adcConfig[ADC_CHANNEL_3].enabled = true; adcConfig[ADC_CHANNEL_3].sampleTime = ADC_SampleTime_239Cycles5; } #endif #ifdef ADC4_GPIO if (init->channelMask & ADC_CHANNEL4_ENABLE) { GPIO_InitStructure.GPIO_Pin = ADC4_GPIO_PIN; GPIO_Init(ADC4_GPIO, &GPIO_InitStructure); adcConfig[ADC_CHANNEL_4].adcChannel = ADC4_CHANNEL; adcConfig[ADC_CHANNEL_4].dmaIndex = configuredAdcChannels++; adcConfig[ADC_CHANNEL_4].enabled = true; adcConfig[ADC_CHANNEL_4].sampleTime = ADC_SampleTime_239Cycles5; } #endif RCC_ADCCLKConfig(RCC_PCLK2_Div8); // 9MHz from 72MHz APB2 clock(HSE), 8MHz from 64MHz (HSI) RCC_AHBPeriphClockCmd(ADC_AHB_PERIPHERAL, ENABLE); RCC_APB2PeriphClockCmd(ADC_ABP2_PERIPHERAL, ENABLE); // FIXME ADC driver assumes all the GPIO was already placed in 'AIN' mode DMA_DeInit(ADC_DMA_CHANNEL); DMA_InitTypeDef DMA_InitStructure; DMA_StructInit(&DMA_InitStructure); DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&ADC_INSTANCE->DR; DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)adcValues; DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC; DMA_InitStructure.DMA_BufferSize = configuredAdcChannels; DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; DMA_InitStructure.DMA_MemoryInc = configuredAdcChannels > 1 ? DMA_MemoryInc_Enable : DMA_MemoryInc_Disable; DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord; DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord; DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; DMA_InitStructure.DMA_Priority = DMA_Priority_High; DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; DMA_Init(ADC_DMA_CHANNEL, &DMA_InitStructure); DMA_Cmd(ADC_DMA_CHANNEL, ENABLE); ADC_InitTypeDef ADC_InitStructure; ADC_StructInit(&ADC_InitStructure); ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; ADC_InitStructure.ADC_ScanConvMode = configuredAdcChannels > 1 ? ENABLE : DISABLE; ADC_InitStructure.ADC_ContinuousConvMode = ENABLE; ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; ADC_InitStructure.ADC_NbrOfChannel = configuredAdcChannels; ADC_Init(ADC_INSTANCE, &ADC_InitStructure); uint8_t rank = 1; for (i = 0; i < ADC_CHANNEL_COUNT; i++) { if (!adcConfig[i].enabled) { continue; } ADC_RegularChannelConfig(ADC_INSTANCE, adcConfig[i].adcChannel, rank++, adcConfig[i].sampleTime); } ADC_DMACmd(ADC_INSTANCE, ENABLE); ADC_Cmd(ADC_INSTANCE, ENABLE); ADC_ResetCalibration(ADC_INSTANCE); while(ADC_GetResetCalibrationStatus(ADC_INSTANCE)); ADC_StartCalibration(ADC_INSTANCE); while(ADC_GetCalibrationStatus(ADC_INSTANCE)); ADC_SoftwareStartConvCmd(ADC_INSTANCE, ENABLE); }
void ADC_Config(void) { ADC_InitTypeDef ADC_InitStructure; DMA_InitTypeDef DMA_InitStructure; GPIO_InitTypeDef GPIO_InitStructure; TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_OCInitTypeDef TIM_OCInitStructure; RCC_ADCCLKConfig(RCC_PCLK2_Div8); RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 | RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOC, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; GPIO_Init(GPIOC, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1|GPIO_Pin_2; GPIO_Init(GPIOA, &GPIO_InitStructure); TIM_TimeBaseStructInit(&TIM_TimeBaseStructure); TIM_TimeBaseStructure.TIM_Period = 24; TIM_TimeBaseStructure.TIM_Prescaler = 224; TIM_TimeBaseStructure.TIM_ClockDivision = 0x0; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure); /* TIM1 channel1 configuration in PWM mode */ TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_Pulse = 0x7F; TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; TIM_OC1Init(TIM1, &TIM_OCInitStructure); /* DMA1 channel1 configuration ----------------------------------------------*/ DMA_DeInit(DMA1_Channel1); DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address; DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)&ADCConvertedValue; DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC; DMA_InitStructure.DMA_BufferSize = 5*256; DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord; DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord; DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; DMA_InitStructure.DMA_Priority = DMA_Priority_High; DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; DMA_Init(DMA1_Channel1, &DMA_InitStructure); /* ADC1 configuration ------------------------------------------------------*/ ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; ADC_InitStructure.ADC_ScanConvMode = ENABLE; ADC_InitStructure.ADC_ContinuousConvMode = ENABLE; ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; ADC_InitStructure.ADC_NbrOfChannel = 5; ADC_Init(ADC1, &ADC_InitStructure); /* ADC1 regular channel11 configuration */ ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 1, ADC_SampleTime_239Cycles5); ADC_RegularChannelConfig(ADC1, ADC_Channel_2, 2, ADC_SampleTime_239Cycles5); ADC_RegularChannelConfig(ADC1, ADC_Channel_11, 3, ADC_SampleTime_55Cycles5); ADC_RegularChannelConfig(ADC1, ADC_Channel_11, 4, ADC_SampleTime_55Cycles5); ADC_RegularChannelConfig(ADC1, ADC_Channel_11, 5, ADC_SampleTime_55Cycles5); /* Enable ADC1 DMA */ ADC_DMACmd(ADC1, ENABLE); /* Enable ADC1 */ ADC_Cmd(ADC1, ENABLE); /* Enable ADC1 reset calibration register */ ADC_ResetCalibration(ADC1); /* Check the end of ADC1 reset calibration register */ while(ADC_GetResetCalibrationStatus(ADC1)); /* Start ADC1 calibration */ ADC_StartCalibration(ADC1); /* Check the end of ADC1 calibration */ while(ADC_GetCalibrationStatus(ADC1)); /* Enable DMA1 channel1 */ DMA_Cmd(DMA1_Channel1, ENABLE); /* Start ADC1 Software Conversion */ ADC_SoftwareStartConvCmd(ADC1, ENABLE); }
void adcInit(const adcConfig_t *config) { uint8_t configuredAdcChannels = 0; memset(&adcOperatingConfig, 0, sizeof(adcOperatingConfig)); if (config->vbat.enabled) { adcOperatingConfig[ADC_BATTERY].tag = config->vbat.ioTag; } if (config->rssi.enabled) { adcOperatingConfig[ADC_RSSI].tag = config->rssi.ioTag; //RSSI_ADC_CHANNEL; } if (config->external1.enabled) { adcOperatingConfig[ADC_EXTERNAL1].tag = config->external1.ioTag; //EXTERNAL1_ADC_CHANNEL; } if (config->current.enabled) { adcOperatingConfig[ADC_CURRENT].tag = config->current.ioTag; //CURRENT_METER_ADC_CHANNEL; } ADCDevice device = adcDeviceByInstance(ADC_INSTANCE); if (device == ADCINVALID) return; const adcDevice_t adc = adcHardware[device]; bool adcActive = false; for (int i = 0; i < ADC_CHANNEL_COUNT; i++) { if (!adcOperatingConfig[i].tag) continue; adcActive = true; IOInit(IOGetByTag(adcOperatingConfig[i].tag), OWNER_ADC_BATT + i, 0); IOConfigGPIO(IOGetByTag(adcOperatingConfig[i].tag), IO_CONFIG(GPIO_Mode_AIN, 0)); adcOperatingConfig[i].adcChannel = adcChannelByTag(adcOperatingConfig[i].tag); adcOperatingConfig[i].dmaIndex = configuredAdcChannels++; adcOperatingConfig[i].sampleTime = ADC_SampleTime_239Cycles5; adcOperatingConfig[i].enabled = true; } if (!adcActive) { return; } RCC_ADCCLKConfig(RCC_PCLK2_Div8); // 9MHz from 72MHz APB2 clock(HSE), 8MHz from 64MHz (HSI) RCC_ClockCmd(adc.rccADC, ENABLE); dmaInit(dmaGetIdentifier(adc.DMAy_Channelx), OWNER_ADC, 0); DMA_DeInit(adc.DMAy_Channelx); DMA_InitTypeDef DMA_InitStructure; DMA_StructInit(&DMA_InitStructure); DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&adc.ADCx->DR; DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)adcValues; DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC; DMA_InitStructure.DMA_BufferSize = configuredAdcChannels; DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; DMA_InitStructure.DMA_MemoryInc = configuredAdcChannels > 1 ? DMA_MemoryInc_Enable : DMA_MemoryInc_Disable; DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord; DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord; DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; DMA_InitStructure.DMA_Priority = DMA_Priority_High; DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; DMA_Init(adc.DMAy_Channelx, &DMA_InitStructure); DMA_Cmd(adc.DMAy_Channelx, ENABLE); ADC_InitTypeDef ADC_InitStructure; ADC_StructInit(&ADC_InitStructure); ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; ADC_InitStructure.ADC_ScanConvMode = configuredAdcChannels > 1 ? ENABLE : DISABLE; ADC_InitStructure.ADC_ContinuousConvMode = ENABLE; ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; ADC_InitStructure.ADC_NbrOfChannel = configuredAdcChannels; ADC_Init(adc.ADCx, &ADC_InitStructure); uint8_t rank = 1; for (int i = 0; i < ADC_CHANNEL_COUNT; i++) { if (!adcOperatingConfig[i].enabled) { continue; } ADC_RegularChannelConfig(adc.ADCx, adcOperatingConfig[i].adcChannel, rank++, adcOperatingConfig[i].sampleTime); } ADC_DMACmd(adc.ADCx, ENABLE); ADC_Cmd(adc.ADCx, ENABLE); ADC_ResetCalibration(adc.ADCx); while (ADC_GetResetCalibrationStatus(adc.ADCx)); ADC_StartCalibration(adc.ADCx); while (ADC_GetCalibrationStatus(adc.ADCx)); ADC_SoftwareStartConvCmd(adc.ADCx, ENABLE); }
/** * @brief This function sets up a conversion from ADC2 (non blocking) * @param Channel number to convert * @retval None */ void setADC2(uint8_t channel) { ADC_RegularChannelConfig(ADC2, channel, 1, ADC_SampleTime_239Cycles5); // Start the conversion ADC_SoftwareStartConvCmd(ADC2, ENABLE); }
//---------------------------------------- static void Task_Led2(void* p_arg)//负责采集电压 { GPIO_InitTypeDef GPIO_InitStructure; ADC_InitTypeDef ADC_InitStructure; DMA_InitTypeDef DMA_InitStructure; INT16U shu[4]={0}; INT16U *s; vu16 ADC_ConvertedValue; RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 | RCC_APB2Periph_GPIOA, ENABLE); /* Configure PC.04 (ADC Channel14) as analog input -------------------------*/ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; GPIO_Init(GPIOA, &GPIO_InitStructure); /* DMA channel1 configuration ----------------------------------------------*/ DMA_DeInit(DMA1_Channel1); DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address; DMA_InitStructure.DMA_MemoryBaseAddr = (u32)&ADC_ConvertedValue; DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC; DMA_InitStructure.DMA_BufferSize = 2; DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Disable; DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord; DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord; DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; DMA_InitStructure.DMA_Priority = DMA_Priority_High; DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; DMA_Init(DMA1_Channel1, &DMA_InitStructure); /* Enable DMA channel1 */ //DMA_Cmd(DMA1_Channel1, ENABLE); /* ADC1 configuration ------------------------------------------------------*/ ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; //独立模式 CR1 ADC_InitStructure.ADC_ScanConvMode = ENABLE; //扫描模式使能 ADC_InitStructure.ADC_ContinuousConvMode = ENABLE; //连续转换模式使能 ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; //启动转换的外部事件--无 CR2 ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; //转换后的数据右对齐 ADC_InitStructure.ADC_NbrOfChannel = 1; //转换的通道数为1 ADC_Init(ADC1, &ADC_InitStructure); /* ADCCLK = PCLK2/4 */ RCC_ADCCLKConfig(RCC_PCLK2_Div6); /* ADC1 regular channel14 configuration */ ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_55Cycles5); //通道10采样时间 //ADC_DMACmd(ADC1, ENABLE); //允许ADC1进行DMA传送 /* Enable ADC1 */ ADC_Cmd(ADC1, ENABLE); //使能ADC1 /* Enable ADC1 reset calibaration register */ ADC_ResetCalibration(ADC1); //允许ADC1复位校准寄存器 /* Check the end of ADC1 reset calibration register */ while(ADC_GetResetCalibrationStatus(ADC1)); //检测校准寄存器是否复位完成 /* Start ADC1 calibaration */ ADC_StartCalibration(ADC1); //启动ADC1 校准 /* Check the end of ADC1 calibration */ while(ADC_GetCalibrationStatus(ADC1)); //检测校准是否完成 /* Start ADC1 Software Conversion */ ADC_SoftwareStartConvCmd(ADC1, ENABLE); //软件触发启动ADC1转换 (void) p_arg; while (1) { //while(0 == ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC)); if(ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC)) { shu[2]=shu[1]; shu[1]=shu[0]; shu[0]=ADC_GetConversionValue(ADC1);//获得ADC1的转换数据 } //shu[3]=0xff; //USART_OUT(USART1,"ADC_%d!\r\n",shu[0]); s=&shu[0]; //取出shu中的地址付给指针s OSMboxPost(SeMbox,s); OSTimeDlyHMSM(0, 0, 0, 500); } }
void ADC_Configuration(ADC_TypeDef* ADC,u16 ADC_Channel,float SampleTime) { u8 i=0; GPIO_InitTypeDef GPIO_InitStructure; ADC_InitTypeDef ADC_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); if(ADC==ADC1){RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);} else if(ADC==ADC2){RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC2, ENABLE);} else if(ADC==ADC3){RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC3, ENABLE);} if(ADC_Channel==0){GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;i=1;} else if(ADC_Channel==1){GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;i=1;} else if(ADC_Channel==2){GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;i=1;} else if(ADC_Channel==3){GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;i=1;} else if(ADC_Channel==4){GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;i=1;} else if(ADC_Channel==5){GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;i=1;} else if(ADC_Channel==6){GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;i=1;} else if(ADC_Channel==7){GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;i=1;} else if(ADC_Channel==8){GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;i=2;} else if(ADC_Channel==9){GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;i=2;} else if(ADC_Channel==10){GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;i=3;} else if(ADC_Channel==11){GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;i=3;} else if(ADC_Channel==12){GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;i=3;} else if(ADC_Channel==13){GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;i=3;} else if(ADC_Channel==14){GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;i=3;} else if(ADC_Channel==15){GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;i=3;} GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; //端口模式为模拟输入方式 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //翻转速度为50M if(i==1){GPIO_Init(GPIOA, &GPIO_InitStructure);} else if(i==2){GPIO_Init(GPIOB, &GPIO_InitStructure);} else if(i==3){GPIO_Init(GPIOC, &GPIO_InitStructure);} /* ADC 模数器转换配置 */ ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; //ADC1和ADC2独立工作模式 ADC_InitStructure.ADC_ScanConvMode = DISABLE; //ADC设置为单通道模式 ADC_InitStructure.ADC_ContinuousConvMode = ENABLE; //设置为连续转换模式 ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;//由软件控制开始转换 ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; //AD输出数值为右端对齐方式 ADC_InitStructure.ADC_NbrOfChannel = ADC_Channel; //指定要进行AD转换的信道 ADC_Init(ADC, &ADC_InitStructure); //用上面的参数初始化ADC /* ADC1信道1的转换通道配置 */ if (SampleTime==1.5) {ADC_RegularChannelConfig(ADC, ADC_Channel, 1, ADC_SampleTime_1Cycles5);} else if(SampleTime==7.5) {ADC_RegularChannelConfig(ADC, ADC_Channel, 1, ADC_SampleTime_7Cycles5);} else if(SampleTime==13.5) {ADC_RegularChannelConfig(ADC, ADC_Channel, 1, ADC_SampleTime_13Cycles5);} else if(SampleTime==28.5) {ADC_RegularChannelConfig(ADC, ADC_Channel, 1, ADC_SampleTime_28Cycles5);} else if(SampleTime==41.5) {ADC_RegularChannelConfig(ADC, ADC_Channel, 1, ADC_SampleTime_41Cycles5);} else if(SampleTime==55.5) {ADC_RegularChannelConfig(ADC, ADC_Channel, 1, ADC_SampleTime_55Cycles5);} else if(SampleTime==71.5) {ADC_RegularChannelConfig(ADC, ADC_Channel, 1, ADC_SampleTime_71Cycles5);} else if(SampleTime==239.5){ADC_RegularChannelConfig(ADC, ADC_Channel, 1, ADC_SampleTime_239Cycles5);} ADC_Cmd(ADC, ENABLE); //使能ADC ADC_ResetCalibration(ADC); //重置ADC校准寄存器 while(ADC_GetResetCalibrationStatus(ADC)); //得到重置校准寄存器状态 ADC_StartCalibration(ADC); //开始校准ADC while(ADC_GetCalibrationStatus(ADC)); //得到校准寄存器状态 ADC_SoftwareStartConvCmd(ADC, ENABLE); //使能ADC由软件控制开始转换 }
/* 函数名:ADC1_Mode_Config * 描述 :配置ADC1的工作模式为MDA模式 * 输入 : 无 * 输出 :无 * 调用 :内部调用 */ static void ADC1_Mode_Config(void) { DMA_InitTypeDef DMA_InitStructure; ADC_InitTypeDef ADC_InitStructure; /* DMA channel1 configuration */ DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address; // 外设基地址 DMA_InitStructure.DMA_MemoryBaseAddr = (u32)&ADC_ConvertedValue; // AD转换值所存放的内存基地址 (就是给个地址) DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC; // 外设作为数据传输的来源 DMA_InitStructure.DMA_BufferSize = 1; // 定义指定DMA通道 DMA缓存的大小 DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; // 外设地址寄存器不变 DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Disable; // 内存地址寄存器不变 DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord; // 数据宽度为16位 DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord; // HalfWord DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; //工作在循环模式下 DMA_InitStructure.DMA_Priority = DMA_Priority_High; //高优先级 DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; //没有设置为内存到内存的传输 DMA_Init(DMA1_Channel1, &DMA_InitStructure); /* Enable DMA channel1 */ DMA_Cmd(DMA1_Channel1, ENABLE); //ENABLE她 /* ADC1 configuration */ ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; //独立工作模式 ADC_InitStructure.ADC_ScanConvMode = ENABLE; //多通道 ADC_InitStructure.ADC_ContinuousConvMode = ENABLE; //连续转换 ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; //由软件触发启动 ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; //Right ADC_InitStructure.ADC_NbrOfChannel = 1; //仅一个通道转换 ADC_Init(ADC1, &ADC_InitStructure); /*配置ADC时钟,为PCLK2的8分频,即9Hz*/ RCC_ADCCLKConfig(RCC_PCLK2_Div8); /* ADC1 regular channel16 configuration */ //设置采样通道IN16, 设置采样时间 ADC_RegularChannelConfig(ADC1, ADC_Channel_16, 1, ADC_SampleTime_239Cycles5); //使能温度传感器和内部参考电压 ADC_TempSensorVrefintCmd(ENABLE); /* Enable ADC1 DMA */ ADC_DMACmd(ADC1, ENABLE); /* Enable ADC1 */ ADC_Cmd(ADC1, ENABLE); /* Enable ADC1 reset calibaration register */ ADC_ResetCalibration(ADC1); /* Check the end of ADC1 reset calibration register */ while(ADC_GetResetCalibrationStatus(ADC1)); /* Start ADC1 calibaration */ ADC_StartCalibration(ADC1); /* Check the end of ADC1 calibration */ while(ADC_GetCalibrationStatus(ADC1)); /* Start ADC1 Software Conversion */ ADC_SoftwareStartConvCmd(ADC1, ENABLE); }
int main(void) { int i; DWT_Init(); KDC_5060R_init(); ADC_SoftwareStartConvCmd(ADC1, ENABLE); DWT_Delay(1000000); demo1(0,TRUE,FALSE); KDC_5060R_text_all(TRUE,TRUE); DWT_Delay(5000000); demo1(0,FALSE,FALSE); KDC_5060R_text_all(FALSE,TRUE); DWT_Delay(1000000); demo1(0,TRUE,FALSE); KDC_5060R_text_all(TRUE,TRUE); DWT_Delay(1000000); demo1(0,FALSE,FALSE); KDC_5060R_text_all(FALSE,TRUE); DWT_Delay(1000000); demo1(0,TRUE,FALSE); KDC_5060R_text_all(TRUE,TRUE); DWT_Delay(1000000); demo1(0,FALSE,FALSE); KDC_5060R_text_all(FALSE,TRUE); DWT_Delay(1000000); for(i=0;i<10;i++) { KDC_5060R_digit(i,TRUE); DWT_Delay(200000); } KDC_5060R_digit_off(TRUE); KDC_5060R_text("HI WORLD",0,TRUE,TRUE); DWT_Delay(1000000); demo1(100000,TRUE,TRUE); DWT_Delay(1000000); demo1(100000,FALSE,TRUE); DWT_Delay(500000); demo1(0,TRUE,FALSE); KDC_5060R_send(); DWT_Delay(500000); demo1(0,FALSE,FALSE); KDC_5060R_send(); DWT_Delay(500000); demo1(0,TRUE,FALSE); KDC_5060R_send(); DWT_Delay(500000); demo1(0,FALSE,FALSE); KDC_5060R_send(); DWT_Delay(500000); demo1(0,TRUE,FALSE); KDC_5060R_send(); DWT_Delay(500000); demo1(0,FALSE,FALSE); KDC_5060R_send(); DWT_Delay(500000); demo1(0,TRUE,FALSE); KDC_5060R_send(); DWT_Delay(500000); KDC_5060R_clear_text(TRUE); DWT_Delay(500000); KDC_5060R_text("HI WORLD",0,TRUE,TRUE); DWT_Delay(500000); KDC_5060R_clear_text(TRUE); DWT_Delay(500000); KDC_5060R_text("HI WORLD",0,TRUE,TRUE); DWT_Delay(500000); KDC_5060R_clear_text(TRUE); DWT_Delay(500000); KDC_5060R_text("HI WORLD",0,TRUE,TRUE); DWT_Delay(500000); KDC_5060R_symbol(SYMBOL_DOUBLE_COLON_1,FALSE,FALSE); KDC_5060R_symbol(SYMBOL_DOUBLE_COLON_2,FALSE,FALSE); KDC_5060R_symbol(SYMBOL_MINUS,FALSE,TRUE); KDC_5060R_text("kbiva.wordpress.com",0,TRUE,TRUE); DWT_Delay(2000000); for(i=0;i>=-11;i--) { KDC_5060R_text("kbiva.wordpress.com",i,TRUE,TRUE); DWT_Delay(200000); } DWT_Delay(1000000); for(i=-11;i<=0;i++) { KDC_5060R_text("kbiva.wordpress.com",i,TRUE,TRUE); DWT_Delay(200000); } DWT_Delay(2000000); demo1(0,FALSE,FALSE); KDC_5060R_clear_text(TRUE); while(1){ KDC_5060R_receive(); if(key_data[0]&KEY_3) {KDC_5060R_text("red",0,TRUE,TRUE);KDC_5060R_leds_red();} if(key_data[0]&KEY_2) KDC_5060R_text("Button 2",0,TRUE,TRUE); if(key_data[1]&KEY_1) KDC_5060R_text("Button 1",0,TRUE,TRUE); if(key_data[1]&KEY_4) {KDC_5060R_text("green",0,TRUE,TRUE);KDC_5060R_leds_green();} if(key_data[1]&KEY_VOL_UP) KDC_5060R_text("Vol Up",0,TRUE,TRUE); if(key_data[1]&KEY_VOL_DOWN) KDC_5060R_text("Vol Down",0,TRUE,TRUE); if(key_data[1]&KEY_ATT) KDC_5060R_text("Att",0,TRUE,TRUE); if(key_data[1]&KEY_5) {KDC_5060R_text("yellow",0,TRUE,TRUE);KDC_5060R_leds_yellow();} if(key_data[1]&KEY_6) {KDC_5060R_text("leds off",0,TRUE,TRUE);KDC_5060R_leds_off();} if(key_data[2]&KEY_PLAY) KDC_5060R_text("Play",0,TRUE,TRUE); if(key_data[2]&KEY_SRC) KDC_5060R_text("SRC",0,TRUE,TRUE); if(key_data[2]&KEY_SEEK_RIGHT) KDC_5060R_text("Seek >>",0,TRUE,TRUE); if(key_data[2]&KEY_DISP) KDC_5060R_text("DISP",0,TRUE,TRUE); if(key_data[2]&KEY_SEEK_LEFT) KDC_5060R_text("Seek <<",0,TRUE,TRUE); if(key_data[2]&KEY_FM) KDC_5060R_text("FM",0,TRUE,TRUE); if(key_data[2]&KEY_AM) KDC_5060R_text("AM",0,TRUE,TRUE); if(key_data[3]&KEY_TI) KDC_5060R_text("TI",0,TRUE,TRUE); if(key_data[3]&KEY_AUDIO) KDC_5060R_text("AUDIO",0,TRUE,TRUE); if(ADCConvertedValue[0]<2000) KDC_5060R_text("RESET",0,TRUE,TRUE); DWT_Delay(100000); KDC_5060R_clear_text(TRUE); } }
/* Described at the top of this file. */ void BluetoothModemTask( void *pvParameters ) { char cChar; /* Just to avoid compiler warnings. */ ( void ) pvParameters; /* Initialise COM0, which is USART1 according to the STM32 libraries. */ lCOMPortInit( comBTM, mainBAUD_RATE ); /* Reset BTM */ #if 0 GPIO_ResetBits(BTM_Reset_Port, BTM_Reset_Pin); vTaskDelay( ( TickType_t ) 10 / portTICK_PERIOD_MS ); GPIO_SetBits(BTM_Reset_Port, BTM_Reset_Pin); #endif // do { } while (1); // const char *atEscape = "^^^"; const char *atEscapeChar = "^"; const char *atEOL = "\r"; const char *atTest = "AT\r"; // after-reset condition: give the BT module some time to init itself. vTaskDelay( ( TickType_t ) 1000 / portTICK_PERIOD_MS ); do { #if 1 // Before the escape sequence there must be silence for 1s vTaskDelay( ( TickType_t ) 1200 / portTICK_PERIOD_MS ); lSerialPutString( comBTM, atEscapeChar, strlen(atEscapeChar) ); vTaskDelay( ( TickType_t ) 120 / portTICK_PERIOD_MS ); lSerialPutString( comBTM, atEscapeChar, strlen(atEscapeChar) ); vTaskDelay( ( TickType_t ) 120 / portTICK_PERIOD_MS ); lSerialPutString( comBTM, atEscapeChar, strlen(atEscapeChar) ); // After the escape sequence there must be silence for 1s vTaskDelay( ( TickType_t ) 1200 / portTICK_PERIOD_MS ); #endif LEDs_Set(LED0, LED_INTENS_0, LED_INTENS_100, LED_INTENS_0); // Send end of line lSerialPutString( comBTM, atEOL, strlen(atEOL) ); // wait a little bit vTaskDelay( ( TickType_t ) 100 / portTICK_PERIOD_MS ); // empty input buffer usartDrainInput(comBTM); /* this drains possible 'ERROR 05' status */ // vTaskDelay( ( TickType_t ) 10 / portTICK_PERIOD_MS ); // Send plain AT lSerialPutString( comBTM, atTest, strlen(atTest) ); // vTaskDelay( ( TickType_t ) 20 / portTICK_PERIOD_MS ); // expect "OK\r\n" } while (btmExpectOK()); LEDs_Set(LED0, LED_INTENS_0, LED_INTENS_0, LED_INTENS_100); GPIO_InitTypeDef GPIO_InitStruct; GPIO_InitStruct.GPIO_Pin = GPIO_Pin_2 /*| GPIO_Pin_1*/; GPIO_InitStruct.GPIO_Speed = GPIO_Speed_2MHz; GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init( GPIOA, &GPIO_InitStruct ); do { } while (1); // disable local echo const char *atDisableEcho = "ATE0\r"; lSerialPutString( comBTM, atDisableEcho, strlen(atDisableEcho) ); if (btmExpectOK()) { // failed assert_failed(__FILE__, __LINE__); } const char *atSetDeviceName = "AT*agln=\"PIP-Watch\",0\r\n"; lSerialPutString( comBTM, atSetDeviceName, strlen(atSetDeviceName) ); if (btmExpectOK()) { // failed assert_failed(__FILE__, __LINE__); } const char *atSetPin = "AT*agfp=\"1234\",0\r"; lSerialPutString( comBTM, atSetPin, strlen(atSetPin) ); if (btmExpectOK()) { // failed assert_failed(__FILE__, __LINE__); } const char *atToDataMode = "AT*addm\r"; lSerialPutString( comBTM, atToDataMode, strlen(atToDataMode) ); if (btmExpectOK()) { // failed assert_failed(__FILE__, __LINE__); } /* Try sending out a string all in one go, as a very basic test of the lSerialPutString() function. */ // lSerialPutString( comBTM, pcLongishString, strlen( pcLongishString ) ); int k = 0; char *buf = NULL; for( ;; ) { /* Block to wait for a character to be received on COM0. */ xSerialGetChar( comBTM, &cChar, portMAX_DELAY ); /* Write the received character back to COM0. */ xSerialPutChar( comBTM, cChar, 0 ); if (!buf) { buf = pvPortMalloc(sizeof(char) * 32); #if 0 /* start ADC conversion by software */ // ADC_ClearFlag(ADC1, ADC_FLAG_EOC); ADC_ClearFlag(ADC1, ADC_FLAG_STRT); ADC_Cmd(ADC1, ENABLE); #if 0 ADC_SoftwareStartConvCmd(ADC1, ENABLE); /* wait till the conversion starts */ while (ADC_GetSoftwareStartConvStatus(ADC1) != RESET) { } #endif /* wait till the conversion ends */ while (ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) != SET) { } #endif k = 0; // k = itostr(buf, 32, RTC_GetCounter()); // k = itostr(buf, 32, ADC_GetConversionValue(ADC1)); // k = itostr(buf, 32, vbat_measured); // k = itostr(buf, 32, vbat_percent); // ADC_ClearFlag(ADC1, ADC_FLAG_EOC); } buf[k++] = cChar; if (cChar == '\r' || k >= 30) { buf[k] = '\0'; for (int i = 0; i < k-4; ++i) { if (buf[i] == '*') { /* set time: *<hours><minutes> */ int hours = (buf[i+1]-'0')*10 + (buf[i+2]-'0'); int minutes = (buf[i+3]-'0')*10 + (buf[i+4]-'0'); hours %= 24; minutes %= 60; current_rtime.sec = 0; current_rtime.hour = hours; current_rtime.min = minutes; break; } } if (xQueueSend(toDisplayStrQueue, &buf, 0) == pdTRUE) { // ok; will alloc new buffer buf = NULL; } else { // fail; ignore, keep buffer } // motor demo GPIO_SetBits(GPIOB, 1 << 13); vTaskDelay( ( TickType_t ) 300 / portTICK_PERIOD_MS ); GPIO_ResetBits(GPIOB, 1 << 13); k = 0; xSerialPutChar( comBTM, '\n', 0 ); } } }
/* 函数名:ADC1_Mode_Config * 描述 :配置ADC1的工作模式为MDA模式 * 输入 : 无 * 输出 :无 * 调用 :内部调用 */ static void ADC1_Mode_Config(void) { DMA_InitTypeDef DMA_InitStructure; ADC_InitTypeDef ADC_InitStructure; /* Enable DMA clock */ RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE); /* Enable ADC1 clock and GPIOC clock already enabled in GPIO.c */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE); /* DMA channel1 configuration */ DMA_DeInit(DMA1_Channel1); DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address; DMA_InitStructure.DMA_MemoryBaseAddr = (u32)&ADC_ConvertedValue; DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC; DMA_InitStructure.DMA_BufferSize = 11; DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord; DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord; DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; DMA_InitStructure.DMA_Priority = DMA_Priority_High; DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; DMA_Init(DMA1_Channel1, &DMA_InitStructure); /* Enable DMA channel1 */ DMA_Cmd(DMA1_Channel1, ENABLE); /* ADC1 configuration */ ADC_DeInit(ADC1); //??? ADC1 ???????????? ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; ADC_InitStructure.ADC_ScanConvMode = ENABLE; ADC_InitStructure.ADC_ContinuousConvMode = ENABLE; ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; ADC_InitStructure.ADC_NbrOfChannel = 11; ADC_Init(ADC1, &ADC_InitStructure); /********************************/ RCC_ADCCLKConfig(RCC_PCLK2_Div6); //72M/6=12,ADC????????14M /* ADC1 regular channel configuration */ ADC_RegularChannelConfig(ADC1, ADC_Channel_5, 1, ADC_SampleTime_55Cycles5); ADC_RegularChannelConfig(ADC1, ADC_Channel_6, 2, ADC_SampleTime_55Cycles5); ADC_RegularChannelConfig(ADC1, ADC_Channel_7, 3, ADC_SampleTime_55Cycles5); ADC_RegularChannelConfig(ADC1, ADC_Channel_8, 4, ADC_SampleTime_55Cycles5); ADC_RegularChannelConfig(ADC1, ADC_Channel_9, 5, ADC_SampleTime_55Cycles5); ADC_RegularChannelConfig(ADC1, ADC_Channel_10, 6, ADC_SampleTime_55Cycles5); ADC_RegularChannelConfig(ADC1, ADC_Channel_11, 7, ADC_SampleTime_55Cycles5); ADC_RegularChannelConfig(ADC1, ADC_Channel_12, 8, ADC_SampleTime_55Cycles5); ADC_RegularChannelConfig(ADC1, ADC_Channel_13, 9, ADC_SampleTime_55Cycles5); ADC_RegularChannelConfig(ADC1, ADC_Channel_14, 10, ADC_SampleTime_55Cycles5); ADC_RegularChannelConfig(ADC1, ADC_Channel_15, 11, ADC_SampleTime_55Cycles5); /* Enable ADC1 DMA */ ADC_DMACmd(ADC1, ENABLE); /* Enable ADC1 */ ADC_Cmd(ADC1, ENABLE); /* Enable ADC1 reset calibaration register */ ADC_ResetCalibration(ADC1); /* Check the end of ADC1 reset calibration register */ while(ADC_GetResetCalibrationStatus(ADC1)); /* Start ADC1 calibaration */ ADC_StartCalibration(ADC1); /* Check the end of ADC1 calibration */ while(ADC_GetCalibrationStatus(ADC1)); /* Start ADC1 Software Conversion */ ADC_SoftwareStartConvCmd(ADC1, ENABLE); }
uint16_t AudioFilter::readAnalog(uint8_t channel) { ADC_RegularChannelConfig(ADC1, channel, 1, ADC_SampleTime_1Cycles5); ADC_SoftwareStartConvCmd(ADC1, ENABLE); while (ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET); return ADC_GetConversionValue(ADC1); }