硬汉嵌入式论坛

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

[技术分享] 优化H7-TOOL的SPI DMA显示屏驱动,开启SPI硬件FIFO和DMA突发功能

[复制链接]

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115988
QQ
发表于 2021-1-7 10:57:36 | 显示全部楼层 |阅读模式

DMA,将源数据位宽和目的数据位宽都设置为32bit,然后源数据做4次突发。
并且打开DMA FIFO
  1. hdma_tx.Instance                 = DMA2_Stream3;
  2. hdma_tx.Init.FIFOMode            = DMA_FIFOMODE_ENABLE;
  3. hdma_tx.Init.FIFOThreshold       = DMA_FIFO_THRESHOLD_FULL;
  4. hdma_tx.Init.MemBurst            = DMA_MBURST_INC4;
  5. hdma_tx.Init.PeriphBurst         = DMA_PBURST_SINGLE;
  6. hdma_tx.Init.Request             = DMA_REQUEST_SPI5_TX;
  7. hdma_tx.Init.Direction           = DMA_MEMORY_TO_PERIPH;
  8. hdma_tx.Init.PeriphInc           = DMA_PINC_DISABLE;
  9. hdma_tx.Init.MemInc              = DMA_MINC_ENABLE;
  10. hdma_tx.Init.PeriphDataAlignment = DMA_PDATAALIGN_WORD;
  11. hdma_tx.Init.MemDataAlignment    = DMA_MDATAALIGN_WORD;
复制代码


SPI开硬件FIFO:

  1. hspi5.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_2;
  2. hspi5.Init.Direction = SPI_DIRECTION_2LINES;
  3. hspi5.Init.CLKPhase = SPI_PHASE_1EDGE;
  4. hspi5.Init.CLKPolarity = SPI_POLARITY_HIGH;
  5. hspi5.Init.DataSize = SPI_DATASIZE_16BIT;
  6. hspi5.Init.FirstBit = SPI_FIRSTBIT_MSB;
  7. hspi5.Init.TIMode = SPI_TIMODE_DISABLE;
  8. hspi5.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
  9. hspi5.Init.CRCPolynomial = 7;
  10. hspi5.Init.CRCLength = SPI_CRC_LENGTH_8BIT;
  11. hspi5.Init.NSS = SPI_NSS_SOFT;
  12. hspi5.Init.NSSPMode = SPI_NSS_PULSE_DISABLE;
  13. hspi5.Init.MasterKeepIOState = SPI_MASTER_KEEP_IO_STATE_ENABLE;
  14. hspi5.Init.Mode = SPI_MODE_MASTER;
  15. hspi5.Init.IOSwap = SPI_IO_SWAP_ENABLE;
  16. hspi5.Init.FifoThreshold = SPI_FIFO_THRESHOLD_04DATA;
复制代码


搞了个这个有啥用呢,可以降低SPI DMA带宽需求,运行更宽松。
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115988
QQ
 楼主| 发表于 2021-1-7 11:05:33 | 显示全部楼层
关于STM32H7的硬件FIFO配置和DMA的突发配置,是比较考究的,详情看此贴:

STM32H7的SPI DMA配置时,SPI硬件FIFO,DMA突发设置等几个重要注意事项
http://www.armbbs.cn/forum.php?m ... 2944&fromuid=58
(出处: 硬汉嵌入式论坛)
回复

使用道具 举报

4

主题

141

回帖

153

积分

初级会员

积分
153
QQ
发表于 2021-1-7 11:28:53 | 显示全部楼层
硬汉哥,fifo的作用和意思理解,一直对突发不是很理解,能通俗的讲下突发是干嘛的吗?
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115988
QQ
 楼主| 发表于 2021-1-7 13:05:39 | 显示全部楼层
qgyhd1234 发表于 2021-1-7 11:28
硬汉哥,fifo的作用和意思理解,一直对突发不是很理解,能通俗的讲下突发是干嘛的吗?

此贴里面给一个坛友的回复,你看看

