- 打卡等级:以坛为家II
- 打卡总天数:493
- 最近打卡:2025-05-01 08:31:58
荣誉版主
- 积分
- 3476
|
发表于 2024-10-31 22:15:04
|
显示全部楼层
本学习实验课题的移植到AI8051U实验箱来运行,
经过了三个步骤,在此前的基础上又增加了DMA手段。
从视频中可见, 程序稍有小改动,增加了32*32小图标的显示, 是实验用DMA方式显示BMP图片的方法.
由于本课题除了清屏和图标显示以外,没有大量数据传输的需求,因此DMA手段仅仅用在这两个函数上。
稍稍添加注释解析,以供初学、同学者参考理解。
//清屏函数
void LCD_CLS(u8 Color)
{ u16 i,j;
LCD_SetWindow(0,0,LCD_W-1,LCD_H-1);
#if (USE_DMA==1) //若使用DMA方式
j=0;
for(i=0;i<=DMA_AMT_LEN;i++)LCD_Buf= COLOR[Color]; //先向缓存区填颜色字
DMA_TxCount = 75; //确定发送次数: 总字节数/缓存区大小=循环次数 (320*240*2) /2048=75
LCD_CS=0; //显示屏片选中,让DMA向显示屏发送数据...
DMAFlag=0; //设DMA完成标志初为0
DMA_LCM_CR = 0xA0; //(Write dat 写数据) 使能LCM_DMA / 启动发送数据模式操作 / 引发中断
while(!DMAFlag); //等待中断操作完成...
LCD_CS=1; //片选中,让DMA向显示屏发送数据...
#else
for(i=0;i<LCD_W;i++) //不使用DMA方式的原写数据循环方式
{ for (j=0;j<LCD_H;j++)
{ LCD_WR_DATA(COLOR[Color]); }
}
#endif
}
//使用DMA方式的BMP图标显示函数
#if (USE_DMA==1)
/*****************************************************************************
* 函数:void LCD_BMP_DMA(u16 X, u16 Y,u16 W,u16 H,u8 Color) //显示图片
* 参数: X起点 Y起点 W宽度 H高度 Color: 色号
* 注意:因目前缓存区LCD_Buf[]为2048字节,故仅仅支持32*32图标DMA模式显示
* 若缓存区扩为4608字节,可显示48*48图标
* 若缓存区扩为8192字节,可显示64*64图标 (算法暂留,有待完善)
******************************************************************************/
void LCD_BMP_DMA(u16 X,u16 Y,u8 W,u8 H,u8* pic)
{ u16 i,Col; u8 h,l;
LCD_SetWindow(X,Y,X+W-1,Y+H-1); //设置显示窗口
for(i=0;i<W*H; i++)
{ l=pic[2*i]; h=pic[2*i+1]; //BMP图像数据:低位在前/高位在后
Col=256*h+l; //转换为: 高位在前/低位在后
LCD_Buf = Col; //先送入缓存区
}
//DMA_TxCount=W*H*2/(DMA_AMT_LEN+1); //计算发送次数:总字节数/缓存区大小=循环次数.图标(32*32*2)/2048=1
DMA_TxCount=1; //计算发送次数:总字节数/缓存区大小=循环次数. 图标(32*32*2)/2048=1
LCD_CS=0; //显示屏片选中,让DMA向显示屏发送数据...
DMAFlag=0; //设DMA完成标志初为0
DMA_LCM_CR = 0xA0; //(Write dat 写数据) 使能LCM_DMA / 启动发送数据模式操作 / 引发中断
while(!DMAFlag); //等待中断操作完成...
LCD_CS=1; //片选中,让DMA向显示屏发送数据...
LCD_SetWindow(0,0,LCD_W,LCD_H); //恢复全屏显示区域
}
#endif
这两函数的区别在于:
清屏函数在一次性初始化发送缓存区数据后, 启动DMA发送要循环75次才完成全屏一色. 每次循环不必重载缓存区数据, 所以期间不需要MCU参与.
而显示BMP函数, 如果图像数据量大于缓存的话, 即要分多次循环的话, 那么在期间要重载新数据, 则需要MCU参与, 所以先不考虑大图片, 否则就失去使用DMA的意义了.
(虽说有双缓存的手段,可开两个缓存,启用两个DMA, 交替使用, 但目前看是用于从外部Flash存储器读取数据的. 故暂不作深入考虑.)
AI8051U实验箱还有丰富的新知识点, 有待开发挖掘、学习研究.
至此,初篇移植作业暂告段落, 还有提升完善的空间, 日后再换课题: 比如图片数据放在外部QSPI_Flash中, 再做全屏图片的显示实验.
工程文件包, 供有兴趣的爱好者参考和指正:
00-TestTFT9341_2.rar
(136.64 KB, 下载次数: 87)
|
1
喜欢他/她就送朵鲜花吧,赠人玫瑰,手有余香!
-
+5
楼主威武~
|