//-------------------------------------------------------------- // Change the mode of DMA // n != 1 => Double-Buffer-Mode // n == 1 => Single-Buffer-Mode //-------------------------------------------------------------- void ADC_change_Mode(uint16_t trigger_mode) { DMA_InitTypeDef DMA_InitStructure; ADC_UB.DmaStatus = ADC_DMA_STOP; TIM_Cmd(TIM2, DISABLE); ADC_DMA_Disable(); // DMA-Config DMA_InitStructure.DMA_Channel = ADC1_DMA_CHANNEL; DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)ADC1_CDR_ADDRESS; DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t) & ADC_DMA_Buffer_A; DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory; DMA_InitStructure.DMA_BufferSize = ADC1d_LAST * ADC_ARRAY_LEN; 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_FIFOMode = DMA_FIFOMode_Disable; DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_HalfFull; DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single; DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single; DMA_Init(ADC1_DMA_STREAM, &DMA_InitStructure); if (trigger_mode != MENU_TRIGGER_MODE_AUTO) { // Double-Buffer-Mode ADC1_DMA_STREAM->CR |= DMA_SxCR_DBM; ADC1_DMA_STREAM->M1AR = (uint32_t) & ADC_DMA_Buffer_B; } else { // Normal Mode ADC1_DMA_STREAM->CR &= ~DMA_SxCR_DBM; } // Clear flags DMA_ClearITPendingBit(DMA2_Stream0, DMA_IT_TCIF0); DMA_ClearITPendingBit(DMA2_Stream0, DMA_IT_HTIF0); ADC_DMA_Enable(); // Initialize NVIC P_ADC_InitNVIC(); // Start timer again, if necessary if (ADC_UB.Status != ADC_READY || trigger_mode == MENU_TRIGGER_MODE_AUTO) ADC_Timer2_Start(); // Reset flag ADC_UB.DmaStatus = ADC_DMA_RUN; }
void adc_init(void) { DMA_InitPara DMA_InitStructure; ADC_InitPara ADC_InitStructure; RCC_APB2PeriphClock_Enable(RCC_APB2PERIPH_ADC1, ENABLE); RCC_ADCCLKConfig(RCC_ADCCLK_APB2_DIV6); RCC_AHBPeriphClock_Enable(RCC_AHBPERIPH_DMA1, ENABLE); DMA_InitStructure.DMA_PeripheralBaseAddr = 0x4001244C; DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)adcarray; 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_MTOM = DMA_MEMTOMEM_DISABLE; DMA_Init(DMA1_CHANNEL1, &DMA_InitStructure); DMA_Enable(DMA1_CHANNEL1, ENABLE); // ADC_DeInit(&ADC_InitStructure); ADC_InitStructure.ADC_Mode_Scan = ENABLE; ADC_InitStructure.ADC_Mode_Continuous = ENABLE; ADC_InitStructure.ADC_Trig_External = ADC_EXTERNAL_TRIGGER_MODE_NONE; ADC_InitStructure.ADC_Data_Align = ADC_DATAALIGN_RIGHT; ADC_InitStructure.ADC_Channel_Number = 4; ADC_Init(&ADC_InitStructure); // current? ADC_RegularChannel_Config(ADC_CHANNEL_7, 1, ADC_SAMPLETIME_239POINT5); // battery channel ADC_RegularChannel_Config(ADC_CHANNEL_5, 2, ADC_SAMPLETIME_239POINT5); ADC_RegularChannel_Config(ADC_CHANNEL_4, 3, ADC_SAMPLETIME_239POINT5); ADC_RegularChannel_Config(ADC_CHANNEL_1, 4, ADC_SAMPLETIME_239POINT5); ADC_DMA_Enable(ENABLE); ADC_Enable(ENABLE); ADC_Calibration(); ADC_SoftwareStartConv_Enable(ENABLE); }
/** * @brief Main program. * @param None * @retval None */ int main(void) { /* Configure System clocks -----------------------------------------------*/ RCC_Configuration(); /* Configure GPIO ports --------------------------------------------------*/ GPIO_Configuration(); /* Configure DMA1 channel1 -----------------------------------------------*/ DMA_DeInit(DMA1_CHANNEL1); DMA_InitStructure.DMA_PeripheralBaseAddr = ADC_RDTR_Address; DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)&ADCConvertedValue; 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_MTOM = DMA_MEMTOMEM_DISABLE; DMA_Init(DMA1_CHANNEL1, &DMA_InitStructure); /* Enable DMA1 channel1 */ DMA_Enable(DMA1_CHANNEL1, ENABLE); /* Configure ADC ---------------------------------------------------------*/ ADC_InitStructure.ADC_Mode_Scan = DISABLE; ADC_InitStructure.ADC_Mode_Continuous = ENABLE; ADC_InitStructure.ADC_Trig_External = ADC_EXTERNAL_TRIGGER_MODE_NONE; ADC_InitStructure.ADC_Data_Align = ADC_DATAALIGN_RIGHT; ADC_InitStructure.ADC_Channel_Number = 1; ADC_Init(&ADC_InitStructure); /* Configure ADC regular channelx */ ADC_RegularChannel_Config( BOARD_ADC_CHANNEL, 1, ADC_SAMPLETIME_239POINT5); /* Enable ADC DMA */ ADC_DMA_Enable(ENABLE); /* Enable ADC */ ADC_Enable(ENABLE); ADC_Calibration(); /* Start ADC Software Conversion */ ADC_SoftwareStartConv_Enable(ENABLE); while (1) { } }
/** * @brief Configure ADC_12B resolution. * @param None * @retval None */ void ADC_12BConfiguration(void) { /* Configure ADC ----------------------------------------------------------*/ ADC_InitStructure.ADC_Mode_Scan = DISABLE; ADC_InitStructure.ADC_Mode_Continuous = DISABLE; ADC_InitStructure.ADC_Trig_External = ADC_EXTERNAL_TRIGGER_MODE_NONE; ADC_InitStructure.ADC_Data_Align = ADC_DATAALIGN_RIGHT; ADC_InitStructure.ADC_Channel_Number = 1; ADC_Init(&ADC_InitStructure); /* Configure ADC regular channel10 */ ADC_RegularChannel_Config(ADC_CHANNEL_10, 1, ADC_SAMPLETIME_55POINT5); /* Enable ADC DMA */ ADC_DMA_Enable(ENABLE); ADC_Resolution_Config(ADC_RESOLUTION_12B); /* Enable ADC */ ADC_Enable(ENABLE); ADC_Calibration(); /* Start ADC Software Conversion */ ADC_SoftwareStartConv_Enable(ENABLE); }
//-------------------------------------------------------------- // Init DMA (im Double-Buffer-Mode) //-------------------------------------------------------------- void P_ADC_InitDMA_DoubleBuffer(void) { DMA_InitTypeDef DMA_InitStructure; // Clock Enable RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2, ENABLE); ADC_DMA_Disable(); // DMA-Config DMA_InitStructure.DMA_Channel = ADC1_DMA_CHANNEL; DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)ADC1_CDR_ADDRESS; DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t) & ADC_DMA_Buffer_A; DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory; DMA_InitStructure.DMA_BufferSize = ADC1d_LAST * ADC_ARRAY_LEN; 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_FIFOMode = DMA_FIFOMode_Disable; DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_HalfFull; DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single; DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single; DMA_Init(ADC1_DMA_STREAM, &DMA_InitStructure); // Double-Buffer-Mode ADC1_DMA_STREAM->CR |= DMA_SxCR_DBM; ADC1_DMA_STREAM->M1AR = (uint32_t) &ADC_DMA_Buffer_B; // Clear flags DMA_ClearITPendingBit(DMA2_Stream0, DMA_IT_TCIF0); DMA_ClearITPendingBit(DMA2_Stream0, DMA_IT_HTIF0); ADC_DMA_Enable(); }
/** * @brief Main program. * @param None * @retval None */ int main(void) { /* Configure System clocks -----------------------------------------------*/ RCC_Configuration(); /* Configure NVIC --------------------------------------------------------*/ NVIC_Configuration(); /* Configure GPIO ports --------------------------------------------------*/ GPIO_Configuration(); /* Configure TIM2 --------------------------------------------------------*/ /* Configure Time Base */ TIMER_BaseStructInit(&TIM_TimeBaseStructure); TIM_TimeBaseStructure.TIMER_Period = 256; TIM_TimeBaseStructure.TIMER_Prescaler = 6; TIM_TimeBaseStructure.TIMER_ClockDivision = 0x0; TIM_TimeBaseStructure.TIMER_CounterMode = TIMER_COUNTER_UP; TIMER_BaseInit(TIMER2, &TIM_TimeBaseStructure); /* Configure TIM2 channel2 in PWM mode */ TIM_OCInitStructure.TIMER_OCMode = TIMER_OC_MODE_PWM1; TIM_OCInitStructure.TIMER_OutputState = TIMER_OUTPUT_STATE_ENABLE; TIM_OCInitStructure.TIMER_Pulse = 128; TIM_OCInitStructure.TIMER_OCPolarity = TIMER_OC_POLARITY_LOW; TIMER_OC2_Init(TIMER2, &TIM_OCInitStructure); /* Configure DMA1 Channel1 -----------------------------------------------*/ DMA_DeInit(DMA1_CHANNEL1); DMA_InitStructure.DMA_PeripheralBaseAddr = ADC_RDTR_Address; DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)ADC_RegularConvertedValueTab; DMA_InitStructure.DMA_DIR = DMA_DIR_PERIPHERALSRC; DMA_InitStructure.DMA_BufferSize = 64; 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_NORMAL; DMA_InitStructure.DMA_Priority = DMA_PRIORITY_HIGH; DMA_InitStructure.DMA_MTOM = DMA_MEMTOMEM_DISABLE; DMA_Init(DMA1_CHANNEL1, &DMA_InitStructure); /* Enable DMA1 channel1 */ DMA_Enable(DMA1_CHANNEL1, ENABLE); /* Configure ADC ---------------------------------------------------------*/ ADC_InitStructure.ADC_Mode_Scan = ENABLE; ADC_InitStructure.ADC_Mode_Continuous = DISABLE; ADC_InitStructure.ADC_Trig_External = ADC_EXTERNAL_TRIGGER_MODE_T2_CC2; ADC_InitStructure.ADC_Data_Align = ADC_DATAALIGN_RIGHT; ADC_InitStructure.ADC_Channel_Number = 1; ADC_Init(&ADC_InitStructure); /* Configure ADC regular channel14 */ ADC_RegularChannel_Config(ADC_CHANNEL_14, 1, ADC_SAMPLETIME_55POINT5); /* Set inserted sequencer length */ ADC_InsertedSequencerLength_Config(1); /* Configure ADC inserted channel */ ADC_InsertedChannel_Config(ADC_CHANNEL_11, 1, ADC_SAMPLETIME_55POINT5); /* Configure ADC inserted external trigger */ ADC_ExternalTrigInsertedConv_Config(ADC_EXTERNAL_TRIG_INSERTCONV_NONE); /* Enable automatic inserted conversion start after regular one */ ADC_AutoInsertedConv_Enable(ENABLE); /* Enable ADC DMA */ ADC_DMA_Enable(ENABLE); /* Enable ADC external trigger */ ADC_ExternalTrigConv_Enable( ENABLE); /* Enable EOIC interrupt */ ADC_INTConfig(ADC_INT_EOIC, ENABLE); /* Enable ADC */ ADC_Enable(ENABLE); ADC_Calibration(); /* TIM2 counter enable */ TIMER_Enable(TIMER2, ENABLE); /* TIM2 main Output enable */ TIMER_CtrlPWMOutputs(TIMER2, ENABLE); /* Test on channel1 transfer complete flag */ while(!DMA_GetBitState(DMA1_FLAG_TC1)); /* Clear channel1 transfer complete flag */ DMA_ClearBitState(DMA1_FLAG_TC1); /* TIM2 counter disable */ TIMER_Enable(TIMER2, DISABLE); /* Turn on the Led1 */ GD_EVAL_LEDOn(LED1); while (1) { } }