ARM cortex a 的 LCD显示
来源:互联网 发布:速卖通软件 编辑:程序博客网 时间:2024/05/22 13:10
首先根据原理图找到连接液晶的IO口,第一步就是配置IO口的输入输出。
先标注各个寄存器的地址
#define GPF0CON (*(volatile unsigned long *)0xE0200120)
#define GPF1CON (*(volatile unsigned long *)0xE0200140)
#define GPF2CON (*(volatile unsigned long *)0xE0200160)
#define GPF3CON (*(volatile unsigned long *)0xE0200180)
#define GPD0CON (*(volatile unsigned long *)0xE02000A0)
#define GPD0DAT (*(volatile unsigned long *)0xE02000A4)
#define CLK_SRC1 (*(volatile unsigned long *)0xe0100204)
#define CLK_DIV1 (*(volatile unsigned long *)0xe0100304)
#define DISPLAY_CONTROL (*(volatile unsigned long *)0xe0107008)
#define VIDCON0 (*(volatile unsigned long *)0xF8000000)
#define VIDCON1 (*(volatile unsigned long *)0xF8000004)
#define VIDTCON2 (*(volatile unsigned long *)0xF8000018)
#define WINCON0 (*(volatile unsigned long *)0xF8000020)
#define WINCON2 (*(volatile unsigned long *)0xF8000028)
#define SHADOWCON (*(volatile unsigned long *)0xF8000034)
#define VIDOSD0A (*(volatile unsigned long *)0xF8000040)
#define VIDOSD0B (*(volatile unsigned long *)0xF8000044)
#define VIDOSD0C (*(volatile unsigned long *)0xF8000048)
#define VIDW00ADD0B0 (*(volatile unsigned long *)0xF80000A0)
#define VIDW00ADD1B0 (*(volatile unsigned long *)0xF80000D0)
#define VIDTCON0 (*(volatile unsigned long *)0xF8000010)
#define VIDTCON1 (*(volatile unsigned long *)0xF8000014)
#define LeftTopX 0
#define LeftTopY 0
#define RightBotX 1023
#define RightBotY 599
#define FB_ADDR (0x26000000)
#define ROW (600)
#define COL (1024)
#define HOZVAL (COL-1)
#define LINEVAL (ROW-1)
#define XSIZE COL
#define YSIZE ROW
首先是IO初始化函数,把端口都设置为LCD_VD,也就是LCD数据像素输出模式。
GPF0CON = 0x22222222;
GPF1CON = 0x22222222;
GPF2CON = 0x22222222;
GPF3CON = 0x22222222;
然后打开背光。VLED+接的是VDD_5V,VLED-接的是PWM_OUT0,我们直接让这个引脚为低电平就可以了。
GPD0CON &= ~(0xf<<0);
GPD0CON |= (1<<0); //设置为输出模式
GPD0DAT &= ~(1<<0); //输出低电平
然后接下来是设置播放路径,选择FIMD模式
这个寄存器只有两位有用,FIMD 的主要功能就是获取显示数据,并将数据输出到显示屏。
DISPLAY_CONTROL = 2<<0;
在VIDCON0寄存器里面,bit[26~28]设置使用RGB接口,bit[18]:RGB 并行,
bit[2]:选择时钟源为HCLK_DSYS=166MHz
VIDCON0 &= ~( (3<<26)|(1<<18)|(1<<2) );
bit[1]:使能lcd控制器,bit[0]:当前帧结束后使能lcd控制器
VIDCON0 |= ( (1<<0)|(1<<1) );
bit[4]:选择需要分频,bit[6~13]:分频系数为5,即VCLK = 166M/(4+1) = 33M
VIDCON0 |= 4<<6 | 1<<4;
液晶手册时序图中,VSYNC和HSYNC都是低脉冲,s5pv210数据手册的时序图:VSYNC和HSYNC都是高脉冲有效,所以需要反转
这两个分别为水平同步信号和垂直同步信号。
VIDCON1 |= 1<<5 | 1<<6;
设置时序,VBPD和VFPD分别为垂直同步信号的前后肩,VSPW告诉LCD一帧图像要开始了。
HSPW告诉LCD一行像素要开始了,HBPD和HFPD分别为水平同步信号的前后肩。
VIDTCON0 = VBPD<<16 | VFPD<<8 | VSPW<<0;
VIDTCON1 = HBPD<<16 | HFPD<<8 | HSPW<<0;
设置物理屏幕的长宽
VIDTCON2 = (LINEVAL << 11) | (HOZVAL << 0);
设置window0,bit[0]:使能,bit[2~5]:24bpp(RGB888),bit[15]这个位是用来设置像素RGB顺序的。
WINCON0 |= 1<<0;
WINCON0 &= ~(0xf << 2); //先清零再填数据
WINCON0 |= (0xB<<2) | (1<<15);
设置显存空间的大小,这里直接和屏幕大小设成一样的就行了。
VIDOSD0A = (LeftTopX<<11) | (LeftTopY << 0);
VIDOSD0B = (RightBotX<<11) | (RightBotY << 0);
VIDOSD0C = (LINEVAL + 1) * (HOZVAL + 1); //这个寄存器指定窗口的大小
设置fb的地址
VIDW00ADD0B0 = FB_ADDR;
VIDW00ADD1B0 = (((HOZVAL + 1)*4 + 0) * (LINEVAL + 1)) & (0xffffff);
使能channel 0传输数据,使能window0,让window0覆盖其他的window
SHADOWCON = 0x1; //这个寄存器VIDOSD0C
这样子初始化工作就完成了。
先标注各个寄存器的地址
#define GPF0CON (*(volatile unsigned long *)0xE0200120)
#define GPF1CON (*(volatile unsigned long *)0xE0200140)
#define GPF2CON (*(volatile unsigned long *)0xE0200160)
#define GPF3CON (*(volatile unsigned long *)0xE0200180)
#define GPD0CON (*(volatile unsigned long *)0xE02000A0)
#define GPD0DAT (*(volatile unsigned long *)0xE02000A4)
#define CLK_SRC1 (*(volatile unsigned long *)0xe0100204)
#define CLK_DIV1 (*(volatile unsigned long *)0xe0100304)
#define DISPLAY_CONTROL (*(volatile unsigned long *)0xe0107008)
#define VIDCON0 (*(volatile unsigned long *)0xF8000000)
#define VIDCON1 (*(volatile unsigned long *)0xF8000004)
#define VIDTCON2 (*(volatile unsigned long *)0xF8000018)
#define WINCON0 (*(volatile unsigned long *)0xF8000020)
#define WINCON2 (*(volatile unsigned long *)0xF8000028)
#define SHADOWCON (*(volatile unsigned long *)0xF8000034)
#define VIDOSD0A (*(volatile unsigned long *)0xF8000040)
#define VIDOSD0B (*(volatile unsigned long *)0xF8000044)
#define VIDOSD0C (*(volatile unsigned long *)0xF8000048)
#define VIDW00ADD0B0 (*(volatile unsigned long *)0xF80000A0)
#define VIDW00ADD1B0 (*(volatile unsigned long *)0xF80000D0)
#define VIDTCON0 (*(volatile unsigned long *)0xF8000010)
#define VIDTCON1 (*(volatile unsigned long *)0xF8000014)
#define LeftTopX 0
#define LeftTopY 0
#define RightBotX 1023
#define RightBotY 599
#define FB_ADDR (0x26000000)
#define ROW (600)
#define COL (1024)
#define HOZVAL (COL-1)
#define LINEVAL (ROW-1)
#define XSIZE COL
#define YSIZE ROW
首先是IO初始化函数,把端口都设置为LCD_VD,也就是LCD数据像素输出模式。
GPF0CON = 0x22222222;
GPF1CON = 0x22222222;
GPF2CON = 0x22222222;
GPF3CON = 0x22222222;
然后打开背光。VLED+接的是VDD_5V,VLED-接的是PWM_OUT0,我们直接让这个引脚为低电平就可以了。
GPD0CON &= ~(0xf<<0);
GPD0CON |= (1<<0); //设置为输出模式
GPD0DAT &= ~(1<<0); //输出低电平
然后接下来是设置播放路径,选择FIMD模式
这个寄存器只有两位有用,FIMD 的主要功能就是获取显示数据,并将数据输出到显示屏。
DISPLAY_CONTROL = 2<<0;
在VIDCON0寄存器里面,bit[26~28]设置使用RGB接口,bit[18]:RGB 并行,
bit[2]:选择时钟源为HCLK_DSYS=166MHz
VIDCON0 &= ~( (3<<26)|(1<<18)|(1<<2) );
bit[1]:使能lcd控制器,bit[0]:当前帧结束后使能lcd控制器
VIDCON0 |= ( (1<<0)|(1<<1) );
bit[4]:选择需要分频,bit[6~13]:分频系数为5,即VCLK = 166M/(4+1) = 33M
VIDCON0 |= 4<<6 | 1<<4;
液晶手册时序图中,VSYNC和HSYNC都是低脉冲,s5pv210数据手册的时序图:VSYNC和HSYNC都是高脉冲有效,所以需要反转
这两个分别为水平同步信号和垂直同步信号。
VIDCON1 |= 1<<5 | 1<<6;
设置时序,VBPD和VFPD分别为垂直同步信号的前后肩,VSPW告诉LCD一帧图像要开始了。
HSPW告诉LCD一行像素要开始了,HBPD和HFPD分别为水平同步信号的前后肩。
VIDTCON0 = VBPD<<16 | VFPD<<8 | VSPW<<0;
VIDTCON1 = HBPD<<16 | HFPD<<8 | HSPW<<0;
设置物理屏幕的长宽
VIDTCON2 = (LINEVAL << 11) | (HOZVAL << 0);
设置window0,bit[0]:使能,bit[2~5]:24bpp(RGB888),bit[15]这个位是用来设置像素RGB顺序的。
WINCON0 |= 1<<0;
WINCON0 &= ~(0xf << 2); //先清零再填数据
WINCON0 |= (0xB<<2) | (1<<15);
设置显存空间的大小,这里直接和屏幕大小设成一样的就行了。
VIDOSD0A = (LeftTopX<<11) | (LeftTopY << 0);
VIDOSD0B = (RightBotX<<11) | (RightBotY << 0);
VIDOSD0C = (LINEVAL + 1) * (HOZVAL + 1); //这个寄存器指定窗口的大小
设置fb的地址
VIDW00ADD0B0 = FB_ADDR;
VIDW00ADD1B0 = (((HOZVAL + 1)*4 + 0) * (LINEVAL + 1)) & (0xffffff);
使能channel 0传输数据,使能window0,让window0覆盖其他的window
SHADOWCON = 0x1; //这个寄存器VIDOSD0C
这样子初始化工作就完成了。
0 0
- ARM cortex a 的 LCD显示
- arm的lcd基础显示
- arm的lcd显示字体
- ARM公司的Cortex内核Cortex-A,Cortex-R和Cortex-M之间有什么区
- ARM cortex a 的SDRAM (DDR)
- ARM cortex a 的串口通信
- Cortext-ARM公司的ARM芯片内核:Cortex-A Cortex-R Cortex-M
- ARM lcd 显示 问题
- ARM Cortex-A系列处理器
- ARM Cortex-A Series Processors
- Cortex-A相对经典ARM处理器的扩展
- 关于ARM Cortex a 系列的看门狗定时器
- ARM Cortex-A平台NEON指令的编译和优化
- [ARM Cortex-A8]S5PV210裸板7寸LCD C程序
- ARM平台LCD显示汉字
- ARM平台LCD显示汉字
- ARM学习笔记--LCD显示
- ARM Cortex-M3,Cortex-M0,Cortex-A8的主要区别
- 青蛙跳台阶
- intellij idea使用方法---快捷键
- Android学习必用-推荐大牛的博客
- 异步调用与多线程的区别
- 微信支付,报invalid out_trade_no错误
- ARM cortex a 的 LCD显示
- Alcatraz不错的插件管理
- SIT和UAT有什么区别?
- 遍历数组和集合
- 圆角Imageview--RoundedImageView
- java权限控制
- java学习日记_18:面向对象之封装的好处和原则。07.05
- 《Linux多线程服务端编程》—线程同步精要
- MS DOS 命令大全