文章目录

  • 前言
  • 一、GPIO硬件介绍
  • 二、通过寄存器操作GPIO引脚
    • 1.GPxCON寄存器
      • GPxDAT寄存器
      • GPxUP寄存器
    • 2.GPIO操作实例:点亮一个LED
      • LED原理图
      • 使用汇编代码点亮一个LED
  • 总结

前言

本系列博客均是基于韦东山老师的《嵌入式Linux应用开发》书籍,因此对于一些内容有疑问的可以参考书籍也可以评论区讨论。

注意:因为原书籍是基于S3C2410芯片进行讲述,所以我们这里主要是理解其原理,对于不同的芯片应根据实际原理图进行改进。


一、GPIO硬件介绍

GPIO(Gerneral Purpose I/O Port)意思就是通用输入/输出端口。通俗的说,就是一些引脚,可以通过它输出高低电平或者通过它们读入引脚的状态——高/低电平。

S3C2410有117个I/O端口,共分为A~H组,对于不同的芯片端口的数量不同,划分组的方式也不同。因此实际情况要根据原理图进行归纳,切勿死记(有单片机基础的同学可以对比学习)。对于GPIO端口的操作,是通过访问寄存器的方式开控制某个引脚是输入还是输出,还是作为其他特殊功能(串口·)。

GPIO的操作是所有硬件操作的基础,由此扩展开来了解所有硬件的操作,这是底层人员必须掌握的。

二、通过寄存器操作GPIO引脚

既然一个引脚可以用于输入、输出、或其他功能,那么一定有一个寄存器用来选择这些功能(control);对于输入,一定可以通过读取某个寄存器来确定引脚是高电平还是低电平(Data);对于输出,一定可以通过写入某个寄存器让这个引脚输出高电平/低电平(Data);对于其他特俗功能,则有另外的寄存器来控制它

1.GPxCON寄存器

从这个寄存器的名字可以看出,GP表示是一个GPIO口,x表示是哪个组,CON表示contro,用于控制选择输出/输出/特殊功能(你也可以理解为Configure 配置)
PORTA与PORTB~PORTH/J在功能选择方面有所不同,GPACON中每一位对应一根引脚(一共23根)。当某位被设为0时,相应引脚问输出引脚,此时我们可以在GPADAT中相应位写入0或1让此引脚输出低电平/高电平;当CPACON中某位被设为1时,相应引脚为地址线或用于地址控制,此时CPADAT就无效。因此一般而言GPACON通常被设为1,以便访问外部存储器件。(这仅限于PORTA)

对于PORTB~PORTH/J寄存器操作完全相同。每两位控制一个引脚:
00:表示输入
01:表示输出
10:表示特殊功能
11:保留不用

GPxDAT寄存器

从单词意思上看,DAT就是表示对引脚操作的数据了。
GPxDAT用于读/写引脚;当引脚被设为输入时,读此寄存器可知相应引脚的状态是高电平还是低电平;当引脚被设置为输出时,写此寄存器可控制引脚输出高电平/低电平

GPxUP寄存器

CPxUP:某位为1时,相应引脚无内部上拉电阻;为0时,相应引脚使用内部上拉电阻。如下图
所谓上拉电阻,下拉电阻。是在端口处外接电阻。其目的是为了控制端口处的初始值。就是说,当GPIO引脚处于第三态(既不是输出高电平,也不输出低电平,而是高阻态,相当于没有接芯片)时,它的电平状态由上拉电阻,或下拉电阻确定(具体的使用会在后面对按键的操作进行分析)

特别说明:其实对于寄存器的访问和操作除了我们前面介绍的通过地址直接访问外,还可以通过总线的方式进行访问,但是这里就不介绍了,有兴趣的同学可以翻阅书籍

2.GPIO操作实例:点亮一个LED

LED原理图

使用汇编代码点亮一个LED

汇编代码

