Compréhension d'un programme en DMA

Bonjour,
Je souhaiterai comprendre un exemple d'un programme utilisant le DMA. Savez vous où je pourrai trouver des informations, des documentations (comment faire un appel à une DMA, comment l'arrêter, comment initialiser, comment savoir si le transfert est complet ou demi complet, etc....) pour que je puisse avoir des éléments pour mettre en ouvre cette fonction DMA dans mon code.


Et dans le Main j'ai ce code :

  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
    if (transferErrorDetected == 1)
    {
      /* Toggle LED4 with a period of 200 ms */
      BSP_LED_Toggle(LED4);
      HAL_Delay(200);
    }
    if (transferCompleteDetected == 1)
    {
      /* Turn LED4 on*/
      BSP_LED_On(LED4);
      transferCompleteDetected = 0;
    }
  }
  /* USER CODE END 3 */
}

La LED4 est allumée si le transfert est complet et qu'il n'y a pas d'erreurs et on remet le Flag 'transferCompleteDetected' à 0 pour la prochaine itération sans doute. Et si pendant le transfert il y a des erreurs dans ce cas on fait clignoter la LED4 à une période 200 ms. Merci par avance de votre aide.

Dans cette partie

/* USER CODE BEGIN PV */

static const uint32_t aSRC_Const_Buffer[BUFFER_SIZE] =
{
  0x01020304, 0x05060708, 0x090A0B0C, 0x0D0E0F10,
  0x11121314, 0x15161718, 0x191A1B1C, 0x1D1E1F20,
  0x21222324, 0x25262728, 0x292A2B2C, 0x2D2E2F30,
  0x31323334, 0x35363738, 0x393A3B3C, 0x3D3E3F40,
  0x41424344, 0x45464748, 0x494A4B4C, 0x4D4E4F50,
  0x51525354, 0x55565758, 0x595A5B5C, 0x5D5E5F60,
  0x61626364, 0x65666768, 0x696A6B6C, 0x6D6E6F70,
  0x71727374, 0x75767778, 0x797A7B7C, 0x7D7E7F80
};

static uint32_t aDST_Buffer[BUFFER_SIZE];

static __IO uint32_t transferErrorDetected;    /* Set to 1 if an error transfer is detected */
static __IO uint32_t transferCompleteDetected; /* Set to 1 if transfer is correctly completed */
/* USER CODE END PV */

Dans cette partie PV (private variable ?), je vois cette déclaration, c'est une zone de mémoire avec les adresses. C'est une zone libre ou on peut écrire n'importe où ? Je suppose qu'il faut regarder les espaces de mémoire du microprocesseur utilisé. Je viens de voir le fichier readme, apparemment c'est une zone de mémoire Flash.
Dans un '.h' je vois que

/* USER CODE BEGIN Private defines */
#define BUFFER_SIZE 32
/* USER CODE END Private defines */

#ifdef __cplusplus

Donc c'est sur un 32 bits.

Et dans cette partie je vois :

/* USER CODE BEGIN PFP */
/* Private function prototypes -----------------------------------------------*/
static void TransferComplete(DMA_HandleTypeDef *hdma_memtomem_dma1_channel1);
static void TransferError(DMA_HandleTypeDef *hdma_memtomem_dma1_channel1);
/* USER CODE END PFP */

Donc on appel ces fonctions pour voir si tout va bien au niveau du transfert via la DMA.

Il y a une portion de code ici :

  /* Select Callbacks functions called after Transfer complete and Transfer error */
  HAL_DMA_RegisterCallback(&hdma_memtomem_dma1_channel1, HAL_DMA_XFER_CPLT_CB_ID, TransferComplete);
  HAL_DMA_RegisterCallback(&hdma_memtomem_dma1_channel1, HAL_DMA_XFER_ERROR_CB_ID, TransferError);

Mais je ne vois pas trop comment cette fonction est configurée et appelée, très probablement automatiquement par CubeMX

C'est sur STM32 ?

Bonjour,
Oui désolé c'est sur un STM32, je sais que ce n'est pas le bon endroit mais sur le Forum STM32 je ne trouve rien et personne répond. Alors je tente ma chance ici. Ceci dit c'est de la programmation quand même. Je cherche juste des éléments de réponses (des documentations, des liens internets....) pour que je puisse poursuivre mon développement.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.