S3C2440 点灯

2024-06-14 05:18
文章标签 点灯 s3c2440

本文主要是介绍S3C2440 点灯,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

点亮开发板上的led灯,需先查看原理图,找到对应引脚,以及搞清楚原理图,如何电路上灯会亮。

1、看原理图 JZ2440v2_sch.pdf 找到对应的引脚  nLED_1 对应 GPF4nLED_2 对应 GPF5nLED_4 对应 GPF6
2、看芯片手册 S3C2440A_UserManual_Rev13.pdf 设置对应 I/O 寄存器CPFCON   控制寄存器GPFCON   数据寄存器将引脚对应控制寄存器设置为输出,数据寄存器设置为0(表示输出低电平),即可点亮对应LED灯

汇编点亮nLED_1代码如下:

.global _start
_start:LDR				R0,=0x56000050 	@ R0设为 GPFCON 寄存器@ 此寄存器用于选择端口各引脚的功能@ 是输出、输入还是其他MOV				R1,#0x00000100 	STR				R1,[R0]					@ 设置 GPF4 为输出口, 位[9:8] = 01LDR				R0,=0x56000054	@ R0设为 GPFDAT 寄存器@ 用于读/写端口引脚的数据MOV       R1,#0x00000000  @ 将此值改为 0x00000010 可让LED熄灭STR				R1,[R0]					@ GPF4 输出0,点亮LED1
MAIN_LOOP:B					MAIN_LOOP


在使用C语言写裸机程序时,需要自己编写启动文件。(常规程序中,启动文件是由操作系统完成的,而逻辑中没有操作系统)启动文件的功能是初始化堆栈,调用 main 函数, 当 main 函数执行完返回时,做清理工作。

启动文件至少包含:

软件初始化:1、设置栈:所谓设置栈就是将 栈指针(sp=>)指向内存,当内存为 片内的SRAM时,可以直接使用,而为SDRAM时,需要先初始化。2、设置返回地址。3、调用 main 函数。4、清理工作。(一般用来回收资源等)
硬件的初始化:1、关闭看门狗。当 2440 启动时,看门狗就会倒计时,如果3秒内没有关闭它,它就会重启开发板。2、初始化时钟。2440 最快可以跑到 400 Mhz。但是上电的时候时钟频率只有 12 Mhz。3、初始化SDRAM。
启动文件内容:

@******************************************************************************
@ File:crt0.S
@	功能: 启动文件(通过它转入C程序)
@******************************************************************************.text
.global _start
_start:ldr 	r0, =0x53000000		@ WATCHDOG 寄存器地址mov 	r1, #0x0		str		r1, [r0]					@ 向watchdog寄存器写入0,禁止watchdog。否则cpu不断重启。ldr   sp, =1024*4				@ 设置堆栈,注意:不能大于4K,因为现在可用的内存只有4K@ nand flash 中的代码在复位后会移动到内部ram中,此ram 只有4Kbl		main							@ 调用C程序中的main函数
halt_loop:b     halt_loop 



C语言点亮 nLED_1 (实现汇编同样的功能)源码:

#define GPFCON		(*(volatile unsigned long *)0x56000050)
#define GPFDAT		(*(volatile unsigned long *)0x56000054)int main(int argc,char **argv){GPFCON |= (1 << 8);	// 设置GPF4为输出口, 位 [9:8] = 01GPFDAT &= (0 << 4); // GPF4输出0,点亮LEDreturn 0;
}


C语言写一个流水灯

#define GPFCON	(*(volatile unsigned long *)0x56000050)
#define GPFDAT	(*(volatile unsigned long *)0x56000054)#define CPF4_OUT	(1 << 8)
#define CPF5_OUT 	(1 << 10)
#define CPF6_OUT  (1 << 12)void delay_time(unsigned int sec){for(;sec > 0; sec--);
}int main(int argc, char **argv){GPFCON = CPF4_OUT | CPF5_OUT | CPF6_OUT;unsigned int i = 0;while(1){delay_time(4000);GPFDAT = (~(i << 4));if(++i == 8)i = 0;}return 0;
}

C语言写一个按键控制灯

与点灯原理一样,只是多了一部分(需要判断按键是否按下)。那么需要查看原理图,找到按键对应的引脚,以及如何判断按键按下还是松开。需要设置哪些寄存器。

1、查看原理图 JZ2440v2_sch 找到按键对应的引脚s2 对应 GPF0s3 对应 GPF2s4 对应 GPG3
2、看芯片手册 S3C2440A_UserManual_Rev13.pdf 设置对应 I/O 寄存器GPFCON   控制寄存器GPFCON   数据寄存器GPGCON	 控制寄存器GPGDAT   数据寄存器将引脚对应控制寄存器设置为输入,读取数据寄存器的值,为0(表示接通低电平),即相应按键被按下,点亮需要控制的led,检测到1,说明松开按键,熄灭要控制的led。

源码:

#define GPFCON 		(*(volatile unsigned long *)0x56000050)
#define GPFDAT		(*(volatile unsigned long *)0x56000054)#define GPGCON		(*(volatile unsigned long *)0x56000060)
#define GPGDAT		(*(volatile unsigned long *)0x56000064)//将 led 对应的引脚设置为 输出
#define GPF4_OUT	(1 << 8)
#define GPF5_OUT	(1 << 10)
#define GPF6_OUT	(1 << 12)
//led 控制寄存器掩码
#define GPF4_MASK	(3 << 8) 
#define GPF5_MASK	(3 << 10)
#define GPF6_MASK	(3 << 12)
//将 按键对应的引脚设置为 输入
#define GPF0_IN		(0 << 0)
#define GPF2_IN		(0 << 4)
#define GPG3_IN		(0 << 6)
//按键控制寄存器掩码
#define GPF0_MASK	(3 << 0)
#define GPF2_MASK (3 << 4)
#define GPG3_MASK	(3 << 6)int main(int argc, char **argv){GPFCON &= ~(GPF0_MASK | GPF2_MASK | GPF4_MASK | GPF5_MASK | GPF6_MASK);GPFCON |= (GPF4_OUT | GPF5_OUT | GPF6_OUT | GPF0_IN | GPF2_IN);GPGCON &= ~GPG3_MASK;GPGCON |= GPG3_IN;unsigned long dwDat;while(1){//取出数据寄存器的值,判断响应数据位为 1 还是 0 ,0点亮对应LEDdwDat = GPFDAT;if (dwDat & 1)GPFDAT |= (1 << 4);elseGPFDAT &= ~(1 << 4);if (dwDat & (1 << 2))GPFDAT |= (1 << 5);elseGPFDAT &= ~(1 << 5);dwDat = GPGDAT;if (dwDat & (1 << 3))GPFDAT |= (1 << 6);elseGPFDAT &= ~(1 << 6);}return 0;
}

以上C语言,在编译的时候需要和启动文件一起编译。下面是最后一个程序为例子的简单Makefile。

key_led.bin : crt0.S key_led.carm-linux-gcc -g -c -o crt0.o crt0.Sarm-linux-gcc -g -c -o key_led.o key_led.carm-linux-ld -Ttext 0x00000000 -g crt0.o key_led.o -o key_led_elfarm-linux-objcopy -O binary -S key_led_elf key_led.bin
clean:rm -f key_led.bin key_led_elf *.o















这篇关于S3C2440 点灯的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1059476

相关文章

s3c2440---中断控制器

一、概述 S3C2440A 中的中断控制器接受来自 60 个中断源的请求。提供这些中断源的是内部外设,如 DMA 控制器、 UART、IIC 等等。 在这些中断源中,UARTn、AC97 和 EINTn 中断对于中断控制器而言是“或”关系。 当从内部外设和外部中断请求引脚收到多个中断请求时,中断控制器在仲裁步骤后请求 ARM920T 内核的 FIQ 或 IRQ。 仲裁步骤由硬件优先级逻辑决定

s3c2440---PWM使用之蜂鸣器驱动移植

一、蜂鸣器驱动介绍 1.1.什么是蜂鸣器               蜂鸣器是一种简单的声响发生器,常用于电子产品中作为警示或提醒作用。其基本原理是通过交替改变直流电的电压方向来产生声音,一般使用交替电流产生声音会比较稳定。 1.2.蜂鸣器的类别 1.有源蜂鸣器 1)结构原理 有源蜂鸣器内部自带振荡源,只需接通电源即可发声。内部电路会自动产生一定频率的振荡信号,从而驱动蜂鸣器发声。

嵌入式S3C2440:控制LED灯

发光二极管接口(左端)应为低电平   以LED1为例 LED1的接口为GPB5 void led_init(void){//配置GPB5功能为输出GPBCON &= ~(0x3 << 10);GPBCON |= (0x1 << 10); //使GPB5输出高电平(关灯)GPBDAT |= (1 << 5);}void led_on(void){GPBDAT &= ~(1 <

S3C2440芯片手册词汇

2016年4月26日 small die size​ Instruction Interface  界面、接口   Touch Screen Interface, Camerainterface, IIC-BUS Interface。 a memory complier  存储器单元 CMOS standard cells  CMOS 标准宏单元 adopt 采用 arc

【GD32】---- 移植工程模板及点灯测试

1 新建模板文件夹 新建一个名叫03_GD32TemplateProject的文件夹,用于建造工程模板 2 移植官方库文件 在模板文件夹里新建5个文件夹,分别存放官方库文件和系统驱动文件 01_main 存放main函数 02_Startup 存放系统启动文件 03_System 存放官方的系统文件 04_Firmware_PeripheralDriver 存放官方

S3C2440裸机------NandFlash编程_擦除与烧写

目录 1.擦除 2.烧写 1.擦除 NandFlash是以块为单位进行擦除的,一个块是128K,从上面的时序图我们可以看到,首先我们要发出60命令,然后发出三个行地址,然后发送D0H,然后等待擦除结束。 int nand_erase(unsigned int addr, unsigned int len){int page = addr / 2048;if (addr & (0

S3C2440裸机------NandFlash编程_芯片id读取

目录 1.芯片id读取时序图  2.使能芯片 3.发送命令函数 4.发送地址函数 5.读数据函数  6.完整代码 1.芯片id读取时序图 我们先看一下NandFlash芯片手册中读取id的时序图,后面我们要根据这个时序图去写代码。  2.使能芯片 从前面的时序图我们可以看出,我们首先要发出片选信号,我们通过设置下图寄存器的Reg_nCE位来进行设置, void n

S3C2440裸机------NandFlash编程_时序及初始化

目录 1.NandFlash初始化  2.NandFlash控制器使能  3.代码 1.NandFlash初始化  Nandflash初始化主要包括时序图的设置和Nandflash控制器的使能,我们首先看一下S3C2440芯片手册里面的时序图。 上图中的HCLK我们已经设置成了100M。那么时钟周期是1/100M=10ns  然后下图是NandFlash芯片手册里面的时序

S3C2440裸机------NandFlash操作原理

目录 1.Nandflash操作原理 2.用UBOOT来体验NAND FLASH的操作 1.Nandflash操作原理 下图是原理图中NandFlash和S3C2440的连接图, 问1. 原理图上NAND FLASH和S3C2440之间只有数据线,      怎么传输地址? 答1.在DATA0~DATA7上既传输数据,又传输地址      当ALE为高电平时传输的是地址, 问2

S3C2440裸机------Nor Flash编程_擦写读

目录 1.读NorFlash 2.擦除Nroflash 3.写NorFlash 4.完整代码 1.读NorFlash 我们首先来实现读flash的函数,我们默认每次读取64个字节,然后我们把读取到的内容打印出来,其中前面打印数值,后面打印字符,对于不可见字符用...代替。 void do_read_nor_flash(void){unsigned int addr;volati