.text                                    @伪代码text表示下面的内容为代码段
.global_start                           @伪代码用于将标号为start的程序定义为全局
_start:                                 @伪代码程序编号LDR    R0 , =0X56000010    @R0设为GPBCON寄存器,此寄存器用于选择端口B的功能MOV R1 , #0X00000400 STR R1 , [R0]           @设置GPB5为输出口,位[10:9]=0b01LDR R0 ,=0X56000014     @R0设为GPBDAT寄存器,用于控制输出数据MOV R1 ,#0X0000000000   @设置R1寄存器的值位0STR R1,[R0]             @将R1的写入寄存器中,使GPB5输出低电平,则LED灯亮
MAIN_LOOP:B  MAIN_LOOP

Makefile

led_on.bin:led_on.Sarm-linux-gcc -g -c -o led_on.o led_on.Sarm-linux-ld -Ttext 0x00000000 -g led_on.o led_on_elfarm-linux-objcopy -O binary -S led_on_elf led_on.binclean:rm -f led_on.bin led_on_elf *.o

C语言程序

#define GPBCON (*(volatile unsigned long *)0x56000010)  //volatile防止编译器优化
#define GPBDAT (*(volatile unsigned long *)0x56000014)int main()
{GPBCON =0x00000400;  //设置GPB5为输出模式GPBDAT =0x000000000;//GPB5输出低电平 0return 0;
}

Makefile

led_on_c.bin : crt0.S led_on_c.carm-linux-gcc -g -c -o crt0.o crt0.Sarm-linux-gcc -g -c -o led_on_c.o led_on_c.carm-linux-ld -Ttext 0x00000000 -g crt0.o led_on_c.o -o led_on_c_elfarm-linux-objcopy -O binary -S led_on_c_elf led_on_c.binarm-linux-objdump -D -m arm led_on_c_elf > led_on_c.dis
clean:rm -f led_on_c.dis led_on_c.bin led_on_c_elf *.o

总结

希望上面的内容能让你对GPIO的操作有新的认识!

嵌入式Linux应用开发(四)——GPIO接口相关推荐

  1. 【嵌入式Linux】嵌入式Linux驱动开发基础知识之Pinctrl子系统和GPIO子系统的使用

    文章目录 前言 1.Pinctrl子系统 1.1.为什么有Pinctrl子系统 1.2.重要的概念 1.3.代码中怎么引用pinctrl 2.GPIO子系统 2.1.为什么有GPIO子系统 2.2.在 ...

  2. 嵌入式linux/鸿蒙开发板(IMX6ULL)开发(十四)文字显示

    文章目录 一.文字显示 1.1 字符的编码方式 1.1.1 编码和字体 a. ASCII b. ANSI c. UNICODE 1.1.2 UNICODE编码实现 1.2 ASCII字符点阵显示 1. ...

  3. linux开发板lcd按压,嵌入式Linux裸机开发(十五)——LCD

    嵌入式Linux裸机开发(十五)--LCD 一.LCD简介LCD(Liquid Crystal Display)是液晶显示器简称.LCD的构造是在两片平行的玻璃基板当中放置液晶盒,下基板玻璃上设置TF ...

  4. lcd命令 linux,嵌入式Linux裸机开发(十五)——LCD

    嵌入式Linux裸机开发(十五)--LCD 一.LCD简介 LCD(Liquid Crystal Display)是液晶显示器简称.LCD的构造是在两片平行的玻璃基板当中放置液晶盒,下基板玻璃上设置T ...

  5. 嵌入式 Linux 驱动开发你想知道的都在这

    最近看到公众号上写的一篇文章,关于嵌入式 Linux 驱动开发的方方面面,感觉提供不错,此处特意贴出来供大家参考借鉴. 1.嵌入式驱动开发到底学什么 嵌入式大体分为以下四个方向: 嵌入式硬件开发:熟悉 ...

  6. linux编译运行uart,嵌入式Linux裸机开发(七)——UART串口通信

    嵌入式Linux裸机开发(七)--UART串口通信 一.UART串口通信简介 通用异步收发器简称UART,即UNIVERSAL ASYNCHRONOUS RECEIVER AND TRANSMITTE ...

  7. 嵌入式Linux裸机开发(六)——S5PV210时钟系统

    嵌入式Linux裸机开发(六)--S5PV210时钟系统 一.时钟系统简介 外设工作需要一定频率的时钟,这些时钟都由系统时钟提供.系统时钟一般由外部低频24MHZ晶体振荡器通过锁相环电路PLL倍频产生 ...

  8. 嵌入式linux python移植过程_嵌入式linux项目开发(一)——BOA移植

    嵌入式linux项目开发(一)--BOA移植 项目目标:使用BOA.CGIC.SQLite搭建嵌入式web服务器 一.嵌入式web服务器BOA简介 在嵌入式设备的管理与交互中,基于Web方式的应用成为 ...

  9. 【嵌入式Linux】嵌入式Linux驱动开发基础知识之按键驱动框架

    文章目录 前言 1.APP怎么读取按键值 1.1.查询方式 1.2.休眠-唤醒方式 1.3.poll方式 1.3.异步通知方式 1.5. 驱动程序提供能力,不提供策略 2.按键驱动程序框架--查询方式 ...

  10. 【嵌入式Linux】嵌入式Linux驱动开发基础知识之LED模板驱动程序的改造:设备树

    文章目录 前言 1.驱动的三种编写方法 2.怎么使用设备树写驱动程序 2.1.设备树节点要与platform_driver能匹配 2.2.修改platform_driver的源码 3.实验和调试技巧 ...

