STM32 ADC + DMA se produce solo una vez

1

Estoy tratando de sondear el valor del ADC y almacenarlo en una variable usando DMA, pero la variable almacena el valor del ADC1->DR solo una vez (cuando se inicia el programa). En la depuración, el valor de ADC1->DR cambia pero la variable permanece igual. Este es mi código:

#include "stm32f4xx.h"                  // Device header
volatile uint16_t DMAVALUE =0;
int main()
{
RCC->AHB1ENR |= RCC_AHB1ENR_DMA2EN | RCC_AHB1ENR_GPIOAEN;
RCC->APB2ENR |= RCC_APB2ENR_ADC1EN;

GPIOA->MODER |= GPIO_MODER_MODE0;
GPIOA->PUPDR |= GPIO_PUPDR_PUPD0_1;

DMA2_Stream4->PAR = (uint32_t)( &(ADC1->DR));
DMA2_Stream4->M0AR =(uint32_t)( &(DMAVALUE));
DMA2_Stream4->NDTR = 1;
DMA2_Stream4->CR &=~ DMA_SxCR_CHSEL; //STREAM4 CHANNEL 0
DMA2_Stream4->CR |= DMA_SxCR_PSIZE_0 | DMA_SxCR_MSIZE_0 | DMA_SxCR_TCIE | 
DMA_SxCR_CIRC  | DMA_SxCR_EN ;// CIRCULAR MODE IS ENABLED
NVIC_EnableIRQ(DMA2_Stream4_IRQn);
NVIC_SetPriority(DMA2_Stream4_IRQn,0);

ADC1->CR2 |= ADC_CR2_ADON | ADC_CR2_CONT | ADC_CR2_DMA;
ADC1->SMPR2 |= ADC_SMPR2_SMP0;
ADC1->SQR3 &=~ ADC_SQR3_SQ1; //CHANNEL 0 IS FIRST IN SEQUENCE
ADC1->CR2 |= ADC_CR2_SWSTART;


while(1)
{

}
}
void DMA2_Stream4_IRQHandler(void)
{
DMA2->HIFCR &=~ DMA_HIFCR_CTCIF4;
}
    
pregunta Mourad

2 respuestas

1

Cuando agregué ADC1->CR2 |= ADC_CR2_DDS; funcionó

  

DDS: DMA deshabilita la selección (para modo ADC individual)   Este bit es establecido y borrado por el software.

     

0: no se emite ninguna nueva solicitud de DMA después de la última transferencia (según lo configurado en el controlador DMA)

     

1: las solicitudes de DMA se emiten siempre que los datos se conviertan y DMA = 1

    
respondido por el Mourad
0

También debe habilitar modo de escaneo

ADC1->CR1 |= ADC_CR1_SCAN;

como dice el Manual de referencia,

  

El modo de escaneo se selecciona configurando el bit de EXPLORACIÓN en el registro ADC_CR1. Una vez este bit   ha sido configurado, el ADC escanea todos los canales seleccionados en los registros ADC_SQRx (para   canales regulares) o en el registro ADC_JSQR (para canales inyectados). Una sola conversión   Se realiza para cada canal del grupo. Después de cada final de conversión, el siguiente canal   En el grupo se convierte automáticamente. Si se establece el bit CONT, la conversión de canal regular   no se detiene en el último canal seleccionado en el grupo pero continúa de nuevo desde el primer canal   canal seleccionado   Si se establece el bit DMA, el controlador de acceso directo a la memoria (DMA) se utiliza para transferir los datos   convertido del grupo regular de canales (almacenado en el registro ADC_DR) a SRAM   después de cada conversión de canal regular.

    
respondido por el berendi

Lea otras preguntas en las etiquetas