打印

关于STM32F407 FSMC采用DMA机制填充TFT

[复制链接]
871|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
小小的人呀|  楼主 | 2019-11-20 18:54 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
最近在做STM32F407驱动3.5寸TFT,采用FSMC总线驱动TFT,逐点填色正常但是刷屏速度较慢(显示TF卡中的图片)。
于是准备采用在103系列上调试成功的DMA传输机制进行填色,1是提速,2是将CPU解放出来执行其他任务。
由于407与103在固件和内部架构上有一定的差异,移植后对DMA配置进行了相应的调整,代码如下:

/*FSMC DMA设置项*/
#define FSMC_DMA                   DMA2
#define FSMC_DMA_CLK               RCC_AHB1Periph_DMA2

#define FSMC_DMA_STREAM            DMA2_Stream7
#define FSMC_DMA_CHANNEL           DMA_Channel_1
#define FSMC_DMA_FLAG_FEIF         DMA_FLAG_FEIF7
#define FSMC_DMA_FLAG_DMEIF        DMA_FLAG_DMEIF7
#define FSMC_DMA_FLAG_TEIF         DMA_FLAG_TEIF7
#define FSMC_DMA_FLAG_HTIF         DMA_FLAG_HTIF7
#define FSMC_DMA_FLAG_TCIF         DMA_FLAG_TCIF7
#define FSMC_DMA_IRQn              DMA2_Stream7_IRQn
#define FSMC_DMA_IRQHANDLER        DMA2_Stream7_IRQHandler

///************************************************************************************
//** 说明:FSMC采用DMA模式刷屏
//** 输入: 无
//** 输出: 无
//** 全局变量: FSMC_DMA_TCB
//** 调用模块: 无
//************************************************************************************/
static void LCD_FSMC_DMA(void)
{        
    DMA_InitTypeDef DMA_InitStructure;
        
    /* Enable the DMA2 Clock */
    RCC_AHB1PeriphClockCmd(FSMC_DMA_CLK, ENABLE);

    /* DMA2 Stream7 disable */
    DMA_Cmd(FSMC_DMA_STREAM, DISABLE);
    DMA_ClearFlag(FSMC_DMA_STREAM, FSMC_DMA_FLAG_FEIF | FSMC_DMA_FLAG_DMEIF | FSMC_DMA_FLAG_TEIF |
                  FSMC_DMA_FLAG_HTIF | FSMC_DMA_FLAG_TCIF);

    DMA_DeInit(FSMC_DMA_STREAM);

    DMA_InitStructure.DMA_Channel = FSMC_DMA_CHANNEL;                           //数据流
    DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)Bank1_LCD_D;           //外设地址  FSMC总线写地址
    DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)0;                        //DMA访问的数据地址 启用DMA时赋值
    DMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToPeripheral;                     //外设作为数据传输的目的地
    DMA_InitStructure.DMA_BufferSize = (uint32_t)0xFFFE;                        //传输数据量大小 启用DMA时赋值
    DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;            //外设地址不增加
    DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;                     //内存地址自增1
    DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord; //外设数据宽度为16bit
    DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;         //DMA从内存中搬运数据宽度为byte
    DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;                               //只传送一次
    DMA_InitStructure.DMA_Priority = DMA_Priority_VeryHigh;                     //(DMA传送优先级为高)
    DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;                      //指定使用FIFO模式还是直接模式
    DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_Full;               //指定了FIFO阈值
    DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;                 //内存突发传输每次转移一个数据
    DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;         //外设突发传输每次转移一个数据

    DMA_Init(FSMC_DMA_STREAM, &DMA_InitStructure);
}

/************************************************************************************
** 说明: LCD刷屏DMA配置  将像素数组中的RGB颜色填充到FSMC总线上
** 输入: uint16_t *buff  像素数组指针
         uint16_t num    填充点数
** 输出: 无
** 全局变量: 无
** 调用模块: 无;
************************************************************************************/
void LCD_FSMC_DMA_BMP(uint16_t *buff,uint16_t num)
{        
    DMA_InitTypeDef DMA_InitStructure;

    DMA_ClearFlag(FSMC_DMA_STREAM, FSMC_DMA_FLAG_FEIF | FSMC_DMA_FLAG_DMEIF | FSMC_DMA_FLAG_TEIF |
                  FSMC_DMA_FLAG_HTIF | FSMC_DMA_FLAG_TCIF);//清标志           

    DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t) buff;/配置缓冲区地址和大小
    DMA_InitStructure.DMA_BufferSize = (uint32_t) num;            
    DMA_Init(FSMC_DMA_STREAM, &DMA_InitStructure);

    DMA_Cmd(FSMC_DMA_STREAM, ENABLE);
}


问题:实际测试发现,TFT上未有预期显示,DMA启动后未能进入任何对应中断(TC或TE),感觉DMA没有成功启动或者设置上有错误。希望调试成功的大侠能给予指正?

使用特权

评论回复

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

399

主题

399

帖子

0

粉丝