【嵌入式Linux+ARM】GPIO操作

1.GPIO介绍

GPIO(general purpose i/o ports)意思为通用输入/输出端口,通俗的说就是一些引脚。

我们可以通过它们输出高低电平 或 读入引脚的状态。

s3c2440中有130个I/O端口,分为A~J共9组,GPA、GPB、..... GPJ

2.GPIO寄存器

既然要操作GPIO,必须对相应的寄存器进行操作,2440中gpio寄存器有:

GPxCON——选择引脚功能(输入、输出、保留等)

GPxDAT——用来读写引脚

GPcUP ——某一位是1时,相应的引脚无内部上拉电阻;为0时,有内部上拉电阻

3.原理图

LED:

                                            按键:

4.实验代码:

>>使用汇编语言实现点灯:

led_on.S

[cpp] view plain copy

print?

  1. .text
  2. .global _start
  3. _start:
  4. LDR R0, =0x56000050    //GPFCON寄存器地址
  5. MOV R1, #0x00001500    //见技术手册相应的配置,一般01为输出引脚
  6. STR R1, [R0]           //设置为输出
  7. LDR R0, =0x56000054    //GPFDAT寄存器
  8. MOV R1, #0x00000000
  9. STR R1, [R0]           //往GPFDAT寄存器写值
  10. MAIN_LOOP:
  11. B MAIN_LOOP            //循环等待

Makefile:

[cpp] view plain copy

print?

  1. led_on.bin:led_on.S
  2. arm-linux-gcc -g -c led_on.S -o led_on.o
  3. arm-linux-ld -Ttext 0x00000000 -g led_on.o -o led_on_elf    //-Ttext表示设置连接地址
  4. arm-linux-objcopy -O binary -S led_on_elf led_on.bin        //把elf文件转换为.bin文件
  5. clean:
  6. rm -rf *.bin *.o *elf

>>使用C语言实现点灯

使用c语言来写,需要一个启动文件,可以用来关闭看门口,设置堆栈等。

crt0.S

[cpp] view plain copy

print?

  1. .text
  2. .global _begin
  3. _begin:
  4. LDR R0, =0x53000000    //看门狗寄存器地址
  5. MOV R1, #0x00000000    //写0禁止看门狗
  6. STR R1, [R0]
  7. LDR SP, =1024*4        //设置堆栈,注意不能大于4K,因为现在可用的SRAM空间只有4K
  8. BL main                //调用main函数,最后注意,汇编语言大小写无所谓的
  9. _LOOP:
  10. B _LOOP

led_on_c.c

[cpp] view plain copy

print?

  1. #define GPFCON *(volatile unsigned long *)0x56000050
  2. #define GPFDAT *(volatile unsigned long *)0x56000054
  3. int main()
  4. {
  5. GPFCON=0x00001500;//简单的配置为输出
  6. GPFDAT=0x00000000;//简单的输出0,通过上面的原理图可知,相应的led会亮
  7. return 0;
  8. }

Makefile

[cpp] view plain copy

print?

  1. led_on_c.bin : crt0.S  led_on_c.c
  2. arm-linux-gcc -g -c -o crt0.o crt0.S
  3. arm-linux-gcc -g -c -o led_on_c.o led_on_c.c
  4. arm-linux-ld -Ttext 0x0000000 -g  crt0.o led_on_c.o -o led_on_c_elf
  5. arm-linux-objcopy -O binary -S led_on_c_elf led_on_c.bin
  6. arm-linux-objdump -D -m arm  led_on_c_elf > led_on_c.dis   //把elf文件转换为反汇编文件
  7. clean:
  8. rm -f led_on_c.dis led_on_c.bin led_on_c_elf *.o

>>使用按键+c语言实现点灯

看上面的原理图,原理就是把按键的引脚配置为输入引脚,以读取引脚的状态;

但按键被按下时,引脚读到的是低电平;当按键松开时,读取到高电平;

crt0.S同上;

key_led.c

[cpp] view plain copy

