void DAC_DMA_TIM_Init(void) { DAC_HandleTypeDef DAC; DMA_HandleTypeDef DMA; TIM_HandleTypeDef TIM; GPIO_InitTypeDef GPIO; DAC_ChannelConfTypeDef sConfig; TIM_MasterConfigTypeDef sMasterConfig; /*##-1- Configure the TIM peripheral #######################################*/ /* Configure the NVIC for DAC DMA */ HAL_NVIC_SetPriority(DMA1_Stream6_IRQn, 5, 0); HAL_NVIC_EnableIRQ(DMA1_Stream6_IRQn); /* DAC TIM Periph clock enable */ __TIM6_CLK_ENABLE(); TIM.State = HAL_TIM_STATE_RESET; TIM.Instance = TIM6; /* Auto-reload value according to audio sampling rate */ TIM.Init.Period = (84000000 + (44100 / 2)) / 44100; TIM.Init.Prescaler = 0; TIM.Init.ClockDivision = 0; TIM.Init.CounterMode = TIM_COUNTERMODE_UP; HAL_TIM_Base_Init(&TIM); /* TIM6 TRGO selection */ sMasterConfig.MasterOutputTrigger = TIM_TRGO_UPDATE; sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; HAL_TIMEx_MasterConfigSynchronization(&TIM, &sMasterConfig); /*##-2- Configure DMA and Associate it with DAC ############################*/ /* DMA1 clock enable */ __DMA1_CLK_ENABLE(); /* Set the parameters to be configured for Channel */ DMA.State = HAL_DMA_STATE_RESET; DMA.Init.Channel = DMA_CHANNEL_7; DMA.Init.Direction = DMA_MEMORY_TO_PERIPH; DMA.Init.PeriphInc = DMA_PINC_DISABLE; DMA.Init.MemInc = DMA_MINC_ENABLE; DMA.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD; DMA.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD; DMA.Init.Mode = DMA_CIRCULAR; DMA.Init.Priority = DMA_PRIORITY_HIGH; DMA.Init.FIFOMode = DMA_FIFOMODE_ENABLE; DMA.Init.FIFOThreshold = DMA_FIFO_THRESHOLD_FULL; DMA.Init.MemBurst = DMA_MBURST_SINGLE; DMA.Init.PeriphBurst = DMA_PBURST_SINGLE; DMA.Instance = DMA1_Stream6_BASE; /* Associate the initialized DMA handle to the the DAC handle */ __HAL_LINKDMA(&DAC, DMA_Handle2, DMA); /* Configure the DMA Stream */ HAL_DMA_Init(&DMA); /*##-3- Configure peripheral GPIO ##########################################*/ /* Enable GPIO clock */ __GPIOA_CLK_ENABLE(); /* DAC Channel GPIO pin configuration */ GPIO.Pin = GPIO_PIN_5; GPIO.Mode = GPIO_MODE_ANALOG; GPIO.Pull = GPIO_NOPULL; HAL_GPIO_Init(GPIOA, &GPIO); /*##-4- Configure DAC ######################################################*/ /* DAC clock enable */ __DAC_CLK_ENABLE(); /* Configure the DAC Stream */ DAC.State = HAL_DAC_STATE_RESET; HAL_DAC_Init(&hAudioOutDAC); /* Configure the DAC Channel */ sConfig.DAC_Trigger = DAC_TRIGGER_T6_TRGO; sConfig.DAC_OutputBuffer = DAC_OUTPUTBUFFER_ENABLE; HAL_DAC_SetValue(&DAC, DAC_CHANNEL_2, DAC_ALIGN_12B_L, 0x7fff); HAL_DAC_ConfigChannel(&DAC, &sConfig, DAC_CHANNEL_2); /*##-5- Start DAC DMA TIM ##################################################*/ HAL_DAC_Start_DMA(&DAC, DAC_CHANNEL_2, pData, 2048, DAC_ALIGN_12B_L); HAL_TIM_Base_Start(&TIM); }