STM32F407VGE DAC using DMA - Page 1
Forum section: electronics / general

author: wilco2009
author_rank: Newbie
timestamp: August 06, 2021, 06:46:56 pm
content: Hi all!I am newie using STM32 controller.I am using a chinese STM32F407 board from DIYMore.Now I am trying to use DMA to generate a wave signal through the DAC1 channel.Without DMA DAC y working without problems, but I have not be able to generate the signal using DMA. It is like DMA never starts.I have seen a lot of tutorials but there are no way.Below I have attached the code I am using.Have anybody idea what is happening?thanks in advanceCode:/* USER CODE BEGIN Header *//********************************************************************************* @file : main.c* @brief : Main program body******************************************************************************* @attention** <h2><center>&copy; Copyright (c) 2021 STMicroelectronics.* All rights reserved.</center></h2>** This software component is licensed by ST under BSD 3-Clause license,* the "License"; You may not use this file except in compliance with the* License. You may obtain a copy of the License at:* opensource.org/licenses/BSD-3-Clause********************************************************************************//* USER CODE END Header *//* Includes ------------------------------------------------------------------*/#include "main.h"/* Private includes ----------------------------------------------------------*//* USER CODE BEGIN Includes *//* USER CODE END Includes *//* Private typedef -----------------------------------------------------------*//* USER CODE BEGIN PTD *//* USER CODE END PTD *//* Private define ------------------------------------------------------------*//* USER CODE BEGIN PD *//* USER CODE END PD *//* Private macro -------------------------------------------------------------*//* USER CODE BEGIN PM *//* USER CODE END PM *//* Private variables ---------------------------------------------------------*/DAC_HandleTypeDef hdac;DMA_HandleTypeDef hdma_dac1;TIM_HandleTypeDef htim6;/* USER CODE BEGIN PV */const uint8_t myDAC_Signal={0, 40, 80, 120, 160, 200, 240};//const uint32_t myDAC_Signal={240, 240, 240, 240, 240, 240, 240};//const uint8_t myDAC_Signal={0, 0, 0, 0, 0, 0, 0};/* USER CODE END PV *//* Private function prototypes -----------------------------------------------*/void SystemClock_Config(void);static void MX_GPIO_Init(void);static void MX_DAC_Init(void);static void MX_DMA_Init(void);static void MX_TIM6_Init(void);/* USER CODE BEGIN PFP *//* USER CODE END PFP *//* Private user code ---------------------------------------------------------*//* USER CODE BEGIN 0 *//* USER CODE END 0 *//*** @brief The application entry point.* @retval int*/int main(void){/* USER CODE BEGIN 1 *//* USER CODE END 1 *//* MCU Configuration--------------------------------------------------------*//* Reset of all peripherals, Initializes the Flash interface and the Systick. */HAL_Init();/* USER CODE BEGIN Init *//* USER CODE END Init *//* Configure the system clock */SystemClock_Config();/* USER CODE BEGIN SysInit *//* USER CODE END SysInit *//* Initialize all configured peripherals */MX_GPIO_Init();MX_DAC_Init();MX_DMA_Init();MX_TIM6_Init();/* USER CODE BEGIN 2 */HAL_TIM_Base_Start(&htim6);// HAL_DACEx_NoiseWaveGenerate(&hdac, DAC_CHANNEL_1, DAC_TRIANGLEAMPLITUDE_2047);HAL_DAC_Start(&hdac, DAC_CHANNEL_1);// HAL_DAC_SetValue(&hdac, DAC_CHANNEL_1, DAC_ALIGN_8B_R, 120);HAL_DAC_Start_DMA(&hdac, DAC_CHANNEL_1, (uint32_t *) myDAC_Signal, 7, DAC_ALIGN_8B_R);/* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */while (1){/* USER CODE END WHILE *//* USER CODE BEGIN 3 */}/* USER CODE END 3 */}/*** @brief System Clock Configuration* @retval None*/void SystemClock_Config(void){RCC_OscInitTypeDef RCC_OscInitStruct = {0};RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};/** Configure the main internal regulator output voltage*/__HAL_RCC_PWR_CLK_ENABLE();__HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);/** Initializes the RCC Oscillators according to the specified parameters* in the RCC_OscInitTypeDef structure.*/RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;RCC_OscInitStruct.HSIState = RCC_HSI_ON;RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI;RCC_OscInitStruct.PLL.PLLM = 8;RCC_OscInitStruct.PLL.PLLN = 84;RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;RCC_OscInitStruct.PLL.PLLQ = 4;if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK){Error_Handler();}/** Initializes the CPU, AHB and APB buses clocks*/RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4;RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV4;if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK){Error_Handler();}}/*** @brief DAC Initialization Function* @param None* @retval None*/static void MX_DAC_Init(void){/* USER CODE BEGIN DAC_Init 0 *//* USER CODE END DAC_Init 0 */DAC_ChannelConfTypeDef sConfig = {0};/* USER CODE BEGIN DAC_Init 1 *//* USER CODE END DAC_Init 1 *//** DAC Initialization*/hdac.Instance = DAC;if (HAL_DAC_Init(&hdac) != HAL_OK){Error_Handler();}/** DAC channel OUT1 config*/sConfig.DAC_Trigger = DAC_TRIGGER_T6_TRGO;sConfig.DAC_OutputBuffer = DAC_OUTPUTBUFFER_ENABLE;if (HAL_DAC_ConfigChannel(&hdac, &sConfig, DAC_CHANNEL_1) != HAL_OK){Error_Handler();}/* USER CODE BEGIN DAC_Init 2 *//* USER CODE END DAC_Init 2 */}/*** @brief TIM6 Initialization Function* @param None* @retval None*/static void MX_TIM6_Init(void){/* USER CODE BEGIN TIM6_Init 0 *//* USER CODE END TIM6_Init 0 */TIM_MasterConfigTypeDef sMasterConfig = {0};/* USER CODE BEGIN TIM6_Init 1 *//* USER CODE END TIM6_Init 1 */htim6.Instance = TIM6;htim6.Init.Prescaler = 42-1;htim6.Init.CounterMode = TIM_COUNTERMODE_UP;htim6.Init.Period = 10-1;htim6.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;if (HAL_TIM_Base_Init(&htim6) != HAL_OK){Error_Handler();}sMasterConfig.MasterOutputTrigger = TIM_TRGO_UPDATE;sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;if (HAL_TIMEx_MasterConfigSynchronization(&htim6, &sMasterConfig) != HAL_OK){Error_Handler();}/* USER CODE BEGIN TIM6_Init 2 *//* USER CODE END TIM6_Init 2 */}/*** Enable DMA controller clock*/static void MX_DMA_Init(void){/* DMA controller clock enable */__HAL_RCC_DMA1_CLK_ENABLE();/* DMA interrupt init *//* DMA1_Stream5_IRQn interrupt configuration */HAL_NVIC_SetPriority(DMA1_Stream5_IRQn, 0, 0);HAL_NVIC_EnableIRQ(DMA1_Stream5_IRQn);}/*** @brief GPIO Initialization Function* @param None* @retval None*/static void MX_GPIO_Init(void){GPIO_InitTypeDef GPIO_InitStruct = {0};/* GPIO Ports Clock Enable */__HAL_RCC_GPIOA_CLK_ENABLE();__HAL_RCC_GPIOD_CLK_ENABLE();__HAL_RCC_GPIOE_CLK_ENABLE();/*Configure GPIO pin Output Level */HAL_GPIO_WritePin(GPIOD, GPIO_PIN_12|GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15, GPIO_PIN_RESET);/*Configure GPIO pin Output Level */HAL_GPIO_WritePin(GPIOE, GPIO_PIN_0, GPIO_PIN_RESET);/*Configure GPIO pins : PD12 PD13 PD14 PD15 */GPIO_InitStruct.Pin = GPIO_PIN_12|GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15;GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;GPIO_InitStruct.Pull = GPIO_NOPULL;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);/*Configure GPIO pin : PE0 */GPIO_InitStruct.Pin = GPIO_PIN_0;GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;GPIO_InitStruct.Pull = GPIO_NOPULL;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;HAL_GPIO_Init(GPIOE, &GPIO_InitStruct);}/* USER CODE BEGIN 4 *//* USER CODE END 4 *//*** @brief This function is executed in case of error occurrence.* @retval None*/void Error_Handler(void){/* USER CODE BEGIN Error_Handler_Debug *//* User can add his own implementation to report the HAL error return state */__disable_irq();while (1){}/* USER CODE END Error_Handler_Debug */}#ifdef USE_FULL_ASSERT/*** @brief Reports the name of the source file and the source line number* where the assert_param error has occurred.* @param file: pointer to the source file name* @param line: assert_param error line source number* @retval None*/void assert_failed(uint8_t *file, uint32_t line){/* USER CODE BEGIN 6 *//* User can add his own implementation to report the file name and line number,ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) *//* USER CODE END 6 */}#endif /* USE_FULL_ASSERT *//************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

