| |
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 ); }
正确波形图显示应该都是正弦波,但是这里只有一个缓冲区是正确填补了数据,另一个缓冲区的数据并不是正确的,大哥们怎么破
波形图
。。。。。。。
关于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 主要了解下相关配置及函数用法。
关于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