DMAMUX 使用内部外设Request Event(不使用TIM12和LPTIM)
DMA传输完成后,串口与DMA一直处于忙状态
STM32F407VET6 能适配哪些FATFS版本文件
STM32H7A3VGTA QSPI读W25Q128J DMA模式不能工作
//STM32H7A3VGT6 QSPI的DMA方式无法正常工作
HAL_TIM_IC_Start_DMA的回调函数是HAL_TIM_IC_CaptureCpltCallback吗?为什么进不去?
STM32G473RC timer8的CCDS bit, Capture/Compare DMA selection.
STM32H7+SAI+DMA双缓冲配置失败.
利用stm32f412 的SPI 的DMA 模式读取外部ADC数据如何提高效率
FW_H7 V1.12.1-HAL库DMA双缓冲配置
微信公众号
手机版
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 );
}
,其链接是 https://mp.weixin.qq.com/s?__biz=MzA3OTIxMjQyNQ==&mid=2650949270&idx=1&sn=9e2cc8f4f355ee54a93ae5ed963acc34&chksm=84401c70b337956675c3b6dd6807a8e7a946506614e1f1edd0b03b3393da80c61f282d70d7b5&token=1260899245&lang=zh_CN#rd 主要了解下相关配置及函数用法。
https://mp.weixin.qq.com/s?__biz=MzA3OTIxMjQyNQ==&mid=2650949270&idx=1&sn=9e2cc8f4f355ee54a93ae5ed963acc34&chksm=84401c70b337956675c3b6dd6807a8e7a946506614e1f1edd0b03b3393da80c61f282d70d7b5&token=1260899245&lang=zh_CN#rd