cancel
Showing results for 
Search instead for 
Did you mean: 

STM32U535 using GPDMA and TIM2 to output a WAV file to the DAC

knights-of-ni
Visitor

I have been struggling with this chip for a few days now.  I have code up for the STM32F072, and the STM32F100 series chips, but the GPDMA in the STM32U535 is baffling me.  And no, I am not a big fan of the product notes for the GPDMA, while I've gone through them, I couldn't find much to help.

Here's the challenge; the chip fails immediately with a DMA_FLAG_DTE error, with the trigger overrun flag being set in the CSR.  No idea why or where to go next after 2 days of trying to troubleshoot this.  Here is the MXCube configuration:

clock config.jpgTIM2 config.jpgDAC config1.jpggpdma config.jpg

In the code, there is a simple 8Khz WAV file stored in the "tinkles" array.  Using the standard generated code from MXCube, I have attempted to just play it out the DAC with the following calls:

HAL_DAC_Start_DMA(&hdac1, DAC_CHANNEL_1, (uint32_t*)tinkles_wav, tinkles_wav_len, DAC_ALIGN_8B_R);
HAL_TIM_Base_Start(&htim2); 

It *is* an 8-bit array, and I am not sure if that may be part of this.  Here is the code:

extern unsigned int shot_wav_len, tinkles_wav_len;
extern unsigned char shot_wav[], tinkles_wav[];
/* USER CODE END PFP */
 
/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */
void HALDelayDontWork(uint32_t t) {
uint32_t s;
for (s = 0; s < t * 32222; s++) {
}
}
 
void HAL_DAC_ErrorCallbackCh1(DAC_HandleTypeDef *hdac) {
// while (1) {
GPIOB->ODR ^= 0x0100; //ground the bit - to turn the LED on
HALDelayDontWork(100);
GPIOB->ODR |= 0x0100; //Turn off the PCB LED
HALDelayDontWork(100);
// }
}
/* 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_GPDMA1_Init();
  MX_DAC1_Init();
  MX_FLASH_Init();
  MX_RTC_Init();
  MX_TIM1_Init();
  MX_TIM2_Init();
  MX_USB_DRD_FS_PCD_Init();
  MX_FileX_Init();
  MX_ICACHE_Init();
  MX_SPI1_Init();
  /* USER CODE BEGIN 2 */
GPIOB->ODR |= 0x0100; //Turn off the PCB LED
GPIOB->ODR |= 0x0200; //Turn off the USB LED
 
HAL_DAC_Start_DMA(&hdac1, DAC_CHANNEL_1, (uint32_t*)tinkles_wav, tinkles_wav_len, DAC_ALIGN_8B_R);
HAL_TIM_Base_Start(&htim2); 
 
  /* USER CODE END 2 */
 
  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
while (1) {
    /* USER CODE END WHILE */
 
    /* USER CODE BEGIN 3 */
}
  /* USER CODE END 3 */
}
And of course it is in the HAL_DAC_ErrorCallbackCh1 that we immediately wind up after a single interrupt to the GPDMA1_Channel0_IRQHandler, and a subsequent interrupt to DAC1_IRQHandler.  
 
What am I missing?
 
-D
0 REPLIES 0