金牌会员
 
- 积分
- 1898
- 金钱
- 1898
- 注册时间
- 2012-10-28
- 在线时间
- 357 小时
|

楼主 |
发表于 2017-5-8 16:41:22
|
显示全部楼层
你好,基本也是使用你们历程的配置,只是修改了数据流而已
extern DMA_HandleTypeDef SAI1_RXDMA_Handler; //DMA接收句柄
#if 1 // 使用这个配置可以
#define SAIA_RX_DMA2_StreamX DMA2_Stream5
#define SAIA_RX_DMA2_StreamX_IRQn DMA2_Stream5_IRQn
#define SAIA_RX_DMA2_StreamX_IRQHandler DMA2_Stream5_IRQHandler
#define SAIA_RX_DMA_CHANNEL_X DMA_CHANNEL_0
#else // 使用这个配置不行,不知道是为何 ????????????????
#define SAIA_RX_DMA2_StreamX DMA2_Stream4
#define SAIA_RX_DMA2_StreamX_IRQn DMA2_Stream4_IRQn
#define SAIA_RX_DMA2_StreamX_IRQHandler DMA2_Stream4_IRQHandler
#define SAIA_RX_DMA_CHANNEL_X DMA_CHANNEL_1
#endif
void SAIA_RX_DMA_Init(u8* buf0, u8 *buf1, u16 num, u8 width)
{
u32 memwidth=0,perwidth=0; //外设和存储器位宽
switch(width)
{
case 0: //8位
memwidth = DMA_MDATAALIGN_BYTE;
perwidth = DMA_PDATAALIGN_BYTE;
break;
case 1: //16位
memwidth = DMA_MDATAALIGN_HALFWORD;
perwidth = DMA_PDATAALIGN_HALFWORD;
break;
case 2: //32位
memwidth = DMA_MDATAALIGN_WORD;
perwidth = DMA_PDATAALIGN_WORD;
break;
}
__HAL_RCC_DMA2_CLK_ENABLE(); //使能DMA2时钟
__HAL_LINKDMA(&SAI1B_Handler,hdmarx,SAI1_RXDMA_Handler); //将DMA与SAI联系起来
SAI1_RXDMA_Handler.Instance = SAIA_RX_DMA2_StreamX; //DMA2数据流4 , DMA2_Stream5
SAI1_RXDMA_Handler.Init.Channel = SAIA_RX_DMA_CHANNEL_X; //通道1
SAI1_RXDMA_Handler.Init.Direction = DMA_PERIPH_TO_MEMORY; //外设到存储器模式
SAI1_RXDMA_Handler.Init.PeriphInc = DMA_PINC_DISABLE; //外设非增量模式
SAI1_RXDMA_Handler.Init.MemInc = DMA_MINC_ENABLE; //存储器增量模式
SAI1_RXDMA_Handler.Init.PeriphDataAlignment = perwidth; //外设数据长度:16/32位
SAI1_RXDMA_Handler.Init.MemDataAlignment = memwidth; //存储器数据长度:16/32位
SAI1_RXDMA_Handler.Init.Mode = DMA_CIRCULAR; //使用循环模式
SAI1_RXDMA_Handler.Init.Priority = DMA_PRIORITY_MEDIUM; //中等优先级
SAI1_RXDMA_Handler.Init.FIFOMode = DMA_FIFOMODE_DISABLE; //不使用FIFO
SAI1_RXDMA_Handler.Init.MemBurst = DMA_MBURST_SINGLE; //存储器单次突发传输
SAI1_RXDMA_Handler.Init.PeriphBurst = DMA_PBURST_SINGLE; //外设突发单次传输
HAL_DMA_DeInit(&SAI1_RXDMA_Handler); //先清除以前的设置
HAL_DMA_Init(&SAI1_RXDMA_Handler); //初始化DMA
HAL_DMAEx_MultiBufferStart(&SAI1_RXDMA_Handler,
(u32)&SAI1_Block_B->DR,
(u32)buf0,
(u32)buf1,
num); //开启双缓冲
__HAL_DMA_DISABLE(&SAI1_RXDMA_Handler); //先关闭接收DMA
HAL_Delay(2); //2ms延时,防止-O2优化出问题
__HAL_DMA_CLEAR_FLAG(&SAI1_RXDMA_Handler, DMA_FLAG_TCIF1_5); //清除DMA传输完成中断标志位
__HAL_DMA_ENABLE_IT(&SAI1_RXDMA_Handler, DMA_IT_TC); //开启传输完成中断
HAL_NVIC_SetPriority(SAIA_RX_DMA2_StreamX_IRQn, 0, 1); //DMA中断优先级
HAL_NVIC_EnableIRQ(SAIA_RX_DMA2_StreamX_IRQn);
}
|
|