DMA entre GPIO y SRAM en STM32

2

Aquí estoy tratando de mover los datos del SRAM location 0x20000010 al registro ODR del GPIOE de STM32f303 . Pero no me está sucediendo (no veo el cambio de datos en la ODR mientras se realiza la depuración). No entiendo por qué. ¿Puede alguien ayudarme en esto?

EDIT

int SRAM_ADDRESS __attribute__((section(".ARM.__at_0x20000010")));  
volatile Task_S_T *Task;
    Task = LCD_FIFO_Peek();

    SRAM_ADDRESS = Task->Data;

        //initialize source and destination arrays
    uint32_t source = 0x20000010;                               // SRAM Starting address where the LCD Task data is loaded
    uint32_t destination = 0x48001014;
  DMA_InitTypeDef   DMA_InitStructure;

  /* Enable DMA1 clock -------------------------------------------------------*/
  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);

  DMA_DeInit(DMA1_Channel1);

  DMA_InitStructure.DMA_PeripheralBaseAddr =    (uint32_t)destination;
  DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)source;
  DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;
  DMA_InitStructure.DMA_BufferSize = 16;
  DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Enable;
  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_M2M = DMA_M2M_Disable;
  DMA_Init(DMA1_Channel1, &DMA_InitStructure);

  DMA_Cmd(DMA1_Channel1, ENABLE);
  LCD_Port_Set_Output();    // Just ensure that the LCD port is in output direction on the appropriate pin masks.
  GPIO_SetBits(LCD_BUS_GPIO_PORT, LCD_E_PIN);                   // Toggle Enable pin on.
  GPIO_ResetBits(LCD_BUS_GPIO_PORT, LCD_E_PIN);                 // Toggle Enable pin off.
    
pregunta spp

1 respuesta

3
  

Estoy un poco atascado en eso porque no tengo mucho conocimiento sobre SRAM   y como acceder a ella. ¿Alguien puede ayudarme aquí?

"SRAM" como la memoria en su PC, todas sus pilas de funciones y las variables automáticas se encuentran en ella. En su código anterior, las dos matrices:

  

fuente uint32_t [TAMAÑO]; uint32_t destino [TAMAÑO];

simplemente se asignan en "SRAM", el código que publicaste, está usando DMA para transferir datos desde la matriz "origen" a "destino", y cuando se hace, genera una interrupción.

Entonces, lo que necesita es simplemente ubicar sus datos en SRAM y luego disparar el DMA. Si sus datos necesitan ubicarse en una dirección dada como "0x ??????", la dirección debe estar en la dirección de su SRAM. Para STM32f303VCT6, la SRAM interanl comienza desde la dirección 0x20000000, termina en 0x2000A000.

Puede haber diferentes métodos dependiendo del compilador que estés usando. Para ARM MDK, puede ir aquí: enlace

Actualizar:

Si desea utilizar DMA para transferir datos / comandos de su memoria a la pantalla LCD. Es posible que necesites:

  1. Ponga sus datos / comando en la ubicación de memoria fija. Y es posible que deba configurar sus pines de control LCD, como A0, habilitar, etc ...
  2. Establezca "DMA_PeripheralBaseAddr" en "& GPIOX- > ODR", "X" según el puerto GPIO que esté usando.
  3. Establezca "DMA_DIR" en "DMA_DIR_PeripheralDST";
  4. Establezca "DMA_MemoryBaseAddr" en su dirección de datos.
  5. Establezca "DMA_BufferSize" en su tamaño de búfer. Nota:
  

Especifica el tamaño del búfer, en la unidad de datos, del canal especificado. los   La unidad de datos es igual a la configuración establecida en DMA_PeripheralDataSize   o miembros de DMA_MemoryDataSize según la dirección de transferencia.

  1. Establezca "DMA_PeripheralDataSize" y "DMA_MemoryDataSize" en byte, porque su interfaz LCD es de 8 bits.
  2. Al usar "DMA_M2M_Disable", necesita un origen de activación de DMA de hardware. Al usar "DMA_M2M", puede activar el DMA mediante su código. Al habilitar el DMA, se inicia la transferencia.
  3. Por último, habilita DMA y enciéndelo.
respondido por el diverger

Lea otras preguntas en las etiquetas