硬汉嵌入式论坛

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

[DMA] [MDMA] MDMA使用的问题

[复制链接]

2

主题

6

回帖

12

积分

新手上路

积分
12
发表于 2024-12-1 06:13:23 | 显示全部楼层 |阅读模式
本帖最后由 dreamland 于 2024-12-1 06:24 编辑

本人第一次使用MDMA遇到了一些理解上的问题:
    hmdma_jpeg_infifo_th.Init.Request = MDMA_REQUEST_JPEG_INFIFO_TH;
    hmdma_jpeg_infifo_th.Init.Priority = MDMA_PRIORITY_LOW;
    hmdma_jpeg_infifo_th.Init.SourceInc = MDMA_SRC_INC_BYTE;
    hmdma_jpeg_infifo_th.Init.SourceDataSize = MDMA_SRC_DATASIZE_BYTE;
    hmdma_jpeg_infifo_th.Init.DataAlignment = MDMA_DATAALIGN_PACKENABLE;
    hmdma_jpeg_infifo_th.Init.SourceBurst = MDMA_SOURCE_BURST_32BEATS;
    hmdma_jpeg_infifo_th.Init.SourceBlockAddressOffset = 0;
这是一段设置MDMA的代码,我不太清楚SourceDataSize SourceBurst BufferTransferLength 和DestBurst DestDataSize 的关系。
另外我查阅手册发现MDMA的FIFO最大时128字节,但是我设置SourceInc = MDMA_SRC_INC_DWORD SourceBurst = MDMA_SOURCE_BURST_32BEATS的话已经超过128字节,MDMA是否会出问题呢?

接下来是我使用MDMA + JPEG遇到的问题,这是我的MDMA和JPEG配置:

MDMA Output Buffer

MDMA Output Buffer

MDMA Input Buffer

MDMA Input Buffer

JPEG

JPEG
在我运行时,程序运行如下:HAL_JPEG_Encode_DMA函数中,进入JPEG_DMA_StartProcess

MDMA_SetConfig

MDMA_SetConfig

HAL_JPEG_Encode_DMA

HAL_JPEG_Encode_DMA
JPEG_DMA_StartProcess 中 进入了 HAL_MDMA_Start_IT

JPEG_DMA_StartProcess

JPEG_DMA_StartProcess

如图可以看出这个函数只设置了XferCpltCallback,这也就导致在HAL_MDMA_Start_IT中

HAL_MDMA_Start_IT

HAL_MDMA_Start_IT

仅使能了如框图所示的MDMA中断
但是当我运行时,MDMA不会进入中断函数,暂停程序发现寄存器:

MDMA 0通道寄存器

MDMA 0通道寄存器

寄存器显示MDMA使能了TCIF0位,这是BUFFER_TRANSFER的中断请求位,但是这个中断并没有被使能。而被使能的中断没有被请求。
并且发现BNDT也没有持续运行到等于0.

回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117546
QQ
发表于 2024-12-1 09:34:57 | 显示全部楼层
突发的限制是比BufferTransferLength小

  uint32_t SourceBurst;              /*!< Specifies the Burst transfer configuration for the source memory transfers.
                                         It specifies the amount of data to be transferred in a single non interruptible
                                         transaction.
                                         This parameter can be a value of @ref MDMA_Source_burst
                                         @note : the burst may be FIXED/INCR based on SourceInc value ,
                                        the BURST must be programmed as to ensure that the burst size will be lower than than
                                         BufferTransferLength
*/

  uint32_t DestBurst;                 /*!< Specifies the Burst transfer configuration for the destination memory transfers.
                                           It specifies the amount of data to be transferred in a single non interruptible
                                           transaction.
                                           This parameter can be a value of @ref MDMA_Destination_burst
                                           @note : the burst may be FIXED/INCR based on DestinationInc value ,
                                           the BURST must be programmed as to ensure that the burst size will be lower than than
                                           BufferTransferLength
*/
回复

使用道具 举报

2

主题

6

回帖

12

积分

新手上路

积分
12
 楼主| 发表于 2024-12-1 18:00:44 | 显示全部楼层
eric2013 发表于 2024-12-1 09:34
突发的限制是比BufferTransferLength小

  uint32_t SourceBurst;              /*!< Specifies the Burs ...

是的,我刚才把32burst的数据宽度从WORD改为了byte,成功进入了中断。
我是否可以理解为必须保证BURST的长度 * 数据字节宽 <= BufferTransferLength 才可以?
比如说burst长度为32,字节宽为2(半字),BufferTransferLength 至少需要为64才可以

但是我在armfly上面的例程是这样的:
hmdmaIn.Init.DestDataSize = MDMA_DEST_DATASIZE_WORD; /* 目的地址数据宽度字节 */
hmdmaIn.Init.SourceBurst = MDMA_SOURCE_BURST_32BEATS; /* 源数据突发传输,32 次 */
hmdmaIn.Init.BufferTransferLength = 32; /* 每次传输 32 个字节,JPEG 的 FIFO 阀值是 32 字节 */
...
hmdmaOut.Init.SourceDataSize = MDMA_SRC_DATASIZE_WORD; /* 源地址数据宽度字 */
hmdmaOut.Init.SourceBurst = MDMA_SOURCE_BURST_32BEATS; /* 源数据突发传输,32 次 */
hmdmaOut.Init.BufferTransferLength = 32; /* 每次传输 32 个字节,JPEG 的 FIFO 阀值是 32 字节 */
这两个违反了我上面得到的结论,是例程有错误还是我的理解有错误呢?
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117546
QQ
发表于 2024-12-2 00:03:20 | 显示全部楼层
dreamland 发表于 2024-12-1 18:00
是的,我刚才把32burst的数据宽度从WORD改为了byte,成功进入了中断。
我是否可以理解为必须保证BURST的 ...

例子没问题。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-8-14 03:35 , Processed in 0.045201 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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