arm开发板放张图片动起来_ARM裸机不能正确显示图片的问题
展开全部
办法,只有你懂!你能不能贴出你的程序,给32313133353236313431303231363533e59b9ee7ad9431333264643733我们参考参考呢?
LCD裸机驱动程序流程:
一、LCD初始化:
1、端口初始化:设置GPC和GPD为LCD输出端口模式
2、显示模式初始化:
LCDCON1:选择BBP(位每像素)模式、选择显示模式、决定VLCK频率
LCDCON2:bit[31:24](1:VPBD)、bit[23:14](320-1:行数)、bit[13:6](5:VFPD)、bit[5:0](1:VSPW)
LCDCON3:bit[25:19](36:HBPD);bit[18:8](240-1:列数);bit[7:0](19:HFPD)
LCDCON4:bit[15:8](13:MVAL,只有当LCDCON1 bit[7]MMODE=1才有效);bit[7:0](5:HSPW)
LCDCON5:bit[11](5:6:5 Format)
3、帧缓初始化:设置帧缓冲器的起始地址、结束地址、虚拟屏
4、LCD其他杂项设置:屏蔽中断、调色板、禁止LPC3600/LCC3600模式
5、LCD开启和关闭:LCDCON1的第0位置1即可开启LCD
二、LCD显示:由于一帧中有240*320个像素点,每个像素点都有一个值(0-255),那么把每个像素点的值送到帧缓冲器中,即可实现显示功能。 如果想显示图片的话,需要把一张图片转化成数据,然后在程序中把每一个像素点送到帧缓冲器即可。
源程序:
//Main.c
/*************************************************
实验环境:mini2440开发板
完成时间:2011,4,15
作者:阿龙
实现功能:在LCD上进行显示
遇到的问题:
**************************************************/
#define GLOBAL_CLK 1
#include
#include
#include "def.h"
#include "option.h"
#include "2440addr.h"
#include "2440lib.h"
#include "2440slib.h"
#include "mmu.h"
#include "profile.h"
#include "memtest.h"
#define CLKVAL 4
#define LCD_LONG 320
#define LCD_WIDTH 240
#define LINEVAL LCD_LONG-1
#define LCD_YSIZE LCD_LONG
#define LCD_XSIZE LCD_WIDTH
#define LCD_UPPER_MARGIN 1
#define LCD_LOWER_MARGIN 5
#define LCD_VSYNC_LEN 1
#define LCD_RIGHT_MARGIN 39
#define LCD_LEFT_MARGIN 16
#define LCD_HSYNC_LEN 5
#define SCR_XSIZE LCD_XSIZE
#define SCR_YSIZE LCD_YSIZE
volatile static unsigned short LCD_BUFFER[SCR_YSIZE][SCR_XSIZE];
#define LCD_ADDR ((U32)LCD_BUFFER)
#define M5D(n) ((n)&0x1fffff)
#define PAGEWIDE LCD_WIDTH
#define OFFSIZE 0
#define LCD_RIGHT_MARGIN 39
#define LCD_LEFT_MARGIN 16
#define LCD_HSYNC_LEN 5
#define ADC_FREQ 2500000
extern unsigned char sunflower_240x320[];
/**************************************************
函数声明
***************************************************/
void delay(int times);
void LCD_init(void);
void LCD_port_init(void);
void DisM_init(void);
void FraBuf_init(void);
void MASK(void);
static void Lcd_EnvidOnOff(int num);
void TFT_LCD_Show(void);
static void Lcd_ClearScr(U16 c);
static void Pait_Bmp(int x0,int y0,int h,int l,const unsigned char *bmp);
void Set_Clk(void);
static void cal_cpu_bus_clk(void);
/**************************************************
主函数
***************************************************/
void Main(void)
{
/*时钟初始化*/
Set_Clk();
//MMU_Init(); //不能用MMU_Init()
/*LCD初始化*/
LCD_init();
/*LCD显示*/
TFT_LCD_Show();
}
void delay(int times)
{
int x,y;
for(x=times;x>0;x--)
for(y=400;y>0;y--);
}
/*********************************************************
LCD初始化
**********************************************************/
void LCD_init(void)
{
/*LCD端口初始化*/
LCD_port_init();
/*显示模式初始化*/
DisM_init();
/*LCD帧缓冲初始化*/
FraBuf_init();
/*LCD其他杂项屏蔽和处理*/
MASK();
/*LCD开启和关闭*/
Lcd_EnvidOnOff(1);
}
/**************************************************
LCD端口初始化
***************************************************/
void LCD_port_init(void)
{
rGPCCON = 0xaaaa02a8; //设置GPC为LCD模式
rGPCUP = 0xffffffff;
rGPDCON =0xaaaaaaa;
rGPCUP =0xffffffff;
}
/*********************************************************
LCD显示模式初始化
**********************************************************/
void DisM_init(void)
{
/*bit[17:8](4:CLKVAL);bit[6:5](11:TFT LCD panel);bit[4:1](1100:16 bpp for TFT)*/
rLCDCON1 = (12<<1)|(3<<5)|(CLKVAL<<8); //选择BBP(位每像素)模式、选择显示模式、决定VCLK频率
/*bit[31:24](1:VBPD);bit[23:14](320-1:行数);bit[13:6](5:VFPD);bit[5:0](1:VSPW)*/
rLCDCON2 = (LCD_UPPER_MARGIN<<24)|((LCD_YSIZE-1)<<14)|(LCD_LOWER_MARGIN<<6)|(LCD_VSYNC_LEN<<0);
/*bit[25:19](36:HBPD);bit[18:8](240-1:列数);bit[7:0](19:HFPD)*/
rLCDCON3 = (LCD_RIGHT_MARGIN <<19)|((LCD_XSIZE-1)<<8)|(LCD_LEFT_MARGIN<<0);
/*bit[15:8](13:MVAL,只有当LCDCON1 bit[7]MMODE=1才有效);bit[7:0](5:HSPW)*/
rLCDCON4 = (13<<8)|(LCD_HSYNC_LEN<<0);
/*bit[11](5:6:5 Format);bit[9](VLINE/HSYNC polarity inverted);bit[8](VFRAME/VSYNC inverted)
bit[3](Enalbe PWERN signal),bit[1](half-word swap control bit)*/
rLCDCON5 = (1<<0)|(1<<3)|(1<<8)|(1<<9)|(1<<11);
}
/*********************************************************
LCD帧缓存寄存器初始化
**********************************************************/
void FraBuf_init(void)
{
/* LCDBANK: 视频帧缓冲区内存地址30-22位。 LCDBASEU: 视频帧缓冲区的开始地址21-1位
LCDBASEL: 视频帧缓冲区的结束地址21-1位*/
/*bit[29:21]:LCDBANK,bit[20:0]:LCDBASEU*/
rLCDSADDR1 = ((LCD_ADDR>>22)<<21)|((M5D(LCD_ADDR>>1))<<0);
/*bit[20:0]:LCDBASEL*/
rLCDSADDR2 = M5D((LCD_ADDR+LCD_WIDTH * LCD_LONG * 2)>>1);
/*PAGEWIDTH:虚拟屏幕一行的字节数,如果不使用虚拟屏幕,设置为实际屏幕的行字节数
OFFSIZE:虚拟屏幕左侧偏移的字节数,如果不使用虚拟屏幕,设置为*/
/*bit[21:11]:OFFSIZE; bit[10:0]:PAGEWIDTH*/
rLCDSADDR3 = LCD_WIDTH;
}
/*********************************************************
对LCD其他的一些屏蔽和处理
**********************************************************/
void MASK(void)
{
/*屏蔽中断*/
rLCDINTMSK |= 3;
rTCONSEL &= (~7);
/*disable调色板*/
rTPAL = 0x0;
/*禁止LPC3600/LCC3600模式*/
rTCONSEL &= ~((1<<4) | 1);
}
/*********************************************************
LCD的开启与关闭函数
**********************************************************/
static void Lcd_EnvidOnOff(int onoff)
{
if(onoff==1)
rLCDCON1|=1; // ENVID=ON
else
rLCDCON1 =rLCDCON1 & 0x3fffe; // ENVID Off
}
/*********************************************************
LCD显示函数
**********************************************************/
void TFT_LCD_Show(void)
{
/*红(255:0:0);绿(0:255:0);蓝(0:0:255);黑(0:0:0);白(255,255,255)*/
/*在屏幕上显示三基色*/
Lcd_ClearScr( (0x00<<11) | (0x00<<5) | (0x00) ) ; //clear screen black
delay(10000);
Lcd_ClearScr((0x1f<<11) | (0x00<<5) | (0x00)); //red
delay(10000);
Lcd_ClearScr((0x00<<11) | (0x3f<<5) | (0x00)); //green
delay(10000);
Lcd_ClearScr((0x00<<11) | (0x00<<5) | (0x1f)); //blue
delay(10000);
Lcd_ClearScr( (0x1f<<11) | (0x3f<<5) | (0x1f) ) ; //clear screen white
delay(10000);
/*显示一副图片在屏幕上*/
Pait_Bmp(0, 0, 240, 320, sunflower_240x320);
}
/*********************************************************
LCD全屏填充颜色函数
**********************************************************/
static void Lcd_ClearScr(U16 c)
{
unsigned int x,y;
for(y=0;y
for(x=0;x
{
LCD_BUFFER[y][x]=c; //把得到的值送到缓冲器中即可显示颜色
}
}
/*在屏幕上显示图片*/
static void Pait_Bmp(int x0,int y0,int h,int l,const unsigned char *bmp)
{
int x,y;
U32 c;
int p = 0;
for( y = 0 ; y < l ; y++ )
{
for( x = 0 ; x < h ; x++ )
{
c = bmp[p+1] | (bmp[p]<<8) ;
if ( ( (x0+x) < SCR_XSIZE) && ( (y0+y) < SCR_YSIZE) )
LCD_BUFFER[y0+y][x0+x] = c ;
p=p+2;
}
}
}
/*************************************************
时钟频率设置
**************************************************/
void Set_Clk(void)
{
int i;
U8 key;
U32 mpll_val = 0 ;
i = 2 ; //don't use 100M!
//boot_params.cpu_clk.val = 3;
switch ( i ) {
case 0: //200
key = 12;
mpll_val = (92<<12)|(4<<4)|(1);
break;
case 1: //300
key = 13;
mpll_val = (67<<12)|(1<<4)|(1);
break;
case 2: //400
key = 14;
mpll_val = (92<<12)|(1<<4)|(1);
break;
case 3: //440!!!
key = 14;
mpll_val = (102<<12)|(1<<4)|(1);
break;
default:
key = 14;
mpll_val = (92<<12)|(1<<4)|(1);
break;
}
//init FCLK=400M, so change MPLL first
ChangeMPllValue((mpll_val>>12)&0xff, (mpll_val>>4)&0x3f, mpll_val&3); //set the register--rMPLLCON
ChangeClockDivider(key, 12); //the result of rCLKDIVN [0:1:0:1] 3-0 bit
cal_cpu_bus_clk(); //HCLK=100M PCLK=50M
}
/*************************************************
**************************************************/
static void cal_cpu_bus_clk(void)
{
static U32 cpu_freq;
static U32 UPLL;
U32 val;
U8 m, p, s;
val = rMPLLCON;
m = (val>>12)&0xff;
p = (val>>4)&0x3f;
s = val&3;
//(m+8)*FIN*2 不要超出32位数!
FCLK = ((m+8)*(FIN/100)*2)/((p+2)*(1<
val = rCLKDIVN;
m = (val>>1)&3;
p = val&1;
val = rCAMDIVN;
s = val>>8;
switch (m) {
case 0:
HCLK = FCLK;
break;
case 1:
HCLK = FCLK>>1;
break;
case 2:
if(s&2)
HCLK = FCLK>>3;
else
HCLK = FCLK>>2;
break;
case 3:
if(s&1)
HCLK = FCLK/6;
else
HCLK = FCLK/3;
break;
}
if(p)
PCLK = HCLK>>1;
else
PCLK = HCLK;
if(s&0x10)
cpu_freq = HCLK;
else
cpu_freq = FCLK;
val = rUPLLCON;
m = (val>>12)&0xff;
p = (val>>4)&0x3f;
s = val&3;
UPLL = ((m+8)*FIN)/((p+2)*(1<
UCLK = (rCLKDIVN&8)?(UPLL>>1):UPLL;
本回答由网友推荐
已赞过
已踩过<
你对这个回答的评价是?
评论
收起
arm开发板放张图片动起来_ARM裸机不能正确显示图片的问题相关推荐
- arm开发板放张图片动起来_如何看待第三届集成电路创新创业大赛arm杯北理在杯赛中居然可以在0.35s内播放完20张ppt?...
感觉这比赛国赛比初赛还水,完全保密不说,作品不用检查的,明确看到有几个用了超规格的板子,显示用VGA或HDMI显示,也不检查ARM内核是否有移植进去,移植里是不是按在比赛要求有识别算法.就志愿者过来很 ...
- 嵌入式开发入门之经典 ARM开发板
嵌入式开发入门之经典 开始进入嵌入式世界,真是一头雾水,不知道如何入手!也不知道该如何学习,学习什么,最近从网上转载这篇文章,对我启发很大,对于初始进入嵌入式的人们很有帮组,好多嵌入式大侠都说这是入门 ...
- arm开发板移植ALSA库与ALSA工具
目录 首先我们需要下载两个所要用到的库文件(基于Ubuntu) 一:先配置ALSA库文件 1.先解压放到家目录下ALSA的源文件: 2.解压后进去解压得到的文件夹执行以下命令: 3.配置好以后执行 二 ...
- RV1109开发板ssh服务器移植到arm开发板
RV1109开发板ssh服务器移植到arm开发板 ssh功能移植到RV1109开发板的,由于RV1109的SDK中,没有telnet功能,有时候adb功能在量产中需要关闭,避免造成设备留有漏洞,造成安 ...
- Firefly AIO-3399ProC ARM开发板环境配置过程
一.硬件条件 Firefly AIO-3399ProC + Ubuntu18.04官方固件(5.11号) 二.修改python版本(选做) 讲一下我需要修改Python版本的原因,如果读者不需要的话, ...
- Friendly ARM开发板安装Linux系统教程
友善之臂ARM9开发板安装Linux系统教程 前言:智能蘑菇房项目的运行环境是友善之臂ARM9开发板,所以需要在上面灌一个linux系统,下面我来简单介绍一下. 准备 读卡器 SD卡 串口线一根(US ...
- 中国嵌入式高端ARM开发板的江湖故事——详细分析国内各家ARM11 S3C6410 开发板的选型以及竞争格局
// Topic:中国嵌入式高端ARM开发板的江湖故事--详细分析国内各家ARM11 S3C6410 开发板的选型以及竞争格局 //作者:gooogleman //版权:gooogleman 邮箱 ...
- 中国嵌入式高端ARM开发板的江湖故事 详细分析国内各家ARM11 S3C6410 开发板的选型以及竞争格局
分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! // T ...
- 摄像头在liunx上的QT显示和OK6410 ARM开发板上的使用
摄像头在liunx上的QT显示和OK6410 ARM开发板上的使用 发布者:旺旺雪饼 时间:2013-01-05 16:56:09 环境: Ubuntu10.04 arm linux OS: 3. ...
最新文章
- Android中View绘制流程以及invalidate()等相关方法分析
- Carbon和Polacode教程
- Java修炼之路——基础篇——数据类型
- ASP.NET MVC呼叫WCF Service的方法
- Java虚拟机(一)——内存管理
- 2. Anaconda下使用Pip或者conda安装库指南
- 基于随机优化算法的特征选择
- linux操作系统死机处理办法
- C++string基本概念
- PHP带头大哥的百宝囊!
- uniapp使用colorUI 组件
- fiddler+xpose_JustTrustMe: 解决app应用在开启抓包工具后无法联网问题
- Liunx 切换用户This account is currently not available
- python提取图片中的文字自动填表,python提取图片中的文字并生成word文档
- Unity多屏幕设置细节
- web前端开发技术期末考试_Web前端开发技术期末试题1
- 微信 语音转文字 java,微信语音转文字怎么操作?手把手教你,一秒钟搞定!
- 【郭东白架构课 模块二:创造价值】17|通用技能(下):架构师如何保障交付与沉淀知识?
- 工作居住证离职后应对
- 使用vue.js实现一款简易计算器可多则混合运算(加减乘除)
热门文章
- 数据挖掘Apriori算法
- linux内核 header.s,Linux启动代码header.S研究
- linux使用grep数字个数,51CTO博客-专业IT技术博客创作平台-技术成就梦想
- 四边形可以分为几类_学习知识:四边形有几种类型
- mysql keepalived主主同步_KEEPALIVED+MYSQL主主同步=MYSQL高可用(HA)集群
- 猫狗识别——PyTorch
- 【DP】[ZJOI2008][HYSBZ/BZOJ1037]生日聚会Party
- darwin转发时,摄像机在3G和4G模式下的参数设置
- C#中动态加载和卸载DLL
- 使用DOS命令找到占用80端口的程序,关闭该程序