注意STM32H7的DMA在不同位宽和FIFO配置的情况下,支持的突发次数
http://www.armbbs.cn/forum.php?m ... 4314&fromuid=58
(出处: 硬汉嵌入式论坛)
回复

使用道具 举报

36

主题

2050

回帖

2158

积分

至尊会员

积分
2158
发表于 2021-1-7 14:52:29 | 显示全部楼层
借鉴下
Ever tried. Ever failed. No matter. Try Again. Fail again. Fail better.
回复

使用道具 举报

4

主题

141

回帖

153

积分

初级会员

积分
153
QQ
发表于 2021-1-11 09:51:33 | 显示全部楼层
eric2013 发表于 2021-1-7 13:05
此贴里面给一个坛友的回复,你看看

注意STM32H7的DMA在不同位宽和FIFO配置的情况下,支持的突发次数

明白了,普通dma传输是传输一次,请求一次总线,突发是申请一次总线,传输多个数据
回复

使用道具 举报

39

主题

1507

回帖

1629

积分

至尊会员

积分
1629
发表于 2025-2-19 01:10:50 | 显示全部楼层
本帖最后由 sanit 于 2025-2-19 01:12 编辑

hdma_tx.Init.PeriphBurst         = DMA_PBURST_INC4

hspi5.Init.FifoThreshold = SPI_FIFO_THRESHOLD_16DATA;


这样改才算是满血性能吧
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115988
QQ
 楼主| 发表于 2025-2-19 05:02:50 | 显示全部楼层
sanit 发表于 2025-2-19 01:10
hdma_tx.Init.PeriphBurst         = DMA_PBURST_INC4

hspi5.Init.FifoThreshold = SPI_FIFO_THRESHOLD_ ...

hdma_tx.Init.PeriphBurst         = DMA_PBURST_INC4

没记错的话,SPI的数据寄存器到LCD,之前测试没法突发传输,工作异常,100M时钟下,你试试
回复

使用道具 举报

39

主题

1507

回帖

1629

积分

至尊会员

积分
1629
发表于 2025-2-19 13:32:42 | 显示全部楼层
eric2013 发表于 2025-2-19 05:02
hdma_tx.Init.PeriphBurst         = DMA_PBURST_INC4

没记错的话,SPI的数据寄存器到LCD,之前测试没 ...

实测没问题。从理论去分析,也是没问题的。这个跟时钟快慢应该没直接关系的老大。 1739943084370.jpg
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115988
QQ
 楼主| 发表于 2025-2-19 13:36:35 | 显示全部楼层
sanit 发表于 2025-2-19 13:32
实测没问题。从理论去分析,也是没问题的。这个跟时钟快慢应该没直接关系的老大。

所有代码配置贴出来,我试试,之前测试失败。

你这个应该不是hspi5.Init.DataSize = SPI_DATASIZE_32BIT吧


回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115988
QQ
 楼主| 发表于 2025-2-19 14:26:16 | 显示全部楼层
sanit 发表于 2025-2-19 13:32
实测没问题。从理论去分析,也是没问题的。这个跟时钟快慢应该没直接关系的老大。


确认了,确定不可以的,你这个应该不是用的SPI5,SPI5只有8个FIFO

配置SPI为32bit数据通信后,最大只能INC突发两次,两次突发是没有这个选项的,只能单次。
========================
而楼主位的代码时都可以配置INC4,因为配置的是的16bit数据带宽。使用SPI5,必须配置
hspi5.Init.FifoThreshold = SPI_FIFO_THRESHOLD_08DATA;
回复

使用道具 举报

39

主题

1507

回帖

1629

积分

至尊会员

积分
1629
发表于 2025-2-19 16:49:24 | 显示全部楼层
eric2013 发表于 2025-2-19 14:26
确认了,确定不可以的,你这个应该不是用的SPI5,SPI5只有8个FIFO

配置SPI为32bit数据通信后,最大 ...

我用的SPI2,那可能就是这个原因了
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-1 14:26 , Processed in 0.697330 second(s), 27 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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