1. TFT与CSI 颜色模式
可能出现的问题是: TFT上显示的图像颜色不对 或 拍出照片颜色不对
分析: TFT和CSI都有两种颜色模式: RGB565 和 YUV 模式.
必须使TFT和CSI工作在同一种颜色模式下时才能显示出正确的图像.
TFT的颜色模式设置:
在TFT驱动的TFT_Driver.c文件实现:
TFT_SetBufFmt(TFT_FRAME_FMT1, TFT_FRAME_FMT2); //
其中:TFT_FRAME_FMT1 和 TFT_FRAME_FMT2 的定义在 TFT_Config.h中定义如下:
#define TFT_FRAME_FMT1 C_TFT_BUF_RGB565 //这一对为RGB565模式的配置参数
#define TFT_FRAME_FMT2 C_TFT_BUF_YUV
//#define TFT_FRAME_FMT1 C_TFT_BUF_4Y4U4Y4V //这一对为YUV模式的配置参数
//#define TFT_FRAME_FMT2 C_TFT_BUF_YCBCR
CSI的颜色模式设置:
CSI_Init(QVGA, RGB565IN, RGB565OUT, TFT_BUFFER0_SA, TFT_BUFFER0_SA, TFT_BUFFER0_SA); //RGB565模式
或CSI_Init(QVGA, YUVIN, YUVOUT, TFT_BUFFER1_SA, TFT_BUFFER1_SA, TFT_BUFFER1_SA); //YVU模式
2. 在拍照时,MPEG只能对YUV数据进行编码,在拍照时CSI要设置为:YUV模式,而通常情况下,TFT工作在RGB565模式下,所以在拍照程序中,拍照前的预览阶段,要把CSI也设置为RGB565模式,而在拍照那一该要将CSI切换到YUV模式. 同时我们的LCD为320*240(QVGA)分辨率的,而题目要求拍出640*480(VGA)的照片,所以在拍照瞬间我们让CSI工作在VGA模式下.
拍照程序大致实现方法:
void Photo(...) //拍照函数
{
....
CSI_Init(QVGA, RGB565IN, RGB565OUT, TFT_BUFFER0_SA, TFT_BUFFER0_SA, TFT_BUFFER0_SA); //先将CSI设为 QVGA, RGB565模式,以在LCD上显示,进入预览状态
....
if(照命令)
{
CSI_Init(VGA, YUVIN, YUVOUT, TFT_BUFFER1_SA, TFT_BUFFER1_SA,
TFT_BUFFER1_SA); //切换CSI为VGA, YUV模式,并改变其缓冲区地址为TFT_BUFFER1_SA,
,不让其在LCD上显示
CSI_Pause(); //CSI暂停
camera_jpg(TFT_BUFFER1_SA, 0xa0900000); // 对TFT_BUFFER1_SA地址开始的的数据进行编码并保存为照片
CSI_Init(QVGA, RGB565IN, RGB565OUT, TFT_BUFFER0_SA, TFT_BUFFER0_SA, TFT_BUFFER0_SA); //拍照完成后,CSI返回QVGA,RGB565模式,以再次返回预览状态.
}
....
}
这样即可实现拍照功能.
3. 背景音乐功能: 读MP3与读图片冲突
因为MP3和图片都存在SD卡上,而MP3播放是在中断服务程序中(MP3_Service_Loop()函数中)读取数据的,在播放图片时如果加上背景 音乐功能,则可能会出现正在读图片时,突然来了中断,要读取MP3数据,这样就会导致文件系统冲突,出现死机现象.
解决方法:
定义一个全局变量ufat_read_flag 来表示当前有没有正在读取图片
在读取图片之前先让ufat_read_flag=1表示正在读取图片,读完图片之后再让
ufat_read_flag=0.
而在IRQ63中断中在调用MP3_Service_Loop()之前先判断ufat_read_flag是否为0,为0里再读取MP3,否则
,表示正在读取图片数据,跳过本次中断,暂不调用MP3_Service_Loop(),下次中断来时再判断是否要执行MP3_Service_Loop();
程序大概如下:
int ufat_read_flag = 1;
/*在读取图片的文件中*/
...
ufat_read_flag = 1;
read(picture); //读取图片
ufat_read_flag = 0;
...
/*在中断中*/
void IRQ63(int _vector_, void *data, void *reg_stack)
{
MP3_Service_Loop_ISR();
if(!ufat_read_flag)
{
MP3_Service_Loop();
MP3_Service_Loop();
MP3_Service_Loop();
}
}
这样即可解决读MP3和读图片冲突的问题.
4. 背景音乐:读图片时间太长,会出现MP3音效差,声音有些卡.
解决方法:
把图片分为一小块一小块的读取:
参考程序:
...
while(1)
{
ufat_read_flag = 0; //问题3中所说的在读取图片之前加一个表示正在读取图片的标志.
if(read(fd,buffer+256*num,256) < 256) //把图片分为256大小的块来读取
break; //如果读完,则跳出while(1),去显示图片
ufat_read_flag = 1;
num++;
}
TFT_PutPicture(Win,0,0,buffer,IMAGE_SCALE);
...
这是因为在播放MP4和显示JPG图片时对MPEG编解码器的设置是不同的,所以最好在播放MP4之前和之后调用mp4_reset()和MPEG4_Init()
这两个函数,如下 :
...
mp4_reset();
MPEG4_Init();
MP4Play((const LOAD_INFO *)&LoadMP4Info); // 播放MP4文件
mp4_reset();
MPEG4_Init();
...