硬汉嵌入式论坛

 找回密码
 立即注册
查看: 1462|回复: 0
收起左侧

[DMA] DMAMUX的Request Generator功能适合操作总线接口的外设,特别是ADC,是否适合高速AD,待测试

[复制链接]

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106989
QQ
发表于 2018-8-11 01:04:16 | 显示全部楼层 |阅读模式
例子:DMAMUX_RequestGen



DMXMUX的Request Generator触发源可以选择外部中断,也可以选择定时器或者其他触发源,这样用户就可以通过定时器触发控制DMA的传输速度。将FMC总线外挂的高速ADC传输数据到内部SRAM做缓冲

例子DMAMUX_RequestGen的配置参考:
  1. /* Private typedef -----------------------------------------------------------*/
  2. /* Private define ------------------------------------------------------------*/
  3. /* Private macro -------------------------------------------------------------*/
  4. /* Private variables ---------------------------------------------------------*/
  5. __IO   uint32_t DMA_TransferErrorFlag = 0;

  6. #if defined ( __ICCARM__ )
  7. #pragma location = 0x38000000
  8. uint32_t SRC_Buffer_LED1_Toggle[2]  =
  9.                                       {  0,          /*Value for LED 1 ON  */
  10.                                          LED1_PIN    /*Value for LED 1 OFF */  
  11.                                       };
  12. #elif defined ( __CC_ARM )
  13. __attribute__((section (".RAM_D3"))) uint32_t SRC_Buffer_LED1_Toggle[2] =
  14.                                       {  0,          /*Value for LED 1 ON  */
  15.                                          LED1_PIN    /*Value for LED 1 OFF */  
  16.                                       };
  17. #elif defined ( __GNUC__ )
  18. uint32_t __attribute__((section (".RAM_D3"))) SRC_Buffer_LED1_Toggle[2]  =
  19.                                       {  0,          /*Value for LED 1 ON  */
  20.                                          LED1_PIN    /*Value for LED 1 OFF */  
  21.                                       };
  22. #endif


  23. DMA_HandleTypeDef DMA_Handle;
  24. LPTIM_HandleTypeDef  LptimHandle;

  25. /* Private function prototypes -----------------------------------------------*/
  26. static void SystemClock_Config(void);
  27. static void CPU_CACHE_Enable(void);
  28. void LPTIM_Config(void);
  29. static void HAL_TransferError(DMA_HandleTypeDef *hdma);
  30. static void Error_Handler(void);

  31. /* Private functions ---------------------------------------------------------*/

  32. /**
  33.   * @brief  Main program
  34.   * @param  None
  35.   * @retval None
  36.   */
  37. int main(void)
  38. {
  39.   
  40.   HAL_DMA_MuxRequestGeneratorConfigTypeDef dmamux_ReqGenParams;
  41.   
  42.   /* Enable the CPU Cache */
  43.   CPU_CACHE_Enable();
  44.   
  45.   /* STM32H7xx HAL library initialization:
  46.      - Systick timer is configured by default as source of time base, but user
  47.        can eventually implement his proper time base source (a general purpose
  48.        timer for example or other time source), keeping in mind that Time base
  49.        duration should be kept 1ms since PPP_TIMEOUT_VALUEs are defined and
  50.        handled in milliseconds basis.
  51.      - Set NVIC Group Priority to 4
  52.      - Low Level Initialization
  53.   */
  54.   HAL_Init();
  55.   
  56.   /* Configure the system clock to 400 MHz */
  57.   SystemClock_Config();
  58.   
  59.   /* -1- Initialize LEDs mounted on STM32H743ZI-NUCLEO board */
  60.   BSP_LED_Init(LED1);
  61.   BSP_LED_Init(LED3);
  62.   

  63.   /*##-2- Configure the DMA ##################################################*/
  64.   
  65.   /* Enable BDMA clock */
  66.   __HAL_RCC_BDMA_CLK_ENABLE();
  67.   
  68.   /* Configure the DMA handler for Transmission process     */
  69.   /* DMA mode is set to circual for an infinit DMA transfer */  
  70.   DMA_Handle.Instance                 = BDMA_Channel0;
  71.   
  72.   DMA_Handle.Init.Request             = BDMA_REQUEST_GENERATOR0;  
  73.   DMA_Handle.Init.Direction           = DMA_MEMORY_TO_PERIPH;
  74.   DMA_Handle.Init.PeriphInc           = DMA_PINC_DISABLE;
  75.   DMA_Handle.Init.MemInc              = DMA_MINC_ENABLE;
  76.   DMA_Handle.Init.PeriphDataAlignment = DMA_PDATAALIGN_WORD;
  77.   DMA_Handle.Init.MemDataAlignment    = DMA_MDATAALIGN_WORD;
  78.   DMA_Handle.Init.Mode                = DMA_CIRCULAR;
  79.   DMA_Handle.Init.Priority            = DMA_PRIORITY_LOW;
  80.   DMA_Handle.Init.FIFOMode            = DMA_FIFOMODE_DISABLE;
  81.   DMA_Handle.Init.FIFOThreshold       = DMA_FIFO_THRESHOLD_FULL;
  82.   DMA_Handle.Init.MemBurst            = DMA_MBURST_SINGLE;
  83.   DMA_Handle.Init.PeriphBurst         = DMA_PBURST_SINGLE;
  84.   
  85.   DMA_Handle.XferCpltCallback         = NULL;
  86.   DMA_Handle.XferErrorCallback        = HAL_TransferError;
  87.   
  88.   /* Initialize the DMA with for Transmission process */
  89.   HAL_DMA_Init(&DMA_Handle);
  90.   
  91.   /* NVIC configuration for DMA transfer complete interrupt*/
  92.   HAL_NVIC_SetPriority(BDMA_Channel0_IRQn, 0, 1);
  93.   HAL_NVIC_EnableIRQ(BDMA_Channel0_IRQn);
  94.   
  95.   /*##-3- Configure and enable the DMAMUX Request generator  ####################*/
  96.   dmamux_ReqGenParams.SignalID  = HAL_DMAMUX2_REQ_GEN_LPTIM2_OUT; /* External request signal is LPTIM2 signal */
  97.   dmamux_ReqGenParams.Polarity  = HAL_DMAMUX_REQ_GEN_RISING;      /* External request signal edge is Rising  */
  98.   dmamux_ReqGenParams.RequestNumber = 1;                          /* 1 requests on each edge of the external request signal  */
  99.   
  100.   HAL_DMAEx_ConfigMuxRequestGenerator(&DMA_Handle, &dmamux_ReqGenParams);
  101.   
  102.   /* NVIC configuration for DMAMUX request generator overrun errors*/
  103.   HAL_NVIC_SetPriority(DMAMUX2_OVR_IRQn, 0, 1);
  104.   HAL_NVIC_EnableIRQ(DMAMUX2_OVR_IRQn);
  105.   
  106.   HAL_DMAEx_EnableMuxRequestGenerator (&DMA_Handle);
  107.   
  108.   /*##-4- Configure and enable the LPTIM2 used as DMA external request generator signal #####*/
  109.   LPTIM_Config();
  110.   
  111.   /*##-5- Start the DMA transfer ################################################*/
  112.   /* DMA source buffer is  SRC_BUFFER_LED1_TOGGLE containing values to be written
  113.   to GPIOB ODR register in order to turn LED1 On/Off each time comes a request from the DMAMUX request generator */  
  114.   HAL_DMA_Start(&DMA_Handle, (uint32_t)SRC_Buffer_LED1_Toggle, (uint32_t)&GPIOB->ODR, 2);
  115.   
  116.   /* Infinite loop */
  117.   while (1)
  118.   {
  119.     if(DMA_TransferErrorFlag != 0)
  120.     {
  121.       Error_Handler();      
  122.     }
  123.   }
  124. }

  125. /**
  126.   * @brief  Configure and start the LPTIM2 with 2sec period and 50% duty cycle.
  127.   * @param  None
  128.   * @retval None
  129.   */
  130. void LPTIM_Config(void)
  131. {

  132.   uint32_t periodValue;
  133.   uint32_t pulseValue ;
  134.   
  135.   RCC_OscInitTypeDef RCC_OscInitStruct;
  136.   RCC_PeriphCLKInitTypeDef  PeriphClkInitStruct;
  137.   
  138.   /* Enable the LSE clock source */
  139.   RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_LSE;
  140.   RCC_OscInitStruct.LSEState = RCC_LSE_ON;
  141.   HAL_RCC_OscConfig(&RCC_OscInitStruct);
  142.   
  143.   /* LPTIM2 clock source set to LSE*/
  144.   PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_LPTIM2;
  145.   PeriphClkInitStruct.Lptim2ClockSelection = RCC_LPTIM2CLKSOURCE_LSE;
  146.   HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct);  

  147.   periodValue = (2 * LSE_VALUE)/40;    /* Calculate the Timer  Autoreload value for 2sec period */
  148.   pulseValue  = periodValue/2;        /* Set the Timer  pulse value for 50% duty cycle         */
  149.   
  150.   /* TIM1 Peripheral clock enable */
  151.   __HAL_RCC_LPTIM2_CLK_ENABLE();
  152.   
  153.   LptimHandle.Instance                           = LPTIM2;

  154.   LptimHandle.Init.CounterSource                 = LPTIM_COUNTERSOURCE_INTERNAL;
  155.   LptimHandle.Init.UpdateMode                    = LPTIM_UPDATE_ENDOFPERIOD;
  156.   LptimHandle.Init.OutputPolarity                = LPTIM_OUTPUTPOLARITY_LOW;
  157.   LptimHandle.Init.Clock.Source                  = LPTIM_CLOCKSOURCE_APBCLOCK_LPOSC;
  158.   LptimHandle.Init.Clock.Prescaler               = LPTIM_PRESCALER_DIV4;
  159.   LptimHandle.Init.UltraLowPowerClock.Polarity   = LPTIM_CLOCKPOLARITY_RISING;
  160.   LptimHandle.Init.UltraLowPowerClock.SampleTime = LPTIM_CLOCKSAMPLETIME_DIRECTTRANSITION;
  161.   LptimHandle.Init.Trigger.Source                = LPTIM_TRIGSOURCE_SOFTWARE;
  162.   LptimHandle.Init.Trigger.ActiveEdge            = LPTIM_ACTIVEEDGE_RISING;
  163.   LptimHandle.Init.Trigger.SampleTime            = LPTIM_TRIGSAMPLETIME_DIRECTTRANSITION;

  164.   if(HAL_LPTIM_Init(&LptimHandle) != HAL_OK)
  165.   {
  166.     /* Initialization Error */
  167.     Error_Handler();
  168.   }
  169.   
  170.   /* Start the timer */
  171.   if (HAL_LPTIM_PWM_Start(&LptimHandle, periodValue, pulseValue) != HAL_OK)
  172.   {
  173.     Error_Handler();
  174.   }  
  175.   
  176. }

  177. static void HAL_TransferError(DMA_HandleTypeDef *hdma)
  178. {
  179.   DMA_TransferErrorFlag = 1;
  180. }
复制代码


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-13 09:35 , Processed in 0.155323 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表