s3c2440硬件篇之一:GPIO

发布者:skyshoucang最新更新时间:2016-04-05 来源: eefocus关键字:s3c2440  硬件  GPIO 手机看文章 扫描二维码
随时随地手机看文章
S3C2440共有130个I/O 端口,共分为GPA,GPB,...,GPJ.对于这几组GPIO引脚,他们的寄存器是相似的:
GPxCON:用于配置(configure),选择引脚的功能。
GPxDAT:用于读/写数据。
GPxUP:确定是否使用内部上拉电阻。(没有GPAUP寄存器。)
 
PORTB~PORTJ在寄存器操作方面完全相同。GPxCON中每两位控制一根引脚:00表示输入,01表示输出,10表示特殊功能,11保留不用。
s3c2440硬件篇之一:GPIO
一。使用汇编代码点亮一个LED。参照韦东山大哥的,上图是从韦大哥的书中截图的,而我的开发板对应的是GPF接口。仅此区别。
(1)led_on.S汇编代码。

@******************************************************************************
@ File:led_on.S
@ 功能:LED点灯程序,点亮LED1
@****************************************************************************** 
            
.text              @伪代码指令,指定下面开始是代码段,
.global _start
_start: 
            LDR R0,=0x56000050          @ R0设为GPFCON寄存器。此寄存器
                                        @ 用于选择端口F各引脚的功能:.
                                        @ 是输出、是输入、还是其他
            MOV R1,#0x00000001 
            STR R1,[R0]                 @ 设置GPF0为输出口, 位[1:0]=0b01
            
            LDR R0,=0x56000058          @ R0设为GPFUP寄存器。此寄存器
                                        @ 用于选择端口F使能禁止上拉的功能:
            MOV R1,#0x00000000 
            STR R1,[R0]                 @ 使能GPF0上拉
            
            LDR R0,=0x56000054          @ R0设为GPFDAT寄存器。此寄存器
                                        @ 用于读/写端口F各引脚的数据
            MOV R1,#0x00000000          @ 此值改为0x00000001,
                                        @ 可让LED1熄灭
            STR R1,[R0]                 @ GPF0输出0,LED1点亮
            
MAIN_LOOP:
            B MAIN_LOOP

(2)Makefile文件:

led_on.bin led_on.S
    arm-linux-gcc -g -c -o led_on.o led_on.S
    arm-linux-ld -Ttext 0x0000000 -g led_on.o -o led_on_elf
    arm-linux-objcopy -O binary -S led_on_elf led_on.bin
clean:
    rm -f led_on.bin led_on_elf *.o

其中:arm-linux-ld -Ttext 0x0000000 -g led_on.o -o led_on_elf:指定了代码段的运行地址为0x0000_0000,并指定生成连接文件led_on_elf,由于没有定义数据段和BSS段的起始地址,它们呗依次放在代码段的后面。arm-linux-objcopy -O binary -S led_on_elf led_on.bin:由连接文件生产可执行文件led_on.bin,下载进开发板即可观察到led1点亮了。

重要说明:玩单片机的时候我们一般是把程序下载到单片机的自身带的flash中,而s3c2440不是这样的,我们是把程序下载到它的外部存储器中,如Norflash或者NandFlash.只有s3c2440是不能运行的,它的最小系统包括了,SDRAM(即内存),FLASH(Nand或者Nor,即相当于硬盘)。我们把程序下载到NandFlash中而不是CPU本身,那么当选择从NandFlash启动CPU的时候(即OM0,OM1设置为00的时候)S3C2440会自动根据内部的硬件结构将NandFlash中的前4K代码复制到S3C2440的内部RAM中,此时内部RAM的地址为0,程序将从0开始执行。

一。使用C语言点亮一个LED。
(1)crt0.S

@******************************************************************************
@ File:crt0.S
@ 功能:通过它转入C程序
@****************************************************************************** 

.text
.global _start
_start:
            ldr r0, =0x56000010 @ WATCHDOG寄存器地址
            mov r1, #0x0 
            str r1, [r0] @ 写入0,禁止WATCHDOG,否则CPU会不断重启
            
            ldr sp, =1024*4 @ 设置堆栈,注意:不能大于4k, 因为现在可用的内存只有4K
                                        @ nand flash中的代码在复位后会移到内部ram中,此ram只有4K
            bl main @ 调用C程序中的main函数
