久芯网

dma双缓冲区有一个缓冲区数据中断填写出问题

avatar 盖亚 提问时间: 2023-08-23 21:18:29 / 未解决

7个回答
  • avatar 盖亚
    回答时间: 2023-08-23 21:40:38

    dma的配置(是内存到I2S数据寄存器的方式) hdma_spi3_tx.Instance = DMA1_Stream5; hdma_spi3_tx.Init.Channel = DMA_CHANNEL_0; hdma_spi3_tx.Init.Direction = DMA_MEMORY_TO_PERIPH; hdma_spi3_tx.Init.PeriphInc = DMA_PINC_DISABLE; hdma_spi3_tx.Init.MemInc = DMA_MINC_ENABLE; hdma_spi3_tx.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD; hdma_spi3_tx.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD; hdma_spi3_tx.Init.Mode = DMA_CIRCULAR; hdma_spi3_tx.Init.Priority = DMA_PRIORITY_LOW; hdma_spi3_tx.Init.FIFOMode = DMA_FIFOMODE_DISABLE; hdma_spi3_tx.Init.MemBurst = DMA_MBURST_SINGLE; hdma_spi3_tx.Init.PeriphBurst = DMA_PBURST_SINGLE; 中断处理函数内容: void DMA1_Stream5_IRQHandler(void) { rollback(); UBaseType_t uxSavedInterruptStatus; static uint32_t count = 2; BaseType_t xHigherPriorityTaskWoken; xHigherPriorityTaskWoken = pdFALSE; uxSavedInterruptStatus = pdFALSE; xSemaphoreTakeFromISR(isrSwitchTaskSem,&xHigherPriorityTaskWoken); if(__HAL_DMA_GET_FLAG(&hdma_spi3_tx,DMA_FLAG_TCIF1_5)!=RESET) //DMA传输完成 { __HAL_DMA_CLEAR_FLAG(&hdma_spi3_tx,DMA_FLAG_TCIF1_5); //清除DMA传输完成中断标志位 if(DMA1_Stream5->CR&(1<<19)) //填数据buf1 { printf("2\r\n"); uxSavedInterruptStatus = taskENTER_CRITICAL_FROM_ISR(); if(count%3 == 0) { //wav_pack1_buf = recvpack2; for(int i = 0 ; i<(WAV_BUF_SIZE/2) ;i++) { wav_pack1_buf = audio1khz; } count++; } else if(count%3 == 1) { //wav_pack1_buf = recvpack3; for(int i = 0 ; i<(WAV_BUF_SIZE/2) ;i++) { wav_pack1_buf = audio1khz; } count++; } else if(count%3 == 2) { //wav_pack1_buf = recvpack4; for(int i = 0 ; i<(WAV_BUF_SIZE/2) ;i++) { wav_pack1_buf =audio1khz; } count++; } taskEXIT_CRITICAL_FROM_ISR(uxSavedInterruptStatus); } else //buf2 { printf("3\r\n"); uxSavedInterruptStatus = taskENTER_CRITICAL_FROM_ISR(); if(count%3 == 0) { //wav_pack2_buf = recvpack2; for(int i = 0 ; i<(WAV_BUF_SIZE/2) ;i++) { wav_pack2_buf = audio1khz; } count++; } else if(count%3 == 1) { //wav_pack2_buf = recvpack3; for(int i = 0 ; i<(WAV_BUF_SIZE/2) ;i++) { wav_pack2_buf = audio1khz; } count++; } else if(count%3 == 2) { //wav_pack2_buf = recvpack4; for(int i = 0 ; i<(WAV_BUF_SIZE/2) ;i++) { wav_pack2_buf = audio1khz; } count++; } taskEXIT_CRITICAL_FROM_ISR(uxSavedInterruptStatus); } //----------------------------------------------- //taskEXIT_CRITICAL_FROM_ISR(uxSavedInterruptStatus); } portYIELD_FROM_ISR( xHigherPriorityTaskWoken ); }

  • avatar 盖亚
    回答时间: 2023-08-23 21:59:18

  • avatar 盖亚
    回答时间: 2023-08-23 22:17:36

    正确波形图显示应该都是正弦波,但是这里只有一个缓冲区是正确填补了数据,另一个缓冲区的数据并不是正确的,大哥们怎么破

  • avatar 盖亚
    回答时间: 2023-08-23 22:42:52

    波形图

  • avatar 龙飞nm
    回答时间: 2023-08-23 23:09:25

    。。。。。。。

  • avatar xmshao
    回答时间: 2023-08-23 23:26:27

    关于DMA双缓冲应用,你可以参考下这篇应用文章《 STM32 DMA双缓冲模式应用示例》 ,其链接是 https://mp.weixin.qq.com/s?__biz=MzA3OTIxMjQyNQ==&mid=2650949270&idx=1&sn=9e2cc8f4f355ee54a93ae5ed963acc34&chksm=84401c70b337956675c3b6dd6807a8e7a946506614e1f1edd0b03b3393da80c61f282d70d7b5&token=1260899245&lang=zh_CN#rd 主要了解下相关配置及函数用法。

  • avatar xmshao
    回答时间: 2023-08-23 23:56:18
    xmshao 发表于 2021-9-26 10:10
    关于DMA双缓冲应用,你可以参考下这篇应用文章《 STM32 DMA双缓冲模式应用示例》 ,其链接是 https://mp.w ...

    https://mp.weixin.qq.com/s?__biz=MzA3OTIxMjQyNQ==&mid=2650949270&idx=1&sn=9e2cc8f4f355ee54a93ae5ed963acc34&chksm=84401c70b337956675c3b6dd6807a8e7a946506614e1f1edd0b03b3393da80c61f282d70d7b5&token=1260899245&lang=zh_CN#rd

会员中心 微信客服
客服
回到顶部