实验九--裸机LCD

发布者:知识阁楼最新更新时间:2023-06-09 来源: elecfans关键字:jz2440  编译器 手机看文章 扫描二维码
随时随地手机看文章

一。环境


  系统:ubuntu12.04


  开发板:jz2440


  编译器:gcc


二。说明


    有空补上


三。代码


 Makefile:


 1 CC      = arm-linux-gcc

 2 LD      = arm-linux-ld

 3 AR      = arm-linux-ar

 4 OBJCOPY = arm-linux-objcopy

 5 OBJDUMP = arm-linux-objdump

 6 

 7 CFLAGS         := -Wall -O2

 8 

 9 

10 export     CC LD AR OBJCOPY OBJDUMP CFLAGS

11 

12 objs := head.o init.o nand.o lcddrv.o framebuffer.o main.o

13 

14 lcd.bin: $(objs)

15     ${LD} -Tlcd.lds -o lcd_elf $^

16     ${OBJCOPY} -O binary -S lcd_elf $@

17     ${OBJDUMP} -D -m arm lcd_elf > lcd.dis

18 

19 

20 %.o:%.c

21     ${CC} $(CFLAGS) -c -o $@ $<

22 

23 %.o:%.S

24     ${CC} $(CFLAGS) -c -o $@ $<

25 

26 clean:

27     rm -f lcd.bin lcd_elf lcd.dis *.o

28     


head.S:


 1 @******************************************************************************

 2 @ File: head.S

 3 @ 功能: 设置SDRAM,将程序复制到SDRAM,然后跳到SDRAM继续执行

 4 @******************************************************************************       

 5    

 6 .extern     main

 7 .text 

 8 .global _start 

 9 _start:

10 @******************************************************************************       

11 @ 中断向量,本程序中,除Reset和HandleIRQ外,其它异常都没有使用

12 @******************************************************************************       

13     b   Reset

14 

15 @ 0x04: 未定义指令中止模式的向量地址

16 HandleUndef:

17     b   HandleUndef 

18  

19 @ 0x08: 管理模式的向量地址,通过SWI指令进入此模式

20 HandleSWI:

21     b   HandleSWI

22 

23 @ 0x0c: 指令预取终止导致的异常的向量地址

24 HandlePrefetchAbort:

25     b   HandlePrefetchAbort

26 

27 @ 0x10: 数据访问终止导致的异常的向量地址

28 HandleDataAbort:

29     b   HandleDataAbort

30 

31 @ 0x14: 保留

32 HandleNotUsed:

33     b   HandleNotUsed

34 

35 @ 0x18: 中断模式的向量地址

36 HandleIRQ:

37     b   HandleIRQ

38 

39 @ 0x1c: 快中断模式的向量地址

40 HandleFIQ:

41     b   HandleFIQ

42 

43 Reset:                  

44     ldr sp, =4096           @ 设置栈指针,以下都是C函数,调用前需要设好栈

45     bl  disable_watch_dog   @ 关闭WATCHDOG,否则CPU会不断重启

46     bl  clock_init          @ 设置MPLL,改变FCLK、HCLK、PCLK

47     bl  memsetup            @ 设置存储控制器以使用SDRAM

48     bl  nand_init           @ 初始化NAND Flash

49     

50                             @ 复制代码到SDRAM中

51     ldr r0, =0x30000000     @ 1. 目标地址 = 0x30000000,这是SDRAM的起始地址

52     mov r1, #4096           @ 2. 源地址   = 4096,运行地址在SDRAM中的代码保存在NAND Flash 4096地址开始处

53     mov r2, #16*1024        @ 3. 复制长度 = 16K,对于本实验,这是足够了

54     bl  CopyCode2SDRAM      @ 调用C函数CopyCode2SDRAM

55     

56     bl  clean_bss           @ 清除bss段,未初始化或初值为0的全局/静态变量保存在bss段

57 

58 

59 

60     msr cpsr_c, #0xdf       @ 进入系统模式

61     ldr sp, =0x34000000     @ 设置系统模式栈指针,

62 

63 

64 

65     ldr lr, =halt_loop      @ 设置返回地址

66     ldr pc, =main           @ 调用main函数

67 halt_loop:

68     b   halt_loop


上面的sdram,时钟,nand flash等同前面的,不贴出来了


现在与lcd有关的函数:


main.c:


 1 #include "lcddrv.h"

 2 #include "framebuffer.h"

 3 #include "s3c24xx.h"

 4 

 5 void delay()

 6 

 7 {

 8 

 9 unsigned long cnt;

10 

11 for(cnt=0;cnt<100000;cnt++);

12 

13 }

14 

15 int main()

16 {

17     Lcd_Port_Init();                     // 设置LCD引脚

18     Tft_Lcd_Init(); // 初始化LCD控制器

19     Lcd_PowerEnable(0, 1);               // 设置LCD_PWREN有效,它用于打开LCD的电源

20     Lcd_EnvidOnOff(1);                   // 使能LCD控制器输出信号

21 

22     ClearScr(0x0);  // 清屏,黑色

23     while (1)

24     {           

25            

26         Mire();  

27     delay(); 

28         //Lcd_EnvidOnOff(0);

29  

30     }

31     

32     return 0;

33 }