halt_loop:
            b halt_loop

(2)len_on.c

#define GPFCON (*(volatile unsigned long *)0x56000050)
#define GPFDAT (*(volatile unsigned long *)0x56000054)
#define GPFUP (*(volatile unsigned long *)0x56000058)

int main()
{
    GPFCON 0x00000004; // 设置GPF1为输出口, 位[3:2]=0b01
    GPFUP 0x0;//使能上拉
    GPFDAT 0x00000000; // GPF1输出0,LED1点亮

    return 0;
}


(3)Makefile:

 

led_on.bin crt0.S led_on.c
    arm-linux-gcc -g -c -o crt0.o crt0.S
    arm-linux-gcc -g -c -o led_on.o led_on.c
    arm-linux-ld -Ttext 0x0000000 -g crt0.o led_on.o -o led_on_elf
    arm-linux-objcopy -O binary -S led_on_elf led_on.bin
    arm-linux-objdump -D -m arm led_on_elf led_on.dis
clean:
    rm -f led_on.dis led_on.bin led_on_elf *.o


比较疑惑的一点是crt0.S中bl main @ 调用C程序中的main函数,怎么实现的,我是这么理解的,arm-linux-ld连接生成了led_on_elf文件,这是一个文件。

关键字:s3c2440  硬件  GPIO 引用地址:s3c2440硬件篇之一:GPIO

上一篇:arm中的PLL,MPLL,UPLL,FCLK,HCLK,PCLK的作用概述
下一篇:arm汇编语言中bne 1b是什么意思

推荐阅读最新更新时间:2024-03-16 14:49

STC8单片机硬件SPI通信例程W25Q16
SPI全双工通信使用起来相当方便,最常见的是W25Q16存储颗粒的使用了,当重新上电时,存储再W25Q16中的数据不会丢失,仍然可以读取出来,下面就简单讲一下如何使用W25Q16存储芯片。 本篇讲的是使用硬件SPI让单片机和W25Q16进行通信,模拟SPI通信将会在下一篇讲。使用W25Q16的步骤如下: 1.配置与SPI有关的寄存器 SPI的数据寄存器配置起来很简单,清零即可。 SPI的状态寄存器,SPI的中断标志位SPIF和写冲突标志位WCOL都需要写1清0,即将SPIF,WCOL位都置1即可。 SPI的控制寄存器,设置主机模式时,将SSIG和MSTR位都置1即可,使能SPI将SPEN位置1即可,相位和极性的
[单片机]
STC8单片机<font color='red'>硬件</font>SPI通信例程W25Q16
ARM GPIO接口置位方法
如下面的代码,为啥把端口SDA付给SDA就是置位操作呢? 其实SDA是一个偏移量,它基于GPIO_PORTB_BASE,进行偏移,SDA定义的就是某一个管脚,如 #define SDA 0x20H 这是16进制数,展开为二进制则是0010 0000B, 可见,偏移量0x20H,其实也可以用来置位,因为第六位为1。再看GPIOPinWrite()函数,第三个参数就是SDA的值,要知道,函数赋值,最小都是char类型,一个字节,你无法赋值一个bit,所以,既然这样,就干脆就用偏移量赋值就行了(函数的实现,可能通过&或者|)。 所以,某些ARM编程的书籍上说要把某个GPIO的值赋值给它本身,我当时就很不解,为啥要赋值给它本身?其实就是因
[单片机]
航向姿态系统自动测试系统的组成原理和实现软硬件设计
1 引言 伴随着微电子技术的发展,机载设备的自动化程度、综合化水平和技术密度程度不断提高,同时也使机载设备的测试系统及维修设备的研究受到高度重视。国外发达国家都先后制定了适应本国要求的维修系统与维修设备的设计、类型选择及模块化、系列化标准,其主要目的是要以较低的测试成本、较短的研制周期、先进的测试技术和便于灵活组合的软硬件结构,建立通用化、系列化和标准化的维修测试平台,以适应多个测试对象、多种测试环境和技术不断发展的要求,这种维修测试平台称作自动测试设备(ATE,Automatic Testing Equipment)。 本文介绍的航向姿态系统自动测试设备正是基于ATE技术的自动测试设备,对某型飞行器机载航姿系统各部件进行离位
[测试测量]
航向姿态系统自动测试系统的组成原理和实现软<font color='red'>硬件</font>设计
ARM-Linux GPIO操作事宜
1.在嵌入式Linux GPIO表示为 S3C2410_GPx(n) ,其中x的取值为 A,B,C,D,E,F,G,H..... ,表示那个GPIO口,n的取值为 1,2,3,..... 表示第几个管脚。 例如 B口的第六管教:S3C2410_GPB(6) D口的第12管教:S3C2410_GPD(12) ..... 注 这些宏定义在arch/arm/mach-s3c2410/include/mach/gpio-nrs.h,使用#include mach/gpio-nrs.h 以下包含#include mach/hardware.h linux/gpio.h mach/regs-gpio.h 2.设置gpio的工作模
[单片机]
盘点软硬件一体化时代的10大经典失败案例
     随着苹果软硬件一体战略的大获成功,众多公司纷纷开始效仿,软硬件一体逐渐成为科技创新趋势。国外微软,亚马逊,Google等公司都在平板和手机上努力尝试着,而国内的百度,阿里,360也在倒腾着自己的智能手机。但是软硬件一体并不是那么容易的事,大多数软硬件一体淘金者都凶多吉少,但是恐怕“高死亡率”并不能吓退越来越多的淘金者,因为软硬件一体的诱惑是如此巨大:软硬件一体不但能霸占前端用户流量,还能获得惊人的销售回报,单以国内软硬件一体小成者小米为例,其成立第三年,年出货量就高达700万台,年收入高达100多亿人民币,除了软硬件一体领域,又有多少公司能做到3年100亿年收入?!   今天,笔者就为软硬件一体淘金者们总结了十个软硬件一
