本帖最后由 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 Input Buffer
JPEG
在我运行时,程序运行如下:HAL_JPEG_Encode_DMA函数中,进入JPEG_DMA_StartProcess
MDMA_SetConfig
HAL_JPEG_Encode_DMA
JPEG_DMA_StartProcess 中 进入了 HAL_MDMA_Start_IT
JPEG_DMA_StartProcess
如图可以看出这个函数只设置了XferCpltCallback,这也就导致在HAL_MDMA_Start_IT中
HAL_MDMA_Start_IT
仅使能了如框图所示的MDMA中断
但是当我运行时,MDMA不会进入中断函数,暂停程序发现寄存器:
MDMA 0通道寄存器
寄存器显示MDMA使能了TCIF0位,这是BUFFER_TRANSFER的中断请求位,但是这个中断并没有被使能。而被使能的中断没有被请求。
并且发现BNDT也没有持续运行到等于0.
|