OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 6317|回复: 5

我目前使用wm8978,为何不能够使用 DMA2_Stream4 ??

[复制链接]

260

主题

810

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1898
金钱
1898
注册时间
2012-10-28
在线时间
357 小时
发表于 2017-5-3 09:35:39 | 显示全部楼层 |阅读模式
3金钱
本帖最后由 hpdell 于 2017-5-3 14:57 编辑

我目前使用wm8978,
使用 DMA2_Stream5,通道0可以,
但是使用DMA2_Stream4,通道1 却不行,
查看资料也没有发现还有其他的差别
有谁知道是为什么吗 ?

dma2-.png

最佳答案

查看完整内容[请看2#楼]

终于搞定了, 原来这个也得修改才行 需要把这个 DMA_FLAG_TCIF1_5 改成 DMA_FLAG_TCIF0_4 就看了 原来天真的以为 DMA_FLAG_TCIF1_5 这个是包含 4的,其实不是, 我目前把hal哭升级到了最新的版本,如果使用比较早的hal苦的话,估计应该不用修改吧
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

260

主题

810

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1898
金钱
1898
注册时间
2012-10-28
在线时间
357 小时
 楼主| 发表于 2017-5-3 09:35:40 | 显示全部楼层

终于搞定了,

原来这个也得修改才行

需要把这个  DMA_FLAG_TCIF1_5 改成  DMA_FLAG_TCIF0_4 就看了

原来天真的以为 DMA_FLAG_TCIF1_5 这个是包含 4的,其实不是,

我目前把hal哭升级到了最新的版本,如果使用比较早的hal苦的话,估计应该不用修改吧
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2017-5-4 23:26:24 | 显示全部楼层
看上去没问题,检查配置吧
回复

使用道具 举报

260

主题

810

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1898
金钱
1898
注册时间
2012-10-28
在线时间
357 小时
 楼主| 发表于 2017-5-8 15:47:07 | 显示全部楼层
这个问题没有其他人遇到过吗 ????
回复

使用道具 举报

260

主题

810

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1898
金钱
1898
注册时间
2012-10-28
在线时间
357 小时
 楼主| 发表于 2017-5-8 16:41:22 | 显示全部楼层
正点原子 发表于 2017-5-4 23:26
看上去没问题,检查配置吧





你好,基本也是使用你们历程的配置,只是修改了数据流而已

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);
}



回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2017-5-8 20:25:10 | 显示全部楼层
hpdell 发表于 2017-5-8 16:41
你好,基本也是使用你们历程的配置,只是修改了数据流而已

extern DMA_HandleTypeDef SAI1_RX ...

慢慢调了
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-17 10:02

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表