硬汉嵌入式论坛

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

[DMA] [H750]DMA FMC刷屏失败

[复制链接]

1

主题

3

回帖

6

积分

新手上路

积分
6
发表于 2023-6-28 23:22:58 | 显示全部楼层 |阅读模式

硬汉哥,看你们的例程有FMC DMA读,可是我写的FMC DMA刷屏写没有反应,有大神帮忙看看嘛


//LCD地址结构体
typedef struct
{
        vu16 LCD_REG;
        vu16 LCD_RAM;
} LCD_TypeDef;

//使用NOR/SRAM的 Bank1.sector4,地址位HADDR[27,26]=11 A18作为数据命令区分线
//注意设置时STM32内部会右移一位对其!                             
#define LCD_BASE        ((uint32_t)(0x60000000 | 0x000FFFFE))//((uint32_t)(0x60000000 | 0x0007FFFE))
#define LCD             ((LCD_TypeDef *) LCD_BASE)



__HAL_RCC_DMA1_CLK_ENABLE();

    DMA_Handle.Instance = DMA1_Stream1;                            /* 例化使用的DMA数据流 */
    DMA_Handle.Init.Request = DMA_REQUEST_MEM2MEM;              /* 请求类型 */
   DMA_Handle.Init.Direction = DMA_MEMORY_TO_PERIPH;              /* 传输方向是从存储器到外设 */
    DMA_Handle.Init.PeriphInc = DMA_PINC_DISABLE;                  /* 外设地址自增禁止 */
    DMA_Handle.Init.MemInc = DMA_MINC_ENABLE;                      /* 存储器地址自增使能 */
    DMA_Handle.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD; /* 外设数据传输位宽选择半字,即16bit */
    DMA_Handle.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD;    /* 存储器数据传输位宽选择半字,即16bit */
    DMA_Handle.Init.Mode = DMA_NORMAL;                             /* 单次模式 */
    DMA_Handle.Init.Priority = DMA_PRIORITY_VERY_HIGH;             /* 优先级高 */
    DMA_Handle.Init.FIFOMode = DMA_FIFOMODE_DISABLE;               /* 关闭FIFO*/
    DMA_Handle.Init.FIFOThreshold = DMA_FIFO_THRESHOLD_FULL;       /* 用于设置阀值 */
    DMA_Handle.Init.MemBurst = DMA_MBURST_SINGLE;                    /* 用于存储器突发 */
    DMA_Handle.Init.PeriphBurst = DMA_PBURST_SINGLE;                 /* 用于外设突发 */
    HAL_DMA_Init(&DMA_Handle);

    HAL_NVIC_SetPriority(DMA1_Stream1_IRQn, 0, 0);
    HAL_NVIC_EnableIRQ(DMA1_Stream1_IRQn);

    /* 注册传输完成中断*/
        HAL_DMA_RegisterCallback(&DMA_Handle, HAL_DMA_XFER_CPLT_CB_ID, LCD_DmaCplCb);




HAL_DMA_Start_IT(&DMA_Handle, (uint32_t)ui_display, (uint32_t)LCD->LCD_RAM, 76800);

将显存的ui_display写入LCD->LCD_RAM地址  原来的是LCD->LCD_RAM = ui_display[index];可以,现在换DMA不行

