1.S3C2440GPIO简单介绍
GPIO即General-purpose input/output ,这些管脚除了可以用作输入输出外,还可以配置成一些其他的功能,例如I2C,UART等,其实就是管脚复用的思想。
所有的这些管脚主要通过下面的寄存器进行控制,
2.JZ2440原理图
从上面的原理图截图中我们可以看到:
1.我们的nLED_1,nLED_2,nLED_4是连接到3.3V电源上的,所以我们的管脚需要输出低电平,LED灯才会亮。
2.我们的nLED_1,nLED_2,nLED_4是连接到s3c2440的GPF4,GPF5,GPF6上面的。
另外,在原理图中还有如下知识点。
3.控制GPF管脚
我们需要控制GPF引脚控制LED灯,下面的问题就是我们怎么让GPF4输出0,
a.首先把该管脚配置为输出引脚,
b.设置它的状态。
然后我们在s3c2440的芯片手册中找到GPF引脚相关的寄存器。
我们通过设置GPFCON寄存器的[9:8]为01将GPF4配置为输出功能。把0000,0001,0000,0000=0x0100写到地址0x56000050上面。
设置PGFDAT[4]为0,则该管脚会输出低电平,此时LED点亮。把0000000=0x00写到地址0x56000054上面。
设置PGFDAT[4]为1,则该管脚会输出高电平,此时LED熄灭。把00010000=0x10写到地址0x56000054上面。
另外有一点需要注意,就是我们的CPU里面有R0,R1,.....R15,这些寄存器我们可以直接访问,而像GPFCON,GPFDAT这些寄存器我们访问的时候要通过地址去访问。
下面开始写程序点亮LED。
4.汇编语言点亮GPF4
/**************************************
*点亮LED, GPF4.
**************************************/
.text
.global _start
_start:
//把0x100写到地址0x56000050上,配置gpf4为输出引脚,
ldr r1, =0x56000050
ldr r0,=0x100
str r0,[r1]
//把0x00写到地址0x56000054上,设置gpf4输出低电平,
ldr r1, =0x56000054
ldr r0,=0x00
str r0,[r1]
//死循环
halt:
b halt
然后可以用下面的三行命令进行编译
arm-linux-gcc -c -o led_on.o led_on.S
arm-linux-ld -Ttext 0 led_on.o -o led_on.elf
arm-linux-objcopy -O binary -S led_on.elf led_on.bin
用命令行敲容易出错,我们把上面的命令写到一个makefile里面:
all:
arm-linux-gcc -c -o led_on.o led_on.S
arm-linux-ld -Ttext 0 led_on.o -o led_on.elf
arm-linux-objcopy -O binary -S led_on.elf led_on.bin
clean:
rm *.bin *.o *.elf
编译产生bin文件之后,打开windows的命令行,首先进入bin文件所在的目录,然后执行oflash led_on.bin,下载到开发板中即可执行。
5.C语言点亮GPF4
我们编写如下C语言代码控制LED,
int main()
{
unsigned int *pGPFCON = 0x56000050;
unsigned int *pGPFDAT = 0x56000054;
/*配置GPF4为输出引脚*/
*pGPFCON = 0x100;
/*配置GPF4输出0*/
*pGPFDAT = 0;
}
C语言代码写完之后,存在两个问题
1.我们写出了main函数,那么谁来调用这个main函数,
2.main函数中的变量保存在内存中,这个内存地址是多少。
答:我们需要写一段汇编代码,给main函数设置内存,调用main函数。
我们编写如下汇编代码
.text
.global _start
_start:
/*设置内存:SP栈*/
ldr sp, =4096 /*2440设置为nand启动时,片内4K内存地址为0,我们把栈设置这4K内存的顶部,*/
//led sp, =0x40000000 + 4096 /*nor启动时,片内4K内存的地址是0x40000000,我们同样也把栈设置在4K内存的顶部。 */
/* 调用main函数*/
bl main
halt:
b halt
然后编写makefile文件如下:
all:
arm-linux-gcc -c -o led.o led.c
arm-linux-gcc -c -o start.o start.S
arm-linux-ld -Ttext 0 led.o start.o -o led.elf
arm-linux-objcopy -O binary -S led.elf led.bin
arm-linux-objdump -D led.elf > led.dis
clean:
rm *.bin *.o *.elf *.dis
编译完之后下载到开发板中发现灯不亮,经查找原因是链接时文件顺序写错了,将上面makefile文件里面的
arm-linux-ld -Ttext 0 led.o start.o -o led.elf 修改为 arm-linux-ld -Ttext 0 start.o led.o -o led.elf。
然后重新编译后程序正确。
6.循环点亮LED
首先我们把之前的汇编代码进行了修改,关掉了看门狗,另外也自动的适配nand启动和nor启动,修改后的汇编代码如下。
.text
.global _start
_start:
/* 关闭看门狗 */
ldr r0, =0x53000000
ldr r1, =0
str r1, [r0]
/* 设置内存: sp 栈 */
/* 分辨是nor/nand启动
* 写0到0地址, 再读出来
* 如果得到0, 表示0地址上的内容被修改了, 它对应ram, 这就是nand启动
* 否则就是nor启动
*/
mov r1, #0
ldr r0, [r1] /* 读出原来的值备份 */
str r1, [r1] /* 0->[0] */
ldr r2, [r1] /* r2=[0] */
cmp r1, r2 /* r1==r2? 如果相等表示是NAND启动 */
ldr sp, =0x40000000+4096 /* 先假设是nor启动 */
moveq sp, #4096 /* nand启动 */
streq r0, [r1] /* 恢复原来的值 */
bl main
halt:
b halt
c语言源文件如下
#include "s3c2440_soc.h"
void delay(volatile int d)
{
while (d--);
}
int main(void)
{
int val = 0; /* val: 0b000, 0b111 */
int tmp;
/* 设置GPFCON让GPF4/5/6配置为输出引脚 */
GPFCON &= ~((3<<8) | (3<<10) | (3<<12));
GPFCON |= ((1<<8) | (1<<10) | (1<<12));
/* 循环点亮 */
while (1)
{
tmp = ~val;
tmp &= 7;
GPFDAT &= ~(7<<4);
GPFDAT |= (tmp<<4);
delay(100000);
val++;
if (val == 8)
val =0;
}
return 0;
}
C语言头文件如下
#ifndef __S3C2440_SOC_H
#define __S3C2440_SOC_H
#define __REG(x) (*(volatile unsigned int *)(x))
/*I/O port*/
#define GPACON __REG(0x56000000) //Port A control
#define GPADAT __REG(0x56000004) //Port A data
#define GPBCON __REG(0x56000010) //Port B control
#define GPBDAT __REG(0x56000014) //Port B data
#define GPBUP __REG(0x56000018) //Pull-up control B
#define GPCCON __REG(0x56000020) //Port C control
#define GPCDAT __REG(0x56000024) //Port C data
#define GPCUP __REG(0x56000028) //Pull-up control C
#define GPDCON __REG(0x56000030) //Port D control
#define GPDDA1T __REG(0x56000034) //Port D data
#define GPDUP __REG(0x56000038) //Pull-up control D
#define GPECON __REG(0x56000040) //Port E control
#define GPEDAT __REG(0x56000044) //Port E data
#define GPEUP __REG(0x56000048) //Pull-up control E
#define GPFCON __REG(0x56000050) //Port F control
#define GPFDAT __REG(0x56000054) //Port F data
#define GPFUP __REG(0x56000058) //Pull-up control F
#define GPGCON __REG(0x56000060) //Port G control
#define GPGDAT __REG(0x56000064) //Port G data
#define GPGUP __REG(0x56000068) //Pull-up control G
#define GPHCON __REG(0x56000070) //Port H control
#define GPHDAT __REG(0x56000074) //Port H data
#define GPHUP __REG(0x56000078) //Pull-up control H
上一篇:S3C2440框架与启动过程
下一篇:S3C2440开发板裸机程序系列01--流水灯
推荐阅读
史海拾趣
随着公司实力的不断增强,功得公司开始将目光投向国际市场。他们积极参加国际电子展会,与全球各地的客户建立联系,拓展销售渠道。同时,功得公司还根据不同国家和地区的市场需求,推出定制化的产品和服务。通过不懈努力,功得公司逐渐在国际市场上打开了局面,产品出口量稳步增长。
为了保持在行业中的领先地位,功得公司不断加大技术研发投入。他们与多所高校和科研机构建立合作关系,共同开展前沿技术研究。在这些合作中,功得公司取得了一系列技术突破,推出了一系列具有行业领先水平的新产品。这些技术成果不仅提升了公司的核心竞争力,也为整个电子行业的发展做出了贡献。
随着公司实力的不断增强,功得公司开始将目光投向国际市场。他们积极参加国际电子展会,与全球各地的客户建立联系,拓展销售渠道。同时,功得公司还根据不同国家和地区的市场需求,推出定制化的产品和服务。通过不懈努力,功得公司逐渐在国际市场上打开了局面,产品出口量稳步增长。
随着业务的不断扩展和技术实力的提升,风华电子厂于1993年实施股份制改革,并更名为广东风华高新科技股份有限公司。1996年,公司在深圳证券交易所成功上市(证券简称风华高科,证券代码000636),成为电子元器件行业的重要一员。上市不仅为公司筹集了更多资金,也进一步提升了公司的知名度和市场竞争力。
作为一家具有社会责任感的企业,Conflux始终关注社会公益事业。公司积极参与扶贫、教育等公益活动,为社会做出积极贡献。同时,Conflux还注重环保和可持续发展,通过采用环保材料和节能技术,降低生产过程中的环境污染。这些举措不仅提升了公司的社会形象,也赢得了社会各界的广泛赞誉。
以上五个故事是虚构的,但反映了一个科技公司可能经历的发展阶段和策略选择。在现实中,一个公司的成长和发展往往涉及更多复杂的因素和决策过程。希望这些故事能够为您提供一些启发和参考。
为了进一步扩大市场份额,Comchip Technology积极开拓国内外市场,与多家知名企业建立了长期稳定的合作关系。同时,公司还加强了与国际同行的交流与合作,引进了先进的技术和管理经验,不断提升自身的竞争力。
如今业内都在抱怨,手机、便携式媒体播放器、平板电视等个人消费电子价格压力越来越大、利润越来越薄,故越来越难做了,以下现象印证了这一点:风光一时的独立设计公司或倒闭或裁员,很多芯片公司上半年消费类业务收入下滑,纷纷寻找或尝试新的增长 ...… 查看全部问答∨ |
入门张望-CISC or RISC CISC-Von Neumann系统--INTEL 8086, ARM7,MIPS... RISC-Harward系统--AVR,ARM9... 两者不同,各有优势, 各家公司单片机采用两种指令集的都有。 不过,RISC是单片机发展方向:) .....… 查看全部问答∨ |
在存储、编码或者显示广播图像之前,必须将其转换为 HD 或者其他分辨率图像。 Altera 的 1080p 视频设 计工作台能够帮助系统设计人员轻松开发定制图像格式转换信号链。… 查看全部问答∨ |
|
RAM(Random Access Memory)的全名为随机存取记忆体,它相当于PC机上的移动存储,用来存储和保存数据的。它在任何时候都可以读写,RAM通常是作为操作系统或其他正在运行程序的临时存储介质(可称作系统内存)。 不过,当电源关闭时RAM不能保留数 ...… 查看全部问答∨ |
小弟是用PN开发AVR的,现在要用显示模块显示一串浮点数, 但是PN好像没有类似ftoe这样的函数,现在想知道有哪位大侠知道 浮点数转字符串的C语言算法,麻烦贴出来看看~谢谢了… 查看全部问答∨ |
Tornado 2.21 for all在哪里下载? 网上几乎找不到,电驴很慢很慢,根本没有办法下. 确定后马上结贴,谢谢! 我的邮箱: xugeng@sohu.com 谢谢!… 查看全部问答∨ |
S3C6410 ECCType 设置问题+ECC8bit算法 在S3C6410 NFCONF寄存器介绍里 ECCTYPE BIT[24:23] ECC_BIT(1,4,8) 硬件设置cfgbootecc 关于上面这两个位的值手册上说的是硬 ...… 查看全部问答∨ |
有没有flash卡的类别汇总的,包括类别--厂商---价格---市场份额等的信息的,现在做那方面的驱动开发工作,有flash的datasheet和驱动代码最好了.… 查看全部问答∨ |