由main函数可以看出,本程序只是驱动lcd来画同心圆,参考代码是韦东山先生的,此处作了较大的删改:


framebuffer.c:


 1 /*

 2  * FILE: framebuffer.c

 3  * 实现在framebuffer上画点、画线、画同心圆、清屏的函数

 4  */

 5 

 6 #include "framebuffer.h"

 7 

 8 extern unsigned int fb_base_addr;

 9 extern unsigned int bpp;

10 extern unsigned int xsize;

11 extern unsigned int ysize;

12 

13 /* 

14  * 画点

15  * 输入参数:

16  *     x、y : 象素坐标

17  *     color: 颜色值

18  *         对于16BPP: color的格式为0xAARRGGBB (AA = 透明度),

19  *     需要转换为5:6:5格式

20  *         对于8BPP: color为调色板中的索引值,

21  *     其颜色取决于调色板中的数值

22  */

23 void PutPixel(unsigned int x, unsigned int y, unsigned int color)

24 {

25     unsigned char red,green,blue;

26 

27     switch (bpp){

28         case 16:

29         {

30             unsigned short *addr = (unsigned short *)fb_base_addr + (y * xsize + x);

31             red   = (color >> 19) & 0x1f;

32             green = (color >> 10) & 0x3f;

33             blue  = (color >>  3) & 0x1f;

34             color = (red << 11) | (green << 5) | blue; // 格式5:6:5

35             *addr = (unsigned short) color;

36             break;

37         }

38  

39 

40         default:

41             break;

42     }

43 }

44 

45 /* 

46  * 绘制同心圆

47  */

48 void Mire(void)

49 {

50     unsigned int x,y;

51     unsigned int color;

52     unsigned char red,green,blue,alpha;

53 

54     for (y = 0; y < ysize; y++)

55         for (x = 0; x < xsize; x++){

56             color = ((x-xsize/2)*(x-xsize/2) + (y-ysize/2)*(y-ysize/2))/64;

57             red   = (color/8) % 256;

58             green = (color/4) % 256;

59             blue  = (color/2) % 256;

60             alpha = (color*2) % 256;

61 

62             color |= ((unsigned int)alpha << 24);

63             color |= ((unsigned int)red   << 16);

64             color |= ((unsigned int)green << 8 );

65             color |= ((unsigned int)blue       );

66 

67             PutPixel(x,y,color);

68         }

69 }

70 

71 /* 

72  * 将屏幕清成单色

73  * 输入参数:

74  *     color: 颜色值

75  *         对于16BPP: color的格式为0xAARRGGBB (AA = 透明度),

76  *     需要转换为5:6:5格式

77  *         对于8BPP: color为调色板中的索引值,

78  *     其颜色取决于调色板中的数值

79  */

80 void ClearScr(unsigned int color)

81 {   

82     unsigned int x,y;

83     

84     for (y = 0; y < ysize; y++)

85         for (x = 0; x < xsize; x++)

86             PutPixel(x, y, color);

87 }


