硬汉嵌入式论坛

 找回密码
 立即注册
查看: 3777|回复: 0
收起左侧

注意STM32F4的HAL库正确使用HAL_DMA_DeInit函数,否则会卡死

[复制链接]

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117546
QQ
发表于 2020-3-17 09:51:00 | 显示全部楼层 |阅读模式


实际测试发现,使用STM32F4的HAL库函数HAL_DMA_DeInit,务必要先初始化DMA句柄的结构体成员了才可以正确执行,特别是成员Instance,务必要指定复位的那个DMA。

鉴于此,如果打算重复配置DMA的话,采用下面的方式,配置完毕参数成员了,执行复位和初始化:

  1. /* 使能DMA时钟 */
  2. DMAx_CLK_ENABLE();      

  3. /* SPI DMA发送配置 */               
  4. hdma_tx.Instance                 = SPIx_TX_DMA_STREAM;      /* 例化使用的DMA数据流 */
  5. hdma_tx.Init.Channel             = SPIx_TX_DMA_CHANNEL;     /* DMA通道配置 */
  6. hdma_tx.Init.FIFOMode            = DMA_FIFOMODE_DISABLE;    /* 禁止FIFO*/
  7. hdma_tx.Init.FIFOThreshold       = DMA_FIFO_THRESHOLD_FULL; /* 禁止FIFO此位不起作用,用于设置阀值 */
  8. hdma_tx.Init.MemBurst            = DMA_MBURST_SINGLE;            /* 禁止FIFO此位不起作用,用于存储器突发 */
  9. hdma_tx.Init.PeriphBurst         = DMA_PBURST_SINGLE;            /* 禁止FIFO此位不起作用,用于外设突发 */
  10. hdma_tx.Init.Direction           = DMA_MEMORY_TO_PERIPH;    /* 传输方向是从存储器到外设 */  
  11. hdma_tx.Init.PeriphInc           = DMA_PINC_DISABLE;        /* 外设地址自增禁止 */
  12. hdma_tx.Init.MemInc              = DMA_MINC_ENABLE;         /* 存储器地址自增使能 */  
  13. hdma_tx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;     /* 外设数据传输位宽选择字节,即8bit */
  14. hdma_tx.Init.MemDataAlignment    = DMA_MDATAALIGN_BYTE;     /* 存储器数据传输位宽选择字节,即8bit */   
  15. hdma_tx.Init.Mode                = DMA_NORMAL;              /* 正常模式 */
  16. hdma_tx.Init.Priority            = DMA_PRIORITY_LOW;        /* 优先级低 */

  17. /* 复位DMA */
  18. if(HAL_DMA_DeInit(&hdma_tx) != HAL_OK)
  19. {
  20.         Error_Handler(__FILE__, __LINE__);     
  21. }

  22. /* 初始化DMA */
  23. if(HAL_DMA_Init(&hdma_tx) != HAL_OK)
  24. {
  25.         Error_Handler(__FILE__, __LINE__);     
  26. }
复制代码



回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-8-14 05:22 , Processed in 0.035803 second(s), 24 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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