bf518控制AT070TN83 V.1的7寸液晶显示屏代码及总结说明bf518控制AT070TN83 V.1液晶显示屏代码及总结说明 搞了几天,终于整出来个color bar,写点东西大家分享。新人学点东西不容易啊~ 嘿嘿 从头开始写。 ---------------------------------------------------------------------------------------------------------------------------- 要在屏上显示图像,需要把图像存在内存中。 section("MEM_SDRAM0_BANK0")unsigned short int DisplayBuffer[525][800]; //前消隐23行,中间480行有效数据,后消隐22行
此处需要在ldf文件中定义 MEM_SDRAM0_BANK0 { TYPE(RAM) START(0x00000000) END(0x04000000) WIDTH(8) } 这块是不是开的有点大?我不知道。反正程序是可以用了。前辈们给指点一下。
---------------------------------------------------------------------------------------------------------------------------- 接下来就是各种初始化 ---------------------------------------------------------------------------------------------------------------------------- *pDMA0_START_ADDR = 0; *pDMA0_X_COUNT = 800;//16位传输 *pDMA0_X_MODIFY = 2; *pDMA0_Y_COUNT = 525; *pDMA0_Y_MODIFY = 2; *pDMA0_CONFIG = FLOW_AUTO | SYNC | DMA2D | WDSIZE_16 ;//243 这里PPI是16位传输数据,所以MODIFY=2,是这样吧。。。 Y_COUNT = 525是因为前消隐23行,中间480行有效数据,后消隐22行。消隐是个什么概念?大概就是占个地方让你看不到它,硬件原理的问题吧。。。自己百度去。 ==================================================== *pPORTG_MUX |= 0xc080;//PG6|PG7|PG12; //435 412 418 ssync(); *pPORTG_FER |= PG6|PG7|PG5;//436 ssync(); *pTIMER0_PERIOD = 928;//Thp AT070 P11 *pTIMER0_WIDTH = 48; *pTIMER0_CONFIG = CLK_SEL | TIN_SEL | PERIOD_CNT | PWM_OUT;//496 *pTIMER1_PERIOD = 928*525;//525*Thp *pTIMER1_WIDTH = 928*3;//3*Thp *pTIMER1_CONFIG = CLK_SEL | TIN_SEL | PERIOD_CNT | PWM_OUT; ssync(); 看好多帖子都没有提到过MUX寄存器,由于我目前只用过518,是不是别的型号PPI接口都不需要指定? 另外在这里需要注意一点,在设计硬件的时候,需要先看一下硬件使用手册412页的表,据说像PPI这些有多个针脚可以指定的功能,必需按表里的分组设计针脚功能。说实话,硬件手册我基本上就没看,谁知道这地方怎么回事就给提个醒。 关于TIMER的设置,需要看屏的说明书,那几个参数说明书里都有。我也做了注释。在网上看了一篇文章,这部分就没写说明,参数我也是猜出来的。哈哈。 ================================================ *pPORTF_MUX = 0x555;//435 411 ssync(); *pPORTF_FER |= 0xFFFF;//436 ssync(); *pPPI_CONTROL = POLS | 0x0010 | PORT_DIR | 0x3800 | XFR_TYPE;//897 | PACK_EN *pPPI_DELAY = 0;//904 *pPPI_COUNT = 800-1; // 这部分到没什么太重要的东西,只是要提一句,网上很多例子都是pPPI_COUNT = 800*2-1;因为我在最初定义显示缓存的时候用的是unsigned short int DisplayBuffer,在VDSP里看了一下是16位的,另外在pPPI_CONTROL 里也设置的16位数据,所以我觉得这里pPPI_COUNT = 800-1应该没问题。 ================================================ 最后就是在内存中生成个color bar了,前后消隐行只是开始为了测试用的,在正常显示的时候,前23行黑色和最后22行白色的条是不会显示出来的。 for(i=0;i<23;i++) { for(j=0;j<800;j++) { DisplayBuffer[j]=0;//黑 } } for(i=23;i<183;i++) { for(j=0;j<800;j++) { DisplayBuffer[j]=0xf800;//蓝 } } for(i=183;i<343;i++) { for(j=0;j<800;j++) { DisplayBuffer[j]=0x7E0;//绿 } } for(i=343;i<503;i++) { for(j=0;j<800;j++) { DisplayBuffer[j]=0x1f;//红 } } for(i=503;i<525;i++) { for(j=0;j<800;j++) { DisplayBuffer[j]=0xffff;//白 } } =========================================================================== 最后要感谢scott给提供了一些编程资料,还有感谢frank最重要的一个提醒,我才把这个程序调好。开始编写的程序和上面的差不多,但显示出来的色条总是会向一个方向移动,研究了好多天也没搞明白怎么回事。后来frank说可能是处理速度的问题,让我把主频调到133M。改完马上就好了。呵呵。我的PPI接了50M的晶振,应该是这个原因吧。。。 第一次搞dsp,各种不懂,大家多指教! chris ma 于2011年7月15日 QQ:5797378
重要补充:
对上面程序进行了另一个测试,在一行中显示两种颜色,测试之后发现,图像整体偏离中心。
经过群里朋友“2012“的提醒,
将*pPPI_DELAY = 0;
改为*pPPI_DELAY = 45;
再次测试显示图像正常。
这个delay值是从网上的资料中找到的,原文说AT070TN83手册中给出延时40周期,但实测45周期比较好。
|