换MBMA也是不行
    // MDMA
        __HAL_RCC_MDMA_CLK_ENABLE();

        MDMA_Handle.Instance = MDMA_Channel0;


                MDMA_Handle.Init.Request              = MDMA_REQUEST_SW;         /* 软件触发 */
                MDMA_Handle.Init.TransferTriggerMode  = MDMA_FULL_TRANSFER;     /* 块传输 */
                MDMA_Handle.Init.Priority             = MDMA_PRIORITY_HIGH;      /* 优先级高*/
                MDMA_Handle.Init.Endianness           = MDMA_LITTLE_ENDIANNESS_PRESERVE; /* 小端 */
                MDMA_Handle.Init.SourceInc            = MDMA_SRC_INC_DOUBLEWORD;         /* 源地址自增,双字,即8字节 */
                MDMA_Handle.Init.DestinationInc       = MDMA_DEST_INC_DISABLE;        /* 目的地址自增,双字,即8字节 */
                MDMA_Handle.Init.SourceDataSize       = MDMA_SRC_DATASIZE_DOUBLEWORD;    /* 源地址数据宽度双字,即8字节 */
                MDMA_Handle.Init.DestDataSize         = MDMA_DEST_DATASIZE_DOUBLEWORD;   /* 目的地址数据宽度双字,即8字节 */
                MDMA_Handle.Init.DataAlignment        = MDMA_DATAALIGN_PACKENABLE;       /* 小端,右对齐 */                    
                MDMA_Handle.Init.SourceBurst          = MDMA_SOURCE_BURST_16BEATS;      /* 源数据突发传输,SourceBurst*SourceDataSize <  BufferTransferLength*/
                MDMA_Handle.Init.DestBurst            = MDMA_DEST_BURST_16BEATS;        /* 目的数据突发传输,DestBurst*DestDataSize < BufferTransferLength */
               
        MDMA_Handle.Init.BufferTransferLength = 128; /* 每次传输128个字节 */
               

        MDMA_Handle.Init.SourceBlockAddressOffset = 0; /* 用于block传输,地址偏移0 */
        MDMA_Handle.Init.DestBlockAddressOffset = 0;   /* 用于block传输,地址偏移0 */

        // MDMA_Handle.XferBufferCpltCallback=1;//中断回调函数

        /* 初始化MDMA */
        if (HAL_MDMA_Init(&MDMA_Handle) != HAL_OK)
        {
    //        Error_Handler(__FILE__, __LINE__);
        }

       HAL_MDMA_Start_IT(&MDMA_Handle,
                         (uint32_t)ui_display,
                         (uint32_t)LCD->LCD_RAM,
                        76800,
                         1);


回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
发表于 2023-6-29 08:48:59 | 显示全部楼层
1、处理Cache没
2、FMC的MPU设置没有
4、LCD显示屏设置地址自增没,或者说开启窗口模式没
回复

使用道具 举报

1

主题

3

回帖

6

积分

新手上路

积分
6
 楼主| 发表于 2023-6-29 19:57:45 | 显示全部楼层
eric2013 发表于 2023-6-29 08:48
1、处理Cache没
2、FMC的MPU设置没有
4、LCD显示屏设置地址自增没,或者说开启窗口模式没

cache,MPU都有的
刷屏函数没变
void LCD_Clear_ram()
{
    u32 index = 0;
    u32 totalpoint = lcddev.width;
    totalpoint *= lcddev.height; // 得到总点数
    LCD_SetCursor(0x00, 0x0000); // 设置光标位置
    LCD_WriteRAM_Prepare();      // 开始写入GRAM

    //     for (index = 0; index < totalpoint; index++)
    //     {
    //         LCD->LCD_RAM = ui_display[index];
    //     }

    // HAL_DMA_Start(&DMA_Handle, (uint32_t)LCD->LCD_RAM, (uint32_t)ui_display, 76800);
    // HAL_DMA_Start_IT(&DMA_Handle, (uint32_t)LCD->LCD_RAM, (uint32_t)ui_display, 76800);

//    HAL_DMA_Start_IT(&DMA_Handle, (uint32_t)ui_display, (uint32_t)LCD->LCD_RAM, 76800);

//        HAL_DMA_Start_IT(&DMA_Handle, (uint32_t)ui_display, (uint32_t)LCD->LCD_RAM, 76800);

         HAL_MDMA_Start_IT(&MDMA_Handle,
                         (uint32_t)ui_display,
                         (uint32_t)LCD->LCD_RAM,
                        76800,
                         1);     /* 将地址0x24000000开始的64KB数据复制到地址0x24000000 + 64*1024 */


}
回复

使用道具 举报

1

主题

3

回帖

6

积分

新手上路

积分
6
 楼主| 发表于 2023-6-29 19:58:15 | 显示全部楼层
eric2013 发表于 2023-6-29 08:48
1、处理Cache没
2、FMC的MPU设置没有
4、LCD显示屏设置地址自增没,或者说开启窗口模式没

直接写是能正常刷屏的
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
发表于 2023-6-30 09:46:29 | 显示全部楼层
逍遥天尊 发表于 2023-6-29 19:58
直接写是能正常刷屏的

直接写正常,说明确实是MPU/Cache配置问题或者DMA问题
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-28 00:59 , Processed in 0.163537 second(s), 26 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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