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

  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:

  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

  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

  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

  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

  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

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

  1. 调试exynos4412—ARM嵌入式Linux—LEDS/GPIO驱动之二

    /** ****************************************************************************** * @author    暴走的小 ...

  2. 调试exynos4412—ARM嵌入式Linux—LEDS/GPIO驱动之一

    /** ****************************************************************************** * @author    暴走的小 ...

  3. 调试exynos4412—ARM嵌入式Linux—LEDS/GPIO驱动之三

    /** ****************************************************************************** * @author    暴走的小 ...

  4. linux 标准 GPIO 操作

    Linux 提供了GPIO 操作的 API,具体初始化及注册函数在 driver/gpio/lib_gpio.c 中实现.   #include    int gpio_request(unsigne ...

  5. Linux内核 GPIO操作部分API

    内核中关于GPIO的操作API主要集中在<linux/of_gpio.h>和<linux/gpio.h>中,前者主要是GPIO直接与设备树相关的操作,在Linux 设备树操作A ...

  6. [转载]嵌入式linux下操作GPIO

    本文转自:http://blog.csdn.net/mirkerson/article/details/8464231 在嵌入式设备中对GPIO的操作是最基本的操作.一般的做法是写一个单独驱动程序,网 ...

  7. 嵌入式 Linux 如何操作 GPIO ?

    作者:刘凯链接:https://www.zhihu.com/question/19704852/answer/19760467来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出 ...

  8. 应聘linux/ARM嵌入式开发岗位

    **************************************************************** 因为发在中华英才和智联招聘没有人采我所以我 在这里发布我的个人简历希望 ...

  9. 009-2010网络最热的 嵌入式学习|ARM|Linux|wince|ucos|经典资料与实例分析

    前段时间做了一个关于ARM9 2440资料的汇总帖,很高兴看到21ic和CSDN等论坛朋友们的支持和鼓励.当年学单片机的时候datasheet和学习资料基本都是在论坛上找到的,也遇到很多好心的高手朋友 ...

随机推荐

  1. PHP方法之 mb_substr

    主要功能:中文字符串截取,解决substr中文截取问题,用法基本和substr相同,他可以指定编码. 函数原型:string mb_substr ( string $str , int $start  ...

  2. Python之写入文件(1)

    一.写入文件 保存数据也是在各个编程语言中常用的操作,将数据写入到文件中是常用的操作,你可以将程序运行中的一些临时输出保存至文件中,以便后续打开文件查看,也可以把这些文件读入程序中来操作其中的数据. ...

  3. JQuery中xxx is not a function或者can not find $

    在项目中,遇到以上两个错误,反复折腾了好久,js代码写得没有问题,jquery的文件也引入了,就是反复的报告错误,xxx is not a function.如图: 就是这样的错误,shake is ...

  4. django的rest framework框架——安装及基本使用

    一.django的FBV 和 CBV 1.FBV(基于函数的视图): urlpatterns = [ url(r'^users/', views.users), ] def users(request ...

  5. HDU 3045 DP 斜率优化 Picnic Cows

    题意:将n个数分成若干组,每组数字的个数不少于t个,要把每组的数字减小到这组最小值,求所有数字减少的最小值. 先将这n个数从小到大排个序,可以想到一组里面的数一定是排序后相邻的. 设d(i)表示前i个 ...

  6. 多重部分和 poj1742

    Description People in Silverland use coins.They have coins of value A1,A2,A3...An Silverland dollar. ...

  7. Tomcat基础配置(一)

    详情请看散尽浮华的tomcat相关配置技巧梳理 本次只用于自己的查看,谢谢作者的谅解. tomcat常用架构:1)nginx+tomcat:即前端放一台nginx,然后通过nginx反向代理到tomc ...

  8. apache kafka系列之客户端开发-java

    1.依赖包 <dependency>            <groupId>org.apache.kafka</groupId>            <a ...

  9. 【bzoj1710】[Usaco2007 Open]Cheappal 廉价回文

    [bzoj1710][Usaco2007 Open]Cheappal 廉价回文 Description 为了跟踪所有的牛,农夫JOHN在农场上装了一套自动系统. 他给了每一个头牛一个电子牌号 当牛走过 ...

  10. 数三角形(codevs 3693)

    题目描述 Description 给定一个n×m的网格,请计算三个点都在格点上的三角形共有多少个(三角形的三点不能共线).下图为4×4的网格上的一个三角形.  输入描述 Input Descripti ...