Skocz do zawartości

Problem z ADC DMA .


Pomocna odpowiedź

Napisano

Witam. Uzywam stm32f030R8T6 i probuje zrobic pomiar przez dma, lecz mi nie wychodzi i nie wiem co jest źle. Przy użyciu adc bez dma i komendy adc_getconversionvalue dziala tak jak powinno.

Kod programu

/**
 ******************************************************************************
 * @file    main.c
 * @author  Ac6
 * @version V1.0
 * @date    01-December-2013
 * @brief   Default main function.
 ******************************************************************************
*/


#include "stm32f0xx.h"
#include "stm32f0xx_gpio.h"
#include "stm32f0xx_rcc.h"
#include "stm32f0xx_adc.h"
#include "stm32f0xx_dma.h"

#define ADC_DataRegister_address 0x40;
volatile uint32_t ADC_value;

void delay(int counter)

{
   int i;
   for (i = 0; i < counter * 10000; i++) {}
}
void d1init(void)
{
GPIO_InitTypeDef gpio;

     RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOC, ENABLE);

    GPIO_StructInit(&gpio);
    gpio.GPIO_Pin = GPIO_Pin_9;
    gpio.GPIO_Mode = GPIO_Mode_OUT;
    GPIO_Init(GPIOC, &gpio);

    GPIO_SetBits(GPIOC, GPIO_Pin_9);
}
void d2init(void)
{
GPIO_InitTypeDef gpio;

     RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOC, ENABLE);

    GPIO_StructInit(&gpio);
    gpio.GPIO_Pin = GPIO_Pin_8;
    gpio.GPIO_Mode = GPIO_Mode_OUT;
    GPIO_Init(GPIOC, &gpio);

    GPIO_SetBits(GPIOC, GPIO_Pin_8);
}
void ADC_init(void)
{
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA , ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
DMA_DeInit(DMA1_Channel1);
ADC_DeInit(ADC1);

GPIO_InitTypeDef GPIO_InitStructure;


	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;
	GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
	GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
	GPIO_Init(GPIOA,&GPIO_InitStructure);



ADC_InitTypeDef ADC_INIT;

	ADC_INIT.ADC_Resolution = ADC_Resolution_10b;
	ADC_INIT.ADC_ContinuousConvMode = ENABLE;
	ADC_INIT.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;
	ADC_INIT.ADC_DataAlign = ADC_DataAlign_Right;
	ADC_INIT.ADC_ScanDirection = ADC_ScanDirection_Upward;
	ADC_Init(ADC1, &ADC_INIT);

	ADC_ChannelConfig(ADC1, ADC_Channel_1 , ADC_SampleTime_55_5Cycles);
	ADC_Cmd(ADC1, ENABLE);
	ADC_DMACmd(ADC1,ENABLE);

DMA_InitTypeDef DMA_INIT;

     DMA_INIT.DMA_PeripheralBaseAddr = (uint32_t)ADC_DataRegister_address;
     DMA_INIT.DMA_MemoryBaseAddr = (uint32_t)&ADC_value;
     DMA_INIT.DMA_DIR = DMA_DIR_PeripheralSRC;
     DMA_INIT.DMA_BufferSize = 1;
     DMA_INIT.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
     DMA_INIT.DMA_MemoryInc = DMA_MemoryInc_Enable;
     DMA_INIT.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
     DMA_INIT.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
     DMA_INIT.DMA_Mode = DMA_Mode_Normal;
     DMA_INIT.DMA_Priority = DMA_Priority_High;
     DMA_INIT.DMA_M2M = DMA_M2M_Disable;
     DMA_Init(DMA1_Channel1, &DMA_INIT);

     DMA_Cmd(DMA1_Channel1, ENABLE);
     ADC_DMARequestModeConfig(ADC1, ADC_DMAMode_Circular);


}





int main(void)
{

ADC_init();
   while (1)
   {
   }
}

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...