最新文章

  1. poj1741(树的点分治)
  2. P4887 【模板】莫队二次离线(第十四分块(前体))
  3. c#读写XML文件 (转)
  4. windows如何安装python-手把手教你如何在windows系统安装python?
  5. C#协变和逆变 - 译
  6. 中国钢铁行业产量规模与十四五建设动态分析报告2022-2027年
  7. 缘何Square可以在移动支付领域上成功?
  8. 20岁,Universal GIS拥抱新生的GIS信创
  9. 一对多 java_mybatis一对多和多对一
  10. Flutter Provider 异步通信、Provider状态管理
  11. 电机振动噪声(NVH)——整数槽分数槽谐波分析补充
  12. 绘图板应用讲解计算机,如何用数位板在电脑上画画?5个板绘使用技巧分享!...
  13. Vray材质——金属材质
  14. 灌木修剪机的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
  15. Python int()使用小结
  16. 红米K40使用半个月,谈谈上手体验,“优缺点”非常明显!
  17. MRCP协议-提供语音识别(ASR)与语音合成服务(TTS)
  18. 宁夏新八景[之一]:古峡新韵
  19. Vue组件通信:父传子、子传父、跨组件通信
  20. 爱心捐赠爱传情 暖心行动暖寒冬

热门文章

  1. 火狐插件 打开html 死机,Firefox火狐Flash插件卡死问题完美解决方法(转载)
  2. android 六边形简书,六边形RecyclerView
  3. gnuplot详细操作
  4. 假设一张纸的厚度是1mm,那么这张纸折叠多少次可以到达珠穆朗玛峰的高度(8848m)?
  5. 采访:新浪微博架构师兼首席PHP技术顾问惠新宸谈PHP的架构与发展
  6. SQL Server选择题40个
  7. 线性代数学习笔记6-4:行列式的应用(用伴随矩阵求逆矩阵、克莱姆法则解方程、行列式求面积/体积)
  8. java中isolate时间_Flutter 92: 图解 Dart 单线程实现异步处理之 Isolate (一)
  9. 移动用户体验设计:iOS APP体验设计
  10. 笔记2~CSMA/CD协议