OpenEdv-开源电子网

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

DMA实验失败

[复制链接]

34

主题

83

帖子

0

精华

初级会员

Rank: 2

积分
177
金钱
177
注册时间
2016-10-30
在线时间
38 小时
发表于 2017-3-25 15:57:00 | 显示全部楼层 |阅读模式
1金钱
void BSP_usartinit(void)
{
        //UART8
        UART8_Handler.Instance        = UART8;
  UART8_Handler.Init.BaudRate   = 9600;
  UART8_Handler.Init.WordLength = UART_WORDLENGTH_8B;
  UART8_Handler.Init.StopBits   = UART_STOPBITS_1;
  UART8_Handler.Init.Parity     = UART_PARITY_NONE;
  UART8_Handler.Init.HwFlowCtl  = UART_HWCONTROL_NONE;
  UART8_Handler.Init.Mode       = UART_MODE_TX_RX;
        HAL_UART_Init(&UART8_Handler);

        //HAL_UART_Receive_IT(&UART8_Handler, (uint8_t *)Handle_Buff, 13);
}
如上 是我串口的源码
__HAL_RCC_DMA1_CLK_ENABLE();  

    UART8_RxDMAHandler.Instance=DMA1_Stream6;                           
    UART8_RxDMAHandler.Init.Channel=DMA_CHANNEL_5;                                
    UART8_RxDMAHandler.Init.Direction=DMA_PERIPH_TO_MEMORY;           
    UART8_RxDMAHandler.Init.PeriphInc=DMA_PINC_DISABLE;               
    UART8_RxDMAHandler.Init.MemInc=DMA_MINC_ENABLE;                     
    UART8_RxDMAHandler.Init.PeriphDataAlignment=DMA_PDATAALIGN_BYTE;   
    UART8_RxDMAHandler.Init.MemDataAlignment=DMA_MDATAALIGN_BYTE;      
    UART8_RxDMAHandler.Init.Mode=DMA_CIRCULAR;                           
    UART8_RxDMAHandler.Init.Priority=DMA_PRIORITY_MEDIUM;              
    UART8_RxDMAHandler.Init.FIFOMode=DMA_FIFOMODE_DISABLE;              
    UART8_RxDMAHandler.Init.FIFOThreshold=DMA_FIFO_THRESHOLD_FULL;      
    UART8_RxDMAHandler.Init.MemBurst=DMA_MBURST_SINGLE;               
    UART8_RxDMAHandler.Init.PeriphBurst=DMA_PBURST_SINGLE;              

    HAL_DMA_DeInit(&UART8_RxDMAHandler);   
    HAL_DMA_Init(&UART8_RxDMAHandler);
          __HAL_LINKDMA(&UART8_Handler,hdmarx,UART8_RxDMAHandler);

    HAL_NVIC_SetPriority(DMA1_Stream6_IRQn,2,2);                 
    HAL_NVIC_EnableIRQ(DMA1_Stream6_IRQn);
                //HAL_DMA_RegisterCallback(&UART8_RxDMAHandler, HAL_DMA_XFER_CPLT_CB_ID, TransferComplete);
               
                HAL_UART_Receive_DMA(&UART8_Handler,Handle_DAM_Buff,11);
                //HAL_DMA_Start_IT(&UART8_RxDMAHandler, (uint32_t)sss, (uint32_t)&Handle_Buff, 3);
如上 是我DMA的设置,按理说,应该第一次电脑给串口发数,数组Handle_DAM_Buff里面的值应该变才对,可为什么数组里面的值没变



最佳答案

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

循环模式设置成正常模式 就正常了
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

34

主题

83

帖子

0

精华

初级会员

Rank: 2

积分
177
金钱
177
注册时间
2016-10-30
在线时间
38 小时
 楼主| 发表于 2017-3-25 15:57:01 | 显示全部楼层
ssis909 发表于 2017-3-29 18:02
楼主解决没有,我的DMA接收配置和你的一模一样,接收的数据个数是正确的,但是接收数据全为0,不知怎么回事

