关于stm32g431串口与FDCAN数据不同同时处理问题
STM32H750使能DCache后用DMA会导致程序异常问题
SPI DMA发送不成功的问题
串口IDLE标识被自动清除
求助STM32L010F4P6的USART2使用DMA只能接收一个字节!
使用DMA通道4开启串口1,开启中断之后,程序错乱
在STM32F407上使用DMA给TIM2的CCR4写值,输出固定个数PWM波个数时,遇见了CCR4的高位与低位同时被写入相同的值
求助,关于STM32 HAL库 SPI怎么发送16位宽度数据问题
为什么DMA半传输中断和完全传输中断不能独立关闭?
STM32H743定时器触发DMA采集GPIO口的状态
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