硬汉嵌入式论坛

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

[HAL学习笔记] HAL库的MDMA源文件stm32h7xx_hal_mdma.c学习笔记(2019-07-06 V1.0)

[复制链接]

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106771
QQ
发表于 2019-7-6 10:48:17 | 显示全部楼层 |阅读模式
1、函数HAL_MDMA_Init配置MDMA的基本参数

2、如果使用列表模式,用户可以使用函数HAL_MDMA_LinkedList_CreateNode创建节点,再通过函数HAL_MDMA_LinkedList_AddNode将节点添加到列表里面
(1)使用列表模式的话,函数HAL_MDMA_Init创建的是节点0
(2)使用函数HAL_MDMA_LinkedList_EnableCircularMode使能循环模式,注意是从节点1开始循环的,将节点1和末尾的节点相连,不包含HAL_MDMA_Init创建的节点0。
(3)对于节点0,仅在初始化MDMA传输时使用一次。
(4)如果要禁止循环模式,可以调用函数HAL_MDMA_LinkedList_DisableCircularMode
(5)通过函数HAL_MDMA_LinkedList_RemoveNode还可以删除指定节点。

3、各种传输模式区别:
MDMA_BUFFER_TRANSFER :
每个请求都会触发BufferTransferLength大小的数据传输,此大小由HAL_MDMA_Init调用的参数配置。

MDMA_BLOCK_TRANSFER :
每次请求,触发一次块传输,块大小由 HAL_MDMA_Start/HAL_MDMA_Start_IT定义,或者列表模式里面的参数。

MDMA_REPEAT_BLOCK_TRANSFER :
每次请求,触发多次的块传输,块大小和块数由 HAL_MDMA_Start/HAL_MDMA_Start_IT定义,或者列表模式里面的参数

MDMA_FULL_TRANSFER :
每次请求,将触发所有块和节点的传输(如果用户调用了函数HAL_MDMA_LinkedList_CreateNode \ HAL_MDMA_LinkedList_AddNode)

4、查询模式
(1)HAL_MDMA_Start 启动传输
(2)HAL_MDMA_PollForTransfer 查询传输完成
(3)HAL_MDMA_Abort 终止传输

5、中断模式
(1)函数HAL_NVIC_SetPriority设置MDMA中断优先级
(2)函数HAL_NVIC_EnableIRQ使能中断
(3)函数HAL_MDMA_Start_IT启动中断传输
(4)MDMA的中断服务程序MDMA_IRQHandler里面调用HAL_MDMA_IRQHandler,如果用户注册了各种回调函数,会在此函数里面执行。
(5)函数HAL_MDMA_Abort_IT可以终止MDMA中断传输,终止完成后,会调用回调函数XferAbortCallback(如果设置了的话)

6、函数HAL_MDMA_RegisterCallback注册回调函数,函数HAL_MDMA_UnRegisterCallback取消注册回调函数
(1)XferCpltCallback              : 传输完成回调
(2)XferBufferCpltCallback      : buffer传输完成回调
(3)XferBlockCpltCallback       : block 传输完成回调
(4)XferRepeatBlockCpltCallback : repeated block传输完成
(5)XferErrorCallback            : 传输错误回调
(6)XferAbortCallback            : 传输终止回调

7、MDMA配置为MDMA_REQUEST_SW软件触发时,可以通过函数HAL_MDMA_GenerateSWRequest产生触发请求,使用此函数要注意以下两个问题(1)如果传输结束或者传输还没有启动,调用此函数会返回error
(2)如果传输还在进行中断,调用此函数会返回error,这次请求会被忽略。

应用示例1:
(1)MDMA配置为MDMA_BUFFER_TRANSFER模式,软件触发
(2)注册回调函数HAL_MDMA_XFER_BUFFERCPLT_CB_ID
(3)调用函数HAL_MDMA_Start_IT会触发一次BufferTransferLength长度的数据传输
(4)传输结束会进入回调函数,用户可以再回调函数里面再次调用HAL_MDMA_GenerateSWRequest再次启动传输。

应用示例2:
(1)MDMA配置为MDMA_BLOCK_TRANSFER模式,软件触发
(2)注册回调函数HAL_MDMA_XFER_BLOCKCPLT_CB_ID
(3)调用函数HAL_MDMA_Start_IT会触发一次块传输
(4)传输结束会进入回调函数,用户可以再回调函数里面再次调用HAL_MDMA_GenerateSWRequest再次启动传输。

9、其它的宏定义函数

  1.       (+) __HAL_MDMA_ENABLE: Enable the specified MDMA Stream.
  2.       (+) __HAL_MDMA_DISABLE: Disable the specified MDMA Stream.
  3.       (+) __HAL_MDMA_GET_FLAG: Get the MDMA Stream pending flags.
  4.       (+) __HAL_MDMA_CLEAR_FLAG: Clear the MDMA Stream pending flags.
  5.       (+) __HAL_MDMA_ENABLE_IT: Enable the specified MDMA Stream interrupts.
  6.       (+) __HAL_MDMA_DISABLE_IT: Disable the specified MDMA Stream interrupts.
  7.       (+) __HAL_MDMA_GET_IT_SOURCE: Check whether the specified MDMA Stream interrupt has occurred or not.
复制代码





回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106771
QQ
 楼主| 发表于 2019-7-6 11:31:00 | 显示全部楼层
整理完毕。
回复

使用道具 举报

13

主题

156

回帖

215

积分

高级会员

积分
215
发表于 2019-7-6 15:56:16 | 显示全部楼层
本帖最后由 本五心 于 2019-7-6 16:00 编辑

请教下,在做AVI视频播放时,使用的是buffer传输模式,其中一个视频时解码几帧后出现通道传输错(MDMA_CxISR寄存器 TEIF置位,MDMA_CxESR寄存器的BSE和 TED都置位了),解码其他视频都正常,就这一个会出现这种情况,一直没找到原因,当前我是出现这种情况后,跳帧处理了,也能正常播放。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106771
QQ
 楼主| 发表于 2019-7-6 18:04:09 | 显示全部楼层
本五心 发表于 2019-7-6 15:56
请教下,在做AVI视频播放时,使用的是buffer传输模式,其中一个视频时解码几帧后出现通道传输错(MDMA_Cx ...

有可能是硬件JPEG的问题,它不支持渐进式JPEG.

别的问题不太清楚了。
回复

使用道具 举报

2

主题

6

回帖

12

积分

新手上路

积分
12
发表于 2021-10-25 11:21:41 | 显示全部楼层
本五心 发表于 2019-7-6 15:56
请教下,在做AVI视频播放时,使用的是buffer传输模式,其中一个视频时解码几帧后出现通道传输错(MDMA_Cx ...

大佬,这个问题我也遇到了,您解决了吗
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-5 16:42 , Processed in 0.232666 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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