author: MasterT
author_rank: Frequent Contributor
timestamp: August 06, 2021, 09:22:03 pm
content: I don't see dma configuration:Code:void DMA_Config(DAC_HandleTypeDef *hdac){static DMA_HandleTypeDef hdma_dac1;__HAL_RCC_DAC_CLK_ENABLE();__HAL_RCC_DMA1_CLK_ENABLE();hdma_dac1.Instance = DMA1_Stream5;hdma_dac1.Init.Channel = DMA_CHANNEL_7;hdma_dac1.Init.Direction = DMA_MEMORY_TO_PERIPH;hdma_dac1.Init.PeriphInc = DMA_PINC_DISABLE;hdma_dac1.Init.MemInc = DMA_MINC_ENABLE;// hdma_dac1.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD;//BYTE;hdma_dac1.Init.PeriphDataAlignment = DMA_PDATAALIGN_WORD;//BYTE;hdma_dac1.Init.MemDataAlignment = DMA_MDATAALIGN_WORD; //DMA_MDATAALIGN_BYTE;hdma_dac1.Init.Mode = DMA_CIRCULAR;hdma_dac1.Init.Priority = DMA_PRIORITY_VERY_HIGH;hdma_dac1.Init.FIFOMode = DMA_FIFOMODE_ENABLE;hdma_dac1.Init.FIFOThreshold = DMA_FIFO_THRESHOLD_1QUARTERFULL;hdma_dac1.Init.MemBurst = DMA_MBURST_SINGLE;hdma_dac1.Init.PeriphBurst = DMA_PBURST_SINGLE;HAL_DMA_Init(&hdma_dac1);__HAL_LINKDMA(hdac, DMA_Handle1, hdma_dac1);// HAL_NVIC_SetPriority(DMA1_Stream5_IRQn, 0, 0);//HAL_NVIC_EnableIRQ(DMA1_Stream5_IRQn);}Stm32CubeMX can help with code

author: DavidAlfa
author_rank: Super Contributor
timestamp: August 07, 2021, 02:46:40 am
content: Did you enable the DMA channel for the dac?

author: wilco2009
author_rank: Newbie
timestamp: August 07, 2021, 09:04:18 am
content: Quote from: MasterT on August 06, 2021, 09:22:03 pmYes, I am using ST32CubeMX and the previous code is the result. I though the mision of the following line was to configure DMA/DAC link and start DMA and DAC.I will try your code to initialise it.

author: wilco2009
author_rank: Newbie
timestamp: August 07, 2021, 09:06:54 am
content: Yes, it is enabled in cubeMX. I am not sure where is done in the code.

author: wilco2009
author_rank: Newbie
timestamp: August 07, 2021, 09:35:50 am
content: Quote from: MasterT on August 06, 2021, 09:22:03 pmMany thanks!!For some reason, I though MXCube had to add the necesary code to configure it.Now is working perfectly.I am 3 days broken my brain without results.