ADI Blackfin DSP处理器-BF533的开发详解20:4.3寸LCD液晶屏的设计与应用(含源码)
硬件准备
ADSP-EDU-BF533:BF533开发板
AD-HP530ICE:ADI DSP仿真器
软件准备
Visual DSP++软件
硬件链接
硬件设计原理图
功能介绍
ADSP-EDU-BF53x 开发板上的液晶屏为 480*272 尺寸真彩 TFT 液晶屏,其型号为 WXCAT43-TG3#001R。
WXCAT43-TG3#001R 为 24Bit 的液晶屏,数据输入格式为 RGB888。ADSP-BF53x 的 PPI 接口只有 16 根数据线,所以接入方式为 RGB565,将 RGB 的低位数据线直接接地,以匹配数据线的不足。
WXCAT43-TG3#001R 的背光开关由 CPLD 控制,其映射于 CPLD 的 DEVICE_OE 寄存器。其背光亮度由 Timer0控制,通过配置 Timer0 输出 PWM 脉冲的脉宽来改变亮度。
DEVICE_OE 寄存器(读/写):
DEVICE_OE 寄存器地址:0x20320000
DEVICE_OE 寄存器设置硬件设备上一些控制管脚的电平状态。
DEVICE_OE 寄存器位功能:
LCDBK_OE:液晶屏背光控制位
1:关闭 TFT 液晶屏背光
0:使能 TFT 液晶屏背光
PPI_SET1~0:PPI 选择位
00:选通 CMOS PPI 时钟,使能 CMOS
01:选通 TFT PPI 时钟
选通 板卡为扩展接口的 PPICLK 提供时钟
1x:选通 PPI 时钟由扩展接口输入
选通液晶屏,需将 LCDBK_OE 位设置为 0,PPI_SET0 位设置为 1,PPI_SET1 位设置为 0。
Timer0 寄存器配置:
TIMER0_CONFIG 寄存器:配置 Timer 工作模式。
TIMER0_WIDTH 寄存器:配置脉冲宽度。
TIMER0_PERIOD 寄存器:配置波形周期。
硬件连接示意图
代码实现功能
代码实现了通过文件系统读出一幅 BMP24 格式 480*272 点阵的位图图片数据,将数据做转换后变为 RGB888格式数据,再将 RGB888 格式数据转为 RGB565 格式,通过 PPI 接口使用 PPIDMA 将数据送给液晶屏。通过
Init_Timers0 函数可以配置背光亮度。代码中的 color_bar 函数,可以产生彩条数据,在液晶屏上产生彩条。
调试步骤
1. 将仿真器(ICE)与 ADSP-EDU-BF53x 开发板和计算机连接好。
2. 先给 ADSP-EDU-BF53x 开发板上电,再为仿真器(ICE)上电。
3. 运行 VisualDSP++ 5.0 软件,选择合适的 BF533 的 session 将仿真器与软件连接。
4. 加载 VisualDSP++ 5.0 工程文件 BF53x_TFT_480_272.dpj,编译并全速运行。
测试结果
板卡上的 TFT 显示一幅卡通图像。
液晶屏上显示的 BMP24 文件的图像。
程序源码
CPU.C
#include <cdefBF533.h>
void Set_PLL(int pmsel,int pssel)
{
int new_PLL_CTL;
*pPLL_DIV = pssel;
asm(“ssync;”);
new_PLL_CTL = (pmsel & 0x3f) << 9;
*pSIC_IWR |= 0xffffffff;
if (new_PLL_CTL != *pPLL_CTL)
{
*pPLL_CTL = new_PLL_CTL;
asm(“ssync;”);
asm(“idle;”);
}
}
void Init_SDRAM(void)
{
*pEBIU_SDRRC = 0x00000817;
*pEBIU_SDBCTL = 0x00000013;
*pEBIU_SDGCTL = 0x0091998d;
ssync();
}
void Init_EBIU(void)
{
*pEBIU_AMBCTL0 = 0x7bb07bb0;
*pEBIU_AMBCTL1 = 0x7bb07bb0;
*pEBIU_AMGCTL = 0x000f;
}
void Init_Timers0(int dat)
{
*pTIMER0_CONFIG = 0x0019;
*pTIMER0_WIDTH = dat;
*pTIMER0_PERIOD = 2000;
}
void Enable_Timers0(void)
{
*pTIMER_ENABLE|= 0x0001;
asm(“ssync;”);
}
void Disable_Timers0(void)
{
*pTIMER_DISABLE |= 0x0001;
}
TFF_lcd.c
#include <cdefBF533.h>
section(“sdram0_bank1”) unsigned char DisplayBuffer[272][1440] ;
section(“sdram0_bank1”) unsigned char DisplayBuffer_565[272][1440] ;
section(“sdram0_bank1”) unsigned char TempBuffer_img[272][1440] ;
section(“sdram0_bank1”) unsigned char Inputdata[391734];
void InitDMA(void)
{
int addr;
addr = &DisplayBuffer_565;
addr -= 1920;
*pDMA0_START_ADDR = addr;
*pDMA0_X_COUNT = 480;
*pDMA0_X_MODIFY = 2;
*pDMA0_Y_COUNT = 286;
*pDMA0_Y_MODIFY = 2;
*pDMA0_CONFIG = 0x1034;
}
void InitPPI(void)
{
*pPPI_CONTROL = 0x781e;
*pPPI_DELAY = 0;
*pPPI_COUNT = 479;
*pPPI_FRAME = 286;
}
void InitTimer(void)
{
*pTIMER1_PERIOD = 525;
*pTIMER1_WIDTH = 41;
*pTIMER1_CONFIG = 0x00a9;
*pTIMER2_PERIOD = 150150;
*pTIMER2_WIDTH = 5250;
*pTIMER2_CONFIG = 0x00a9;
}
void PPI_TMR_DMA_Enable(void)
{
*pDMA0_CONFIG |= 0x1;
asm(“ssync;”);
InitTimer();
*pPPI_CONTROL |= 0x1;
asm(“ssync;”);
*pTIMER_ENABLE|= 0x0006;
asm(“ssync;”);
}
void PPI_TMR_DMAR_Disable(void)
{
*pDMA0_CONFIG &= (~0x1);
*pPPI_CONTROL &= (~0x1);
}
void bgrtorgb24(void)
{
int i,j;
int a,b,c;
for(i=0;i<272;i++)
{
for(j=0;j<1440;j++)
{
TempBuffer_img[i][j] = Inputdata[i1440+j+54];
}
}
for(i=0;i<272;i++)
{
for(j=0;j<480;j++)
{
a = TempBuffer_img[i][j3];
b = TempBuffer_img[i][j3+1];
c = TempBuffer_img[i][j3+2];
TempBuffer_img[i][j3] = c;
TempBuffer_img[i][j3+1] = b;
TempBuffer_img[i][j*3+2] = a;
}
}
for(i=0;i<272;i++)
{for(j=0;j<1440;j++){DisplayBuffer[i][j] = (TempBuffer_img[271-i][j]); }
}
}
void color_bar(void)
{
int i,j;
for(i=0;i<272;i++)
{for(j=0;j<40;j++){DisplayBuffer[i][j*3+0] = 0x00;DisplayBuffer[i][j*3+1] = 0x00;DisplayBuffer[i][j*3+2] = 0x00;}for(j=40;j<80;j++){DisplayBuffer[i][j*3+0] = 0xff;DisplayBuffer[i][j*3+1] = 0x00; DisplayBuffer[i][j*3+1] = 0x00;DisplayBuffer[i][j*3+2] = 0x00;//red}for(j=80;j<120;j++){DisplayBuffer[i][j*3+0] = 0x00;DisplayBuffer[i][j*3+1] = 0xff;DisplayBuffer[i][j*3+2] = 0x00;//green}for(j=120;j<160;j++){DisplayBuffer[i][j*3+0] = 0x00;DisplayBuffer[i][j*3+1] = 0x00;DisplayBuffer[i][j*3+2] = 0xff;//blue}for(j=160;j<200;j++){DisplayBuffer[i][j*3+0] = 0xff;DisplayBuffer[i][j*3+1] = 0xff;DisplayBuffer[i][j*3+2] = 0x0;//red+green}for(j=200;j<240;j++){DisplayBuffer[i][j*3+0] = 0x00;DisplayBuffer[i][j*3+1] = 0xff;DisplayBuffer[i][j*3+2] = 0xff;//red+blue}for(j=240;j<280;j++){DisplayBuffer[i][j*3+0] = 0xff;DisplayBuffer[i][j*3+1] = 0x00;DisplayBuffer[i][j*3+2] = 0xff;//green+blue}for(j=280;j<320;j++){DisplayBuffer[i][j*3+0] = 0xff;DisplayBuffer[i][j*3+1] = 0xff;DisplayBuffer[i][j*3+2] = 0xff;}for(j=320;j<360;j++){DisplayBuffer[i][j*3+0] = 0x00;DisplayBuffer[i][j*3+1] = 0xff;DisplayBuffer[i][j*3+2] = 0x00;//green}for(j=360;j<400;j++){DisplayBuffer[i][j*3+0] = 0x00;DisplayBuffer[i][j*3+1] = 0x00;DisplayBuffer[i][j*3+2] = 0xff;//blue}for(j=400;j<440;j++){DisplayBuffer[i][j*3+0] = 0xff;DisplayBuffer[i][j*3+1] = 0xff;DisplayBuffer[i][j*3+2] = 0x0;//red+green}for(j=440;j<480;j++){DisplayBuffer[i][j*3+0] = 0x00;DisplayBuffer[i][j*3+1] = 0xff;DisplayBuffer[i][j*3+2] = 0xff;//red+blue}}
}
void RGB888_RGB565(unsigned char *src, int src_len, unsigned char *dst)
{
int i = 0;
int j = 0;
if (src_len % 3 != 0)
{return;
}
for (i = 0; i < src_len; i += 3)
{dst[j+1] = src[i+2] &0xf8; //B dst[j+1] |= ((src[i+1]>>5) & 0x07);//GHdst[j] = ((src[i+1]<<3) & 0xe0); //GL dst[j] |= ((src[i]>>3) &0x1f); //rj += 2; }
}
Main.c
#include <stdio.h>
#include <cdefBF533.h>
extern unsigned char DisplayBuffer[272][1440] ;
extern unsigned char DisplayBuffer_565[272][1440] ;
extern unsigned char Inputdata[];
void main(void)
{
FILE *fp;
int lenth;
Set_PLL(16,4);
Init_EBIU();
Init_SDRAM();
LCDBK_Disable();fp = fopen("../1.bmp", "rb");
lenth = fread(Inputdata, 1, 391734, fp);
fclose(fp);bgrtorgb24();
// color_bar();
RGB888_RGB565(DisplayBuffer,391680,DisplayBuffer_565);InitDMA();
InitPPI();
InitTimer();
PPI_TMR_DMA_Enable();
LCD_Enable();
Init_Timers0(1999);//1~1999 控制背光亮度
Enable_Timers0();
LCDBK_Enable();
while(1);
}
ADI Blackfin DSP处理器-BF533的开发详解20:4.3寸LCD液晶屏的设计与应用(含源码)相关推荐
- ADI Blackfin DSP处理器-BF533的开发详解1:软件和硬件的准备
BF533是ADI Blackfin系列DSP处理器里的最经典型号,这个DSP我用了20年,单就这一颗DSP来讲,我相信国内应该没有比我更资深的了,下面就来说一说这颗DSP. 这颗IC是Blackfi ...
- ADI Blackfin DSP处理器-BF533的开发详解3:GPIO(含源代码)
我们从最基础的GPIO开始,先讲外设,这玩意不管是单片机,还是ARM,又或是FPGA,甚至SOC的芯片,都有GPIO,有共性,就好理解,让我们看看在ADI的DSP里头,GPIO是怎么一回事吧. 硬件准 ...
- ADI Blackfin DSP处理器-BF533的开发详解58:DSP控制ADXL345三轴加速度传感器的应用(含源码)
硬件准备 ADSP-EDU-BF533:BF533开发板 AD-HP530ICE:ADI DSP仿真器 软件准备 Visual DSP++软件 硬件链接 MEMS三轴加速度传感器 我做了一个三轴加速度 ...
- ADI Blackfin DSP处理器-BF533的开发详解60:DSP控制ADXL345三轴加速度传感器-电子水平仪(含源码)
硬件准备 ADSP-EDU-BF533:BF533开发板 AD-HP530ICE:ADI DSP仿真器 软件准备 Visual DSP++软件 硬件链接 MEMS三轴加速度传感器 我做了一个三轴加速度 ...
- ADI Blackfin DSP处理器-BF533的开发详解21:RTC实时时钟的原理及应用(含源码)
硬件准备 ADSP-EDU-BF533:BF533开发板 AD-HP530ICE:ADI DSP仿真器 软件准备 Visual DSP++软件 硬件链接 硬件设计原理图 功能介绍 ADSP-BF53x ...
- ADI Blackfin DSP处理器-BF533的开发详解55:CVBS输入-DSP和ADV7180的应用详解(含源码)
硬件准备 ADSP-EDU-BF533:BF533开发板 AD-HP530ICE:ADI DSP仿真器 软件准备 Visual DSP++软件 硬件链接 CVBS IN 视频输入 硬件实现原理 CVB ...
- ADI Blackfin DSP处理器-BF533的开发详解25:USB接口设计(含源代码)
硬件准备 ADSP-EDU-BF533:BF533开发板 AD-HP530ICE:ADI DSP仿真器 软件准备 Visual DSP++软件 硬件链接 硬件设计原理图 功能介绍 跟网口一样,USB这 ...
- ADI Blackfin DSP处理器-BF533的开发详解80:uClinux在BF上的应用详解
硬件准备 ADSP-EDU-BF533:BF533开发板 AD-HP530ICE:ADI DSP仿真器 软件准备 Visual DSP++软件 硬件链接 Blackfin可以跑操作系统,因为他作为一个 ...
- ADI Blackfin DSP处理器-BF533的开发详解15:RS232串口的实现(含源代码)
硬件准备 ADSP-EDU-BF533:BF533开发板 AD-HP530ICE:ADI DSP仿真器 软件准备 Visual DSP++软件 硬件链接 硬件设计原理图 实现原理 ADSP-EDU-B ...
最新文章
- Krona绘制物种或功能组成圈图
- java. xerces转xml_Xerces -C++遇到的xml编码转换问题
- ORACLE表空间的相关操作
- SQL 每行随机产生数字
- jquery简单实现点击弹出层效果实例
- 各浏览器的Hack写法【转】
- java基础题目的网站_Java基础题目
- 2021-10-28 ACWING826 单链表
- 互联网摸鱼日报(2022-10-17)
- AutoRunner检查点之校验消息框
- Matlab中单元数组和结构数组
- 从小学4年级的数学课开始解释线性回归
- apple pencil二代值不值得买?iPad电容笔测评
- 道德经 道可道,非常道。
- Android App内截屏监控及涂鸦功能实现
- 冰刃-删除顽固文件的利器!
- 少儿学编程好还是奥术好
- ubuntu 14.04源更新(sources.list)
- 《Uncertainty-aware Joint Salient Object and Camouflaged Object Detection》—CVPR2021—SOD+COD
- python下载批量图片
热门文章
- 离线安装/断网安装python第三方库
- [BI] 搭建开源BI平台Superset,连接Oracle数据库
- 区块链的发展及优缺点
- ARM体系结构与编程总结
- 理论篇五: 如何设计游戏棋牌平台 - 服务端 - 棋牌设计 - 一切皆步骤
- 士兵职业基本适应性测试软件,士兵职业基本适应性检测系统 类型1.2.3怎么分...
- android中监听的作用,Android里的AdapterView中OnItemClickListener监听器四个参数的含义...
- 多维度深入剖析QLC SSD硬件延迟的来源
- Python技法之简单递归下降Parser的实现方法
- 单场淘汰制场次计算方法_球类运动比赛的编排方法