Stm32f4 adc+dma+tim1

Помечено: , , , ,

В этой теме 0 ответов, 1 участник, последнее обновление  Umar 5 мес., 2 нед. назад.

Просмотр 1 сообщения - с 1 по 1 (всего 1)
  • Автор
    Сообщения
  • #4583

    Umar
    Участник

    Есть исходная прошивка устройства, там один канал в ADC_TripleMode_Interl необходимо заменить этот режим на два обычных каналов (медленных). В случай замене адреса #define CDR_ADDRESS ((uint32_t)0x40012308) в результате ничего не выдает.
    Вот исходник

    
    void initialization_ADC(void) {
     
    GPIO_InitTypeDef        GPIO_InitStructure;
    ADC_InitTypeDef         ADC_InitStructure;
    ADC_CommonInitTypeDef   ADC_CommonInitStructure;
    DMA_InitTypeDef         DMA_InitStructure;
     
        ADC_StructInit(&ADC_InitStructure);
        ADC_CommonStructInit(&ADC_CommonInitStructure);
        DMA_StructInit(&DMA_InitStructure);
     
        /* Configure PB11, PB15 in pushpull mode */
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11 | GPIO_Pin_15;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
        GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
        GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN;
        GPIO_Init(GPIOB, &GPIO_InitStructure);
        //  ...
        /* Configure PB1, PB8 in output mode */
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_8;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
        GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
        GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN;
        GPIO_Init(GPIOB, &GPIO_InitStructure);
        // ..
    #ifdef __ILX_751B
        GPIOB->BSRRH = GPIO_Pin_1;  // Set High ROG
        GPIOB->BSRRH = GPIO_Pin_8;  // Set High SHUT
    #endif
    #ifdef __ILX_1412S
        GPIOB->BSRRL = GPIO_Pin_1;  // Set Low HOLD
        GPIOB->BSRRL = GPIO_Pin_8;  // Set Low SI1
    #endif
     
    /******************************************************************************/
    /*               ADCs interface clock and pin configuration                   */
    /******************************************************************************/
    // === DMA =====================================================================
    #define CDR_ADDRESS         ((uint32_t)0x40012308)   
     
        /* Enable peripheral clocks */
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 | RCC_APB2Periph_ADC2 | RCC_APB2Periph_ADC3, ENABLE);
        /* Enable peripheral clocks *************************************************/
        RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2 , ENABLE);
     
        /* Configure ADC Channel N pin as analog input *****************************/ 
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;
        GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
        GPIO_Init(GPIOA, &GPIO_InitStructure);
     
        /* DMA2 Stream0 channel0 configuration **************************************/
        DMA_InitStructure.DMA_Channel = DMA_Channel_0;
        DMA_InitStructure.DMA_PeripheralBaseAddr = CDR_ADDRESS;
        DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)&t_data_0.e.data[0];
        DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory;
        DMA_InitStructure.DMA_BufferSize = 0;
        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_VeryHigh;
        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(DMA2_Stream0, &DMA_InitStructure);
     
        NVIC_SetPriority(DMA2_Stream0_IRQn, 1);
        NVIC_EnableIRQ(DMA2_Stream0_IRQn);
     
        /* ADC Common configuration *************************************************/
        ADC_CommonInitStructure.ADC_Mode = ADC_Mode_Independent;
        ADC_CommonInitStructure.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_20Cycles;
        ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_2;    
        ADC_CommonInitStructure.ADC_Prescaler = ADC_Prescaler_Div8;                 // ADC_clk = 30 000 000 (Triple sample = 30 000 000 / 5 = 6 000 000 [Hz])
        ADC_CommonInit(&ADC_CommonInitStructure);
     
        /* ADC1 regular channel N configuration ************************************/
        ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;
        ADC_InitStructure.ADC_ScanConvMode = DISABLE;
        ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
    #ifdef __ILX_751B
        ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_Rising;
    #endif
    #ifdef __ILX_1412S
        ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_Rising;
    #endif
        ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T1_CC2;
        ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
        ADC_InitStructure.ADC_NbrOfConversion = 1;
     
        ADC_Init(ADC1, &ADC_InitStructure);
        /* ADC1 regular channel configuration */
        ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_3Cycles);
     
        ADC_Init(ADC2, &ADC_InitStructure);
        /* ADC2 regular channel configuration */
        ADC_RegularChannelConfig(ADC2, ADC_Channel_0, 1, ADC_SampleTime_3Cycles);
     
        ADC_Init(ADC3, &ADC_InitStructure); 
        /* ADC3 regular channel configuration */
        ADC_RegularChannelConfig(ADC3, ADC_Channel_2, 1, ADC_SampleTime_3Cycles);
     
        /* Enable ADC1 DMA */
        ADC_DMACmd(ADC1, ENABLE);
     
        /* Enable DMA request after last transfer (multi-ADC mode) ******************/
        ADC_MultiModeDMARequestAfterLastTransferCmd(ENABLE);
     
        /* Clear DMA2 Stream 0 flags */
        DMA2->LIFCR |= (uint32_t)(DMA_FLAG_HTIF0 | DMA_FLAG_TCIF0);
     
        /* Enable DMA Stream Transfer Complete interrupt */
        DMA_ITConfig(DMA2_Stream0, DMA_IT_TC, ENABLE);
     
    /******************************************************************************/
    /*               PWM interface clock and pin configuration                   */
    /******************************************************************************/
    #define __Timer_F_Freq          6000000                                         // Hz
    #define __Period_F_Mid          ((SystemCoreClock) / __Timer_F_Freq)            // 1 / Hz
     
    TIM_TimeBaseInitTypeDef     TIM_TimeBaseStructure;
    TIM_OCInitTypeDef           TIM_OCInitStructure;
     
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
        GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
        GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
        /* GPIOB Configuration: Channel 2N as alternate function push-pull */
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
        GPIO_Init(GPIOB, &GPIO_InitStructure);
        GPIO_PinAFConfig(GPIOB, GPIO_PinSource0, GPIO_AF_TIM1); 
     
        // TIM1 Configuration ------------------CLK-----------------------------------
        /* TIM_1clock enable */
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);
     
        uint16_t Timer_F_period = __Period_F_Mid & ~0x01;
        /* Time Base configuration */
        TIM_TimeBaseStructure.TIM_Period = Timer_F_period - 1;
        TIM_TimeBaseStructure.TIM_Prescaler = 0;
        TIM_TimeBaseStructure.TIM_ClockDivision = 0;
        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
        TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;
        TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);
     
        /* Channel 2N Configuration in TIM_OCMode_PWM mode */
        TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
        TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
        TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable;
        TIM_OCInitStructure.TIM_Pulse = (uint16_t) (Timer_F_period >> 1);
        TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;
        TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_High;
        TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Reset;
        TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCIdleState_Set;
        TIM_OC2Init(TIM1, &TIM_OCInitStructure);
     
        TIM_OC2PreloadConfig(TIM1, TIM_OCPreload_Enable);
     
        /* TIM1 Main Output Enable */
        TIM_CtrlPWMOutputs(TIM1, ENABLE);
    }
    
Просмотр 1 сообщения - с 1 по 1 (всего 1)

Для ответа в этой теме необходимо авторизоваться.

Похожие статьи:

Понравилась статья? Поделись с друзьями!