大学生
最后登录1970-1-1
在线时间 小时
注册时间2014-11-7
|
最近在做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没有成功启动或者设置上有错误。希望调试成功的大侠能给予指正?
|
|