lcddrv.c:


  1 /*

  2  * FILE: lcddrv.c

  3  * 提供操作LCD控制器、调色板等的底层函数

  4  */

  5 

  6 #include "s3c24xx.h"

  7 #include "lcddrv.h"

  8 

  9 #define GPB0_tout0  (2<<(0*2))

 10 #define GPB0_out    (1<<(0*2))

 11 #define GPB1_out    (1<<(1*2))

 12 

 13 #define GPB0_MSK    (3<<(0*2))

 14 #define GPB1_MSK    (3<<(1*2))

 15 

 16 

 17 unsigned int fb_base_addr;

 18 unsigned int bpp;

 19 unsigned int xsize;

 20 unsigned int ysize;

 21 

 22 

 23 /*

 24  * 初始化用于LCD的引脚

 25  */

 26 void Lcd_Port_Init(void)

 27 {

 28     GPCUP   = 0xffffffff;   // 禁止内部上拉

 29     GPCCON  = 0xaaaaaaaa;   // GPIO管脚用于VD[7:0],LCDVF[2:0],VM,VFRAME,VLINE,VCLK,LEND 

 30     GPDUP   = 0xffffffff;   // 禁止内部上拉

[1] [2]
关键字:jz2440  编译器 引用地址:实验九--裸机LCD

上一篇:U-Boot--配置过程分析
下一篇:实验八--uart

推荐阅读最新更新时间:2024-11-13 10:19

LCD驱动程序(一)
LCD显示原理: 在JZ2440上,想要让LCD显示,需要几个部分1、LCD硬件 2、开发板上的LCD控制器 3、SDRAM内存存放数据FramBuffer 4、可能还需要一个调色板(实际上是一块内存,里面数据可以组成各种颜色) 显示原理:在开发板上操作LCD控制器,使得开发板向SDRAM内存里去除数据发送通过LCD数据引脚发送到LCD屏上。 具体硬件操作步骤: 1、LCD引脚的连接,根据LCD原理图配置引脚 2、根据LCD控制器手册设置LCD控制器 3、分配显存,并把地址告诉LCD控制器 需要调色板的情况:LCD数据线少,比如16位数据线无法显示完全部的颜色组成,只能当做一个索引作用,指向调色板上正真的地址颜色空间 LC
[单片机]
<font color='red'>LCD</font>驱动程序(一)
实验七--时钟
一。平台   系统:ubuntu12.04   开发板:jz2440   编译器:gcc 二。时钟系统 后补上 三。代码 Makefile: 1 objs := head.o init.o interrupt.o main.o 2 3 timer.bin: $(objs) 4 arm-linux-ld -Ttimer.lds -o timer_linux $^ 5 arm-linux-objcopy -O binary -S timer_linux $@ 6 arm-linux-objdump -D -m arm timer_linux timer.dis 7 8
[单片机]
jz2440裸机开发与分析:串口编程3之printf解析
测试代码: #include stdio.h void printf_test(void) { printf( hello wordn ); printf( This is www.100ask.org my_printf testn ) ; printf( test char =%c,%cn , 'A','a') ; printf( test decimal number =%dn , 123456) ; printf( test decimal number =%dn , -123456) ; printf( test hex number =0x%
[单片机]
Jlink烧写JZ2440的Nor Flash
一、需要Jlink烧写Nor Flash。 这只能在windows下操作。 a.开发板设置为Nor Flash启动,连接电脑,上电。 b.启动j-flash。J-flash操作如下: 在J-Flash里操作: 1.选择菜单“File - Open - Open Project…”,打开附件里的s3c2440.jflash。 图 打开S3C2440工程 2.选择菜单“Target - Connect” 图 连接开发板 3. 选择菜单“File - Open”,打开要烧写的二进制文件,比如u-boot.bin,并且在“Start address”里输入0。 图 打开bin文件 4. 选择菜单“
[单片机]
Jlink烧写<font color='red'>JZ2440</font>的Nor Flash
pic18 configuration settings---MCC编译器
//----------------------------------------------- // PIC18 MCC PIC18F6622 CONFIG BITS 1=OFF //CONFIG1H 禁止振荡器切换,禁止故障保护时钟,HS振荡器 //CONFIG2L 欠压复位电压最大值,禁止欠压复位,禁止上电延时 //CONFIG2H 关看门狗及喂狗时间  //CONFIG3H 使能MCLR,高功耗TIMER1,CCP2与RC1复用 //CONFIG4L 后台调试关,扩展指令开,BOOT引导区2K,使能单电源,堆栈溢出复位 //CONFIG5L BLOCK0-3代码不保护 //CONFIG5H
[单片机]
MINI2440裸机实验之LCD
硬件部分 上诉文章中使用的LCD都是常规液晶显示器,但在查看原理图及液晶数据手册时发现我使用的MINI2440开发板上自带的液晶跟文中的液晶并不一致,区别主要体现在只有DE、CLK和RGB引脚,该液晶型号为TD35-TD035STEB2,其时序图如下。 从时序图中可以看出,DE为该液晶屏的主要控制引脚,通过控制DE引脚的下拉就可以控制液晶屏的刷新,但有一个问题就是如何使用s3c2440的LCD控制器来控制该液晶屏呢? 这里我进行了这样的尝试,认为上图中的Tvdisp = LINEVAL +1 ;Tvblank = VSPW+1+VBPD+1;VFPD+1 = 0;Thdisp = HOZVAL+1; Thbla
[单片机]
MINI2440<font color='red'>裸机</font>实验之<font color='red'>LCD</font>
51单片机的延时函数
一.巧用汇编 #include “intrins” void delayus() { _nop_(); } 二.利用for 、while 、do..while等方式 对于这种方式必须采用 仿真的形式确定其延时 时间(编译器keil等软件) 三.常用延时 延时1us void delay(unsigned char xms) { unsigned char i,j; for (i=xms;i 0;i--) for(j=110;j 0;j--); }
[单片机]
jz2440裸机开发与分析:串口编程2
、 UART0初始化 初始化配置内容:波特率(115200);8bit数据位;1bit停止位;无奇偶校验位;无流控制 uart.c: void uart0_init() { /*配置GPH2,3为TXD,RXD,并且将这两个引脚内部拉高*/ /*GPHCON(0x56000070)*/ /*GPHUP(0x56000078)*/ GPHCON &= ~((0x3 4) | (0x3 6)); // 置零 GPHCON |= ((0x2 4) | (0x2 6)); GPHUP &= ~((0x1 2) | (0x1 3));// 置零 /*设置波特率115200*/ /*UBR
[单片机]
<font color='red'>jz2440</font><font color='red'>裸机</font>开发与分析:串口编程2
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
更多往期活动

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved