S3C2440 点灯

发布者:闪耀之星最新更新时间:2022-06-27 来源: eefocus关键字:S3C2440  点灯  寄存器 手机看文章 扫描二维码
随时随地手机看文章

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


1、看原理图 JZ2440v2_sch.pdf 找到对应的引脚  

nLED_1 对应 GPF4

nLED_2 对应 GPF5

nLED_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] = 01

LDR 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 只有4K

bl 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] = 01

GPFDAT &= (0 << 4); // GPF4输出0,点亮LED

return 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 对应 GPF0

s3 对应 GPF2

s4 对应 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点亮对应LED

dwDat = GPFDAT;

if (dwDat & 1)

GPFDAT |= (1 << 4);

else

GPFDAT &= ~(1 << 4);

if (dwDat & (1 << 2))

GPFDAT |= (1 << 5);

else

GPFDAT &= ~(1 << 5);

dwDat = GPGDAT;

if (dwDat & (1 << 3))

GPFDAT |= (1 << 6);

else

GPFDAT &= ~(1 << 6);

}

 

return 0;

}


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


key_led.bin : crt0.S key_led.c

arm-linux-gcc -g -c -o crt0.o crt0.S

arm-linux-gcc -g -c -o key_led.o key_led.c

arm-linux-ld -Ttext 0x00000000 -g crt0.o key_led.o -o key_led_elf

arm-linux-objcopy -O binary -S key_led_elf key_led.bin

clean:

rm -f key_led.bin key_led_elf *.o

关键字:S3C2440  点灯  寄存器 引用地址:S3C2440 点灯

上一篇:S3C2440 中断控制寄存器
下一篇:内存管理单元 MMU

推荐阅读最新更新时间:2024-11-17 06:15

S3C2440 ADC(模/数转换器)
  A/D转换,又称为模/数转换,是将模拟量信号转换为计算机能够处理的数字信号。S3C2440集成了8通道10位CMOS A/D转换器,最大转换率为2.5MHz A/D转换器时钟下的500KSPS。A/D转换器支持片上采样-保持功能和掉电模式的操作。   有如下特性:   分辨率:10位   差分线性误差:±1.0LSB   积分线性误差:±2.0LSB   最大转换率:500KSPS   功耗低   供电电压:3.3V   模拟输入范围:0~3.3V   片上采样-保持功能   普通转换模式   分离的X/Y方向转换模式   自动(顺序)X/Y方向转换模式   等待中断模式   对于s3c2440来说,实现A/D转换比较简单
[单片机]
<font color='red'>S3C2440</font> ADC(模/数转换器)
嵌入式驱动学习之GPIO驱动
开发环境 主机开发环境:ubuntu12.04 BootLoader:u-boot-1.1.6 kernel:linux-2.6.30.4 CPU:s3c2440 开发板:TQ2440 开发步骤 1、硬件分析 在天嵌科技提供的开发板中 4 个 LED 灯(TQ2440)分别使用了 S3C2440芯片的:GPB5、GPB6、GPB7 和 GPB8,下面列出来对应的原理图: 根据上图可以知道,当 CPU 的 GPB5 到 8 是低电平时,LED 灯亮;当为高电平时 LED 灯灭。只需要在驱动中实现对 GPB 口电平的控制就可以实现对灯进行开关操作。 2、编写LED驱动 以下为驱动源码: #include linux/mis
[单片机]
嵌入式驱动学习之GPIO驱动
uboot在s3c2440上的移植(1)
一、移植环境 主 机:VMWare--Fedora 9 开发板:Mini2440--64MB Nand,Kernel:2.6.30.4 编译器:arm-linux-gcc-4.3.2.tgz u-boot:u-boot-2009.08.tar.bz2 二、移植步骤 本次移植的功能特点包括: 支持Nand Flash读写 支持从Nor/Nand Flash启动 支持CS8900或者DM9000网卡 支持Yaffs文件系统 支持USB下载(还未实现) 1. 了解u-boot主要的目录结构和启动流程,如下图。 u-boot的stage1代码通常放在cpu/xxxx/start.S文件中,他用汇编语言写成
[单片机]
uboot在<font color='red'>s3c2440</font>上的移植(1)
mini2440也即S3C2440地址分配问题
写这篇文章完全是回答一个网友的问题,因为我之前也是对这里不理解,现在简单说一下。源引问题“mini2440的地址到底是怎么分配的呢?内部rom ram 外部的ram和rom分别占用的地址是多少啊,我从板子上看到有3个k4561632N芯片还有一个S29AL016J70TF102.但是看了相关的电路图也不知道他的地址是怎么分配的” 你问的是mini2440的地址怎么分配。我只能再细节一下你的问题,mini2440处理器的地址怎么分配。mini2440的处理器是S3C2440,理论上,S3C2440处理器可以使用的物理地址空间可以达到4GB,其中前1GB的地址(也就是0x0000 0000--0x4000 0000)为外设地址空间
[单片机]
mini2440也即<font color='red'>S3C2440</font>地址分配问题
基于WinCE的智能车载仪表设计
  引言   随着高性能电子显示技术的发展,汽车仪表电子化的程度越来越高。国内外已开发出了多功能全电子显示仪表、平视显示仪表、汽车导航系统、行车记录仪等高技术产品。未来,车用电子化嵌入式仪表具有以下优点:提供大量复杂的信息,使汽车的电子控制程度越来越高;满足小型、轻量化的要求,使有限的驾驶空间更人性化;高精度和高可靠性实现汽车仪表的电子化,降低了故障的发生率;设有在线故障诊断系统,一旦汽车发生故障,可以找到故障来源,方便维修;外形设计自由度高,汽车仪表盘造型美观。基于以上优点,汽车会越来越多地采用各种用途的电子化仪表。造型新颖、功能强大的嵌入式电子化仪表将是今后车用仪表的发展趋势和潮流。   1 智能车载仪表系统结构   本智
[单片机]
基于WinCE的智能车载仪表设计
1.10.2_I2C_S3C2440的I2C控制器_P
2440通过I2C总线连接设备(AT24Cxx),芯片内部有一个I2C控制器。 当主机(2440)Master为Transmitter时,从机Slave为Receiver,当主机Master为Receiver时,从机Slave为Transmitter。 下图是2440的I2C总线框图。从左往右看,首先是I2C的时钟,I2C的时钟源是PCLK(50MHz),经过一个4bit的分频器,产生I2C的时钟。通过IICSTAT寄存器发出信号,通过IICDS发送数据或接受数据。 数据的传输格式如下图如所示。首先发出开始信号S,然后是7位的从设备地址,1位的读写标志位,然后等待从机返回一个ACK信号,如果是发送数据,那么就将1B数
[单片机]
1.10.2_I2C_S3C2440的I2C控制器_P
s3c2440学习之路-012-0 异常中断基础知识
1. 异常/中断的基本知识介绍 异常/中断是ARM经常用到的处理机制,因此需要好好学习。这里总是写中断/异常是因为中断属于异常的一种,而我们经常听到中断这个词语而少听到异常这个词,所以这些特意写成中断/异常。如果CPU发生中断时,我说CPU发生了异常,你可不能说我讲错了,因此异常包含了中断。 1.1 ARM的7种工作模式 从2440的数据手册中可以看到,ARM920T(2440使用的ARM920T的核) 总共有7种工作模式 其中的中断模式就是我们常用的中断 ,当ARM处理中断操作时,就进入此模式。 1.2 ARM的异常向量表 当ARM发生异常时,就会把PC的值设置成一个固定的值,让程序跳转到固定的地址执行程序,并进入
[单片机]
<font color='red'>s3c2440</font>学习之路-012-0 异常中断基础知识
基于嵌入式S3C2440的船舶导航系统设计
文章在以ARMS3C2440为核的硬件平台上应用Linux操作系统开发了船舶导航系统,完成了系统的硬件设计、软件设计、交叉编译环境的建立、引导程序的移植、内核的移植、驱动程序的编写和根文件系统的建立等,实现了系统的功能。 1.前言 集计算机技术、通信技术、微电子技术等多种技术为一体的嵌入式技术进入到了一个飞速发展的阶段,嵌入式系统已被广泛应用到了航空、消费电子、信息家电、网络通信等各个领域。ARMS3C2440ARM是嵌入式处理器是性价比较优秀的芯片,在各个领域的开发应用有着广阔的应用前景。 船舶导航技术也应随着科学技术背景的改变不断地向着高性能稳定性的方面发展,潜入式技术,为其提供了优质的开发资源。
[单片机]
基于嵌入式<font color='red'>S3C2440</font>的船舶导航系统设计
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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