print?

  1. /*
  2. GPF4 GPF5 GPF6 --led
  3. GPF0 GPF2 GPG3 --key
  4. */
  5. #define GPFCON (*(volatile unsigned long *)0x56000050)
  6. #define GPFDAT (*(volatile unsigned long *)0x56000054)
  7. #define GPGCON (*(volatile unsigned long *)0x56000060)
  8. #define GPGDAT (*(volatile unsigned long *)0x56000064)
  9. #define GPF4_out (1<<(4*2))
  10. #define GPF5_out (1<<(5*2))
  11. #define GPF6_out (1<<(6*2))
  12. #define GPF4_msk (3<<(4*2))
  13. #define GPF5_msk (3<<(5*2))
  14. #define GPF6_msk (3<<(6*2))
  15. #define GPF0_in (0<<(0*2))
  16. #define GPF2_in (0<<(2*2))
  17. #define GPG3_in (0<<(3*2))
  18. #define GPF0_msk (3<<(0*2))
  19. #define GPF2_msk (3<<(2*2))
  20. #define GPG3_msk (3<<(3*2))
  21. int main()
  22. {
  23. unsigned long dwDat;
  24. //1 output pin
  25. GPFCON &= ~(GPF4_msk | GPF5_msk | GPF6_msk);
  26. GPFCON |=  (GPF4_out | GPF5_out | GPF6_out);
  27. //input pin
  28. GPFCON &= ~(GPF0_msk | GPF2_msk);
  29. GPFCON |=  (GPF0_in | GPF2_in);
  30. GPGCON &= ~GPG3_msk;
  31. GPGCON |=  GPG3_in;
  32. while(1)
  33. {
  34. dwDat = GPFDAT;
  35. if(dwDat & (1<<0))
  36. GPFDAT |= (1<<4);
  37. else
  38. GPFDAT &= ~(1<<4);//light
  39. if(dwDat & (1<<2))
  40. GPFDAT |= (1<<5);
  41. else
  42. GPFDAT &= ~(1<<5);
  43. dwDat = GPGDAT;
  44. if(dwDat & (1<<3))
  45. GPFDAT |= (1<<6);
  46. else
  47. GPFDAT &= ~(1<<6);
  48. }
  49. return 0;
  50. }

Makefile相应的修改即可;

上面的程序编译都会得到bin文件,我们把它烧录进nand flash中即可,烧录可以使用工具,也可以通过固化在nor flash中的Uboot来烧录,方法很多,烧录后,上电,2440CPU会自动把nand flash前4k的内容,拷贝到2440片内4k的SRAM中运行,这块内存俗称stepping stone区。

注:原创文章,转载请注明出处:http://blog.csdn.net/scottly1/article/details/38960309

时间: 2024-08-07 18:03:42

【嵌入式Linux+ARM】GPIO操作的相关文章

嵌入式Linux ARM汇编(六)——GNU ARM汇编编程

嵌入式Linux ARM汇编(六)--GNU ARM汇编编程 不同的汇编器对汇编语言的语法要求不一样.目前常用的ARM汇编环境有以下两种: A.ARM ASM:ARM公司的汇编器,适合在Windows平台下使用 B.GNU ARM ASM:GNU交叉编译工具链中的汇编器,适合于Linux开发平台. GNU汇编器是GNU工具集的一部分,用于将汇编语言文件转化为二进制obj文件.GNU汇编器针对的是多种处理器架构,这意味着GNU汇编器的语法不同于ARM工具链的汇编器. 一.GUN ARM汇编指令格式

嵌入式Linux ARM汇编(七)——C语言与ARM汇编混合编程

嵌入式Linux ARM汇编(七)--C语言与ARM汇编混合编程 在嵌入式系统开发中,目前使用的主要编程语言是C和汇编.在大规模的嵌入式软件中,例如含有OS,大部分的代码都是用C编写的,主要是因为C语言的结构比较好,便于人的理解,而且有大量的支持库.但是很多地方还是要用到汇编语言,例如开机时硬件系统的初始化,包括CPU状态的设定,中断的使能,主频的设定,以及RAM的控制参数及初始化,一些中断处理方面也可能涉及汇编.另外一个使用汇编的地方就是一些对性能非常敏感的代码块,这是不能依靠C编译器的生成代

linux 标准 GPIO 操作