[手机便携]
基于S3C2440的嵌入式Linux驱动——SPI子系统解读(二)
本文属于第二部分。 4. 主控制器驱动程序 4.1 定义 platform device 下列数据结构位于arch/arm/plat-s3c24XX/devs.c /* SPI (0) */ static struct resource s3c_spi0_resource = { = { .start = S3C24XX_PA_SPI, .end = S3C24XX_PA_SPI + 0x1f, .flags = IORESOURCE_MEM, }, = { .start = IRQ_SPI0, .end = IRQ_S
[单片机]
基于<font color='red'>S3C2440</font>的嵌入式Linux驱动——SPI子系统解读(二)
STM32寄存器操作方式学习-GPIO
1、当端口想要配置为外部中断线时,端口必须配置成输入模式。 2、 对于双向复用功能,端口位必须配置复用功能输出模式(推挽或开漏)。这时,输入驱动器被配置成浮空输入模式。 3、当端口配置为输出模式时,引脚默认为低电平。 4、使用GPIO的默认复用功能只需将相应的端口位配置寄存器(GPIOx_CRL或者GPIOx_CRH)设置成相应的值即可,不需要打开辅助功能IO时钟,只有在用到重映射时才需要打 开辅助功能IO时钟。
[单片机]
英飞凌已赢3G iPhone基带芯片大单?
  在即将推出的苹果3G iPhone中,英飞凌科技公司看来已经赢得了垂涎已久的基带供应商奖。支持ZiPhone应用的电脑黑客Zibri声称,当为iPhone的测试版SDK搜索代码时发现了这一情况。   报道暗示,在最新的SDK的代码中,包括一行提及英飞凌SGOLD3H芯片组的代码,这颗芯片也被称为PMB8878。   位于德国慕尼黑的英飞凌公司已经采用SGOLD-PMB28876为现有的EDGE版本的iPhone提供基带解决方案。   据英飞凌公司透露,SGOLD3完全能够支持HSDPA第8类,具有7.2Mbps的下行数据率潜力。   Zibri表示,3G iPhone的指标预计在6月披露,包括对最高5百万像素的摄像机、
[焦点新闻]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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