АЦП + DMA значения в массив

Кто любит RISC в жизни, заходим, не стесняемся.
Ответить
skinoren
Первый раз сказал Мяу!
Сообщения: 31
Зарегистрирован: Вс окт 12, 2014 13:36:20

АЦП + DMA значения в массив

Сообщение skinoren »

Добрый день. Для stm32f10x есть пример для связки АЦП и DMA

Код: Выделить всё

#include "stm32f10x.h"

ADC_InitTypeDef ADC_InitStructure;
DMA_InitTypeDef DMA_InitStructure;
__IO uint16_t ADCConvertedValue;

void RCC_Configuration(void);
void GPIO_Configuration(void);

void ADC_DMA_Init(void) {
  RCC_Configuration();
  GPIO_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 = 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);

  DMA_Cmd(DMA1_Channel1, ENABLE);
  
  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);

  ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 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_SoftwareStartConvCmd(ADC1, ENABLE);		
	
}

void RCC_Configuration(void) {
#if defined (STM32F10X_LD_VL) || defined (STM32F10X_MD_VL) || defined (STM32F10X_HD_VL)
  
  RCC_ADCCLKConfig(RCC_PCLK2_Div2); /* ADCCLK = PCLK2/2 */
#else
  RCC_ADCCLKConfig(RCC_PCLK2_Div4); /* ADCCLK = PCLK2/4 */
#endif
  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 | RCC_APB2Periph_GPIOA, ENABLE);
}


void GPIO_Configuration(void) {
  GPIO_InitTypeDef GPIO_InitStructure;

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
  GPIO_Init(GPIOA, &GPIO_InitStructure);
}
Значения хранятся в ADCConvertedValue. А мне нужно чтобы значения из АЦП забивались в массив минуя процессор. Как это сделать?
Реклама
skinoren
Первый раз сказал Мяу!
Сообщения: 31
Зарегистрирован: Вс окт 12, 2014 13:36:20

Re: АЦП + DMA значения в массив

Сообщение skinoren »

Ну и еще мне нужно прерывание по заполнению массива скажите как это сделать?
Реклама
Аватара пользователя
Myp3ik
Мучитель микросхем
Сообщения: 450
Зарегистрирован: Вс янв 09, 2011 23:05:37
Откуда: СССР

Re: АЦП + DMA значения в массив

Сообщение Myp3ik »

Код: Выделить всё

__IO uint16_t ADCConvertedValue;
//заменить на массив требуемой длины, например 10
uint16_t ADCConvertedValue[10];

//в настройках DMA
DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)&ADCConvertedValue;
DMA_InitStructure.DMA_BufferSize = 1;

//заменить на
DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)ADCConvertedValue;
DMA_InitStructure.DMA_BufferSize = sizeof(ADCConvertedValue) / sizeof(ADCConvertedValue[0]); // или просто 10 :)
Включить прерывание Transfer Complete для DMA.
Иван Сусанин - первый полупроводник :solder:
skinoren
Первый раз сказал Мяу!
Сообщения: 31
Зарегистрирован: Вс окт 12, 2014 13:36:20

Re: АЦП + DMA значения в массив

Сообщение skinoren »

Myp3ik писал(а):Включить прерывание Transfer Complete для DMA.
Вот так?

Код: Выделить всё

void DMAChannel1_IRQHandler ( void ) {
		if (DMA1->ISR & DMA_ISR_TCIF1 ) {
			//Здесь должен быть таймер?
			DMA1->IFCR |= DMA_IFCR_CGIF1;
		}
}
И нужно ли добавлять в инициализацию такую строчку?

Код: Выделить всё

	NVIC_EnableIRQ(DMA1_Channel1_IRQn);
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
Myp3ik
Мучитель микросхем
Сообщения: 450
Зарегистрирован: Вс янв 09, 2011 23:05:37
Откуда: СССР

Re: АЦП + DMA значения в массив

Сообщение Myp3ik »

1. Это у Вас обработчик прерывания, туда мы попадем как только ацп сделает 10 измерений. Все результаты измерений уже будут в массиве. Внутри обработчика Вы сбрасываете бит прерывания, это стандартная процедура. О таймере ничего не понял.

2. Это разрешение прерывания в контроллере прерываний.

3. Еще нужно разрешить дма генерировать это прерывание:

Код: Выделить всё

DMA_ITConfig(DMA1_Channel1, DMA_IT_TC, ENABLE);
Иван Сусанин - первый полупроводник :solder:
Реклама
Ответить

Вернуться в «ARM»