Linux 提供了GPIO 操作的 API,具体初始化及注册函数在 driver/gpio/lib_gpio.c 中实现. #include int gpio_request(unsigned gpio, const char *label); 获得并占有 GPIO port 的使用权,由参数 gpio 指定具体 port.非空的label指针有助于诊断.主要告诉内核这块地址被占用了.当其他地方调用同一地址的gpio_request就会报告错误,该地址已经被申请.在/proc/mem有地址占用表

【嵌入式Linux+ARM】存储控制器(操作SDRAM)

1.存储控制器介绍 s3c2440中的"存储管理器"提供了访问外部设备所需要的信号,有如下特性: 1.支持小字节序.大字节序(通过软件选择) 2.每个BANK为128M,一共有8个BANK,共1G 3.BANK0~BANK5可以支持外接ROM.SRAM等,BANK6~BANK7除可以支持ROM.SRAM外 还支持SDRAM 4.BANK0~BANK7的起始地址是固定的 5.外接SDRAM时,支持自刷新和省电模式 s3c2440上有ADDR0~ADDR26访问范围只有128M,如何达到上

【嵌入式Linux+ARM】硬件相关基础知识(门电路_UART_I2C_SPI)

比较基本的一些知识,就算再怎么水,一些基本的电路常识还是需要懂的,需要自己慢慢的积累,实际工作中需要好好积累硬件相关的知识: 正文开始: 1.门电路 与门.或门.非门的几个标志需要记住,特别是后面两个不要混淆,自己画了一遍: 实际电路中可以组合使用:如与非门.或非门等复杂电路. 这些是比较简单的,做个简单的复习: 与门:1 1-->1      1 0-->0      0 1-->0     0 0-->0 或门:1 1-->1      1 0-->1      0

【嵌入式Linux+ARM】ARM体系结构与编程(ARM汇编指令)

自己的一些简单的总结,也是最常用的ARM汇编指令,之后也会不断的补充完善. 1. 汇编系统预定义的段名 .text    @代码段 .data   @初始化数据段 .bss    @未初始化数据段 需要注意的是,源程序中.bss段应该在.text之前. 2.定义入口点 汇编程序的缺省入口是 start标号,用户也可以在连接脚本文件中用ENTRY标志指明其它入口点. .text .global _start _start: 3 .word用法 word expression就是在当前位置放一个wo

【嵌入式Linux+ARM】ARM体系结构与编程(ARM概述)

ARM体系结构与编程 本文章记录一些看<ARM体系结构与编程>这一本书的记录: 个人觉得,学习ARM体系时,不需要死记硬背,只要把某些关键的大致记住,比如ARM寄存器(通用寄存器.PC.LR.SP.CPSR.SPSR).ARM中断处理体系.常用的ARM汇编指令等. 本文基本都是从书上截图,都是一些关键的知识,需要我们时常去复习的. 一.ARM概述 ARM处理器的7种工作模式: ARM处理器寄存器: ARM中PC(R15)寄存器: ARM中CPSR寄存器: ARM异常处理模式--响应过程和返回过

【嵌入式Linux+ARM】阶段性总结(Makefile &amp; 链接文件)

1.arm-linux-ld arm-linux-ld 的 -T 选项用来指定链接地址: -Ttext--指定代码段 -Tdata--指定数据段 -Tbss--指定bss段 arm-linux-ld -Ttext 0x30000000 -g led_on.o -o led_on 也可以用来指定一个链接文本,如*.lds ,举例如下: SECTIONS{ . = 0x30000000 //设置当前运行地址 .text : {*(.text)}                            

学习嵌入式linux开发板之iTOP-4412 开发板如何操作GPIO

本文转自迅为论坛:http://www.topeetboard.com 平台:迅为嵌入式linux开发板 Exynos4412 所有的 GPIO 都有固定的地址,为了方便操作这些 GPIO,Linux 内核 在 gpio-exynos4.h 里面定义了一些 GPIO 的宏,例如: #define EXYNOS4_GPA0(_nr)  (EXYNOS4_GPIO_A0_START + (_nr)) #define EXYNOS4_GPA1(_nr)  (EXYNOS4_GPIO_A1_START