循环模式设置成正常模式 就正常了
回复

使用道具 举报

0

主题

174

帖子

0

精华

高级会员

Rank: 4

积分
725
金钱
725
注册时间
2016-1-9
在线时间
64 小时
发表于 2017-3-25 20:42:42 | 显示全部楼层
本帖最后由 whyviking 于 2017-3-25 20:47 编辑

好像不对,编辑掉、、
回复

使用道具 举报

0

主题

174

帖子

0

精华

高级会员

Rank: 4

积分
725
金钱
725
注册时间
2016-1-9
在线时间
64 小时
发表于 2017-3-25 21:09:56 | 显示全部楼层
本帖最后由 whyviking 于 2017-3-25 21:45 编辑


在循环模式下,如果为存储器配置了突发模式,必须遵循下列规则:
DMA_SxNDTR = ((Mburst 节拍 ) × (Msize)/(Psize)) 的倍数,其中:
— (Mburst 节拍 ) = 4、8 或 16(取决于 DMA_SxCR 寄存器中的 MBURST 位)
— ((Msize)/(Psize)) = 1、2、4、1/2 或 1/4(Msize 和 Psize 表示 DMA_SxCR 寄存器
中的 MSIZE 和 PSIZE 位。它们与字节相关)
— DMA_SxNDTR = AHB 外设端口上要传输的数据项的数目
例如:Mburst 节拍 = 8 (INCR8),MSIZE =“00”(字节)和 PSIZE =“01”(半字),在 此例中:DMA_SxNDTR 必须是 (8 × 1/2 = 4) 的倍数。
如果不遵循此公式,则 DMA 行为和数据完整性得不到保证。
NDTR 还必须是外设突发大小与外设数据大小乘积的倍数,否则会导致错误的 DMA 行为。
回复

使用道具 举报

21

主题

71

帖子

0

精华

初级会员

Rank: 2

积分
167
金钱
167
注册时间
2013-12-1
在线时间
88 小时
发表于 2017-3-29 18:02:32 | 显示全部楼层
楼主解决没有,我的DMA接收配置和你的一模一样,接收的数据个数是正确的,但是接收数据全为0,不知怎么回事
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2017-3-29 20:28:28 | 显示全部楼层
帮顶
回复

使用道具 举报

34

主题

83

帖子

0

精华

初级会员

Rank: 2

积分
177
金钱
177
注册时间
2016-10-30
在线时间
38 小时
 楼主| 发表于 2017-3-30 16:06:52 | 显示全部楼层
ssis909 发表于 2017-3-29 18:02
楼主解决没有,我的DMA接收配置和你的一模一样,接收的数据个数是正确的,但是接收数据全为0,不知怎么回事

我给忘了 解决的话给你说一下
回复

使用道具 举报

34

主题

83

帖子

0

精华

初级会员

Rank: 2

积分
177
金钱
177
注册时间
2016-10-30
在线时间
38 小时
 楼主| 发表于 2017-3-30 16:07:11 | 显示全部楼层
回复

使用道具 举报

34

主题

83

帖子

0

精华

初级会员

Rank: 2

积分
177
金钱
177
注册时间
2016-10-30
在线时间
38 小时
 楼主| 发表于 2017-4-17 15:21:57 | 显示全部楼层
whyviking 发表于 2017-3-25 20:42
好像不对,编辑掉、、

那怎么弄对呢
回复

使用道具 举报

34

主题

83

帖子

0

精华

初级会员

Rank: 2

积分
177
金钱
177
注册时间
2016-10-30
在线时间
38 小时
 楼主| 发表于 2017-4-17 15:22:22 | 显示全部楼层
whyviking 发表于 2017-3-25 21:09
在循环模式下,如果为存储器配置了突发模式,必须遵循下列规则:
DMA_SxNDTR = ((Mburst 节拍 ) × (Msi ...

什么意思啊 我没有主动配置突发模式啊
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-18 17:41

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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