Чтобы перенести Img_Data[128*128*2] в середину Img_Buff[720*576*2] с помощью передачи MDMA в процессоре BF609

Используя приведенный ниже код, я смог передать данные в середину буфера, но только в состоянии liner(1D).

memcpy_all(Img_Data, 128, 128, 16, 16, Img_Buff+323152, 128, 128, 16, 16);

Мне нужно передать данные в 2D, чтобы наложить данные изображения на середину буфера изображения.

Функция, которая использовалась для передачи DMA, приведена ниже.

      void memcpy_all(int8u * pSource, int16u nSrcXCnt, int16u nSrcYCnt, int16u bySrcXMod,int16u bySrcYMod, int8u * pDestination, int16u nDstXCnt,
                         int16u nDstYCnt, int16u byDstXMod, int16u byDstYMod)
{

    *pREG_DMA21_ADDRSTART = pSource;
    *pREG_DMA21_XCNT = nSrcXCnt;
    *pREG_DMA21_YCNT = nSrcYCnt;
    *pREG_DMA21_XMOD = bySrcXMod;
    *pREG_DMA21_YMOD = bySrcYMod;
    ssync();
    *pREG_DMA21_CFG = ENUM_DMA_CFG_ADDR2D | ENUM_DMA_CFG_STOP | ENUM_DMA_CFG_MSIZE16 | ENUM_DMA_CFG_PSIZE04 |  ENUM_DMA_CFG_SYNC | ENUM_DMA_CFG_READ ;


    *pREG_DMA22_ADDRSTART = pDestination;
    *pREG_DMA22_XCNT = nDstXCnt;
    *pREG_DMA22_YCNT = nDstYCnt;
    *pREG_DMA22_XMOD = byDstXMod;
    *pREG_DMA22_YMOD = byDstYMod;
    ssync();
    *pREG_DMA22_CFG = ENUM_DMA_CFG_ADDR2D | ENUM_DMA_CFG_STOP | ENUM_DMA_CFG_MSIZE16 | ENUM_DMA_CFG_PSIZE04 |  ENUM_DMA_CFG_SYNC | ENUM_DMA_CFG_WRITE;



    *pREG_DMA21_CFG |= ENUM_DMA_CFG_EN;
    ssync();
    *pREG_DMA22_CFG |= ENUM_DMA_CFG_EN;[[enter image description here](https://i.stack.imgur.com/F7z3H.jpg)](https://i.stack.imgur.com/GCcrb.jpg)
    ssync();

    while((*pREG_DMA22_STAT & BITM_DMA_STAT_RUN) >> BITP_DMA_STAT_RUN);
    Delay(0xFF);
    *pREG_DMA21_CFG &= ~ENUM_DMA_CFG_EN;
    ssync();
    *pREG_DMA22_CFG &= ~ENUM_DMA_CFG_EN;
    ssync();

Пожалуйста, помогите мне наложить данные изображения [1281282] в середину буфера изображения [7205762] с помощью процессора BF609.

0 ответов

Другие вопросы по тегам