当前位置: 首页 > news >正文

嵌入式GPIO接口及操作(一)

  GPIO意思就是通用输入输出,一些引脚可以通过他们输出高低电平,或者通过它们读入引脚的状态。
对GPIO的操作是对所有硬件的操作最基本的技能。
一、通过寄存器来操作GPIO引脚,一个引脚可以用于输入、输出或者其他的特殊功能,那么一定有寄存器来配置这些功能,
对于输入,就是读取引脚的状态,一定可以从寄存器在中读取到引脚的状态;对于输出,也有相应的寄存器,向寄存器中
写入数据使引脚输出高低电平;其他特殊功能,有另外的寄存器来控制它。
对于S3C2440来说,同样的道理,也会有上面所说的寄存器,GPxCON用于配置引脚的功能的(输入、输出或其他功能),
GPxDAT用于读/写引脚数据;另外GPxUP用于是否使用内部上拉电阻。
1、GPxCON寄存器-配置寄存器
对于S3C2440,除了GPACON特殊外(寄存器每一位对应一个引脚),其它都是寄存器的没2位控制一根引脚:00表示输入,
01表示输出、10表示特殊、11保留不用。
2、GPxDAT寄存器
用于读/写引脚:当引脚被设为输入时,从GPxDAT寄存器读取引脚的状态;当引脚被设为输出时,将数据写入GPxDAT寄存器
相应的引脚会输出相应的该低电平。
3、GPxUP寄存器
某位为1时,相应引脚无内部上拉电阻;某位为0时,相应引脚使用上拉电阻。

上拉电阻、下拉电阻的作用:GPIO为第三态时(相当于无外接芯片),引脚的电平状态有上拉电阻、下拉电阻确定。

二、在开发板上实现LED亮灭及按键控制LED
目标:通过读写GPIO寄存器来驱动LED、获取按键状态。
第一个例子使用汇编编写一个简单的驱动LED的程序,点亮LED首先看原理图是怎么接的,拿到原理图手册

可以看到led被点亮开发板gpio需要低电平,找到对应的开发板gpio。一目了然GPF4为0时LED1亮,1时灭,但是一个GPIO管脚可以是输出也可以是输入,所以,要配置GPIO的功能。

点亮led:
1、配置gpio的功能为输出,2、设置gpio输出高\低
配置输出功能,在数据手册上可以看到一个寄存器GPFCON,GPF4对应的位【9:8】做出相应的配置,管脚的复用
设置寄存器在数据手册上可以看到一个寄存器GPFDAT,【7:0】,当是输出功能时一位对应功能寄存器的一个引脚。这样4位就对应GPF4了。
GPFCON地址0x56000050  GPFDAT地址0x56000054
下面是汇编写的点亮一个LED程序:

led_on.S

.global _start  
_start:  
            LDR R0,= 0x56000050  @R0为GPFCON寄存器,此寄存器用于选择引脚的功能  
            MOV R1,#0x00000100     
            STR R1,[R0] @将数值写进寄存器里也就是配置了引脚的相应的功能  
            LDR R0,= 0x56000054 @R0为GPFDAT寄存器,此寄存器用于设置相应管脚的值,高低电平  
            MOV R1,#0x00000000   @设置相应管脚输出0电平,可让LED1灯亮  
            STR R1,[R0] @将数值写进寄存器里也就是设置了引脚的相应的输出电平  
MAIN_LOOP:  
                    B    MAIN_LOOP     @循环

下面是相应的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

将生成的bin文件烧到开发板即可点亮LED。

转载于:https://www.cnblogs.com/Ye-Jason/p/7353659.html

相关文章:

  • Redis源代码剖析--对象object
  • JavaScript 基本语法
  • 四轴遥控器ADC部分
  • 代码备忘, TODO宏实现
  • html2canvas页面截图图片不显示
  • 4.5 以卫语句取代嵌套条件式
  • 最近面试js部分试题总结
  • DP 网易内推:合唱团
  • Concatenated Words
  • 差异表达基因分析:差异倍数(fold change), 差异的显著性(P-value) | 火山图
  • js引用类型
  • windows多线程应用编程注意事项
  • python的md5和base64加密
  • 【Spring】DispatcherServlet源码分析
  • Hive架构
  • 网络传输文件的问题
  • 时间复杂度分析经典问题——最大子序列和
  • 2019年如何成为全栈工程师?
  • CNN 在图像分割中的简史:从 R-CNN 到 Mask R-CNN
  • Docker 笔记(2):Dockerfile
  • ES6系统学习----从Apollo Client看解构赋值
  • extjs4学习之配置
  • Promise面试题2实现异步串行执行
  • 从0搭建SpringBoot的HelloWorld -- Java版本
  • 观察者模式实现非直接耦合
  • 算法-图和图算法
  • 吐槽Javascript系列二:数组中的splice和slice方法
  • 用 vue 组件自定义 v-model, 实现一个 Tab 组件。
  • 云栖大讲堂Java基础入门(三)- 阿里巴巴Java开发手册介绍
  • 做一名精致的JavaScripter 01:JavaScript简介
  • ​ 轻量应用服务器:亚马逊云科技打造全球领先的云计算解决方案
  • ​一、什么是射频识别?二、射频识别系统组成及工作原理三、射频识别系统分类四、RFID与物联网​
  • (1)(1.13) SiK无线电高级配置(六)
  • (10)STL算法之搜索(二) 二分查找
  • (9)YOLO-Pose:使用对象关键点相似性损失增强多人姿态估计的增强版YOLO
  • (AtCoder Beginner Contest 340) -- F - S = 1 -- 题解
  • (C++17) optional的使用
  • (万字长文)Spring的核心知识尽揽其中
  • (一)C语言之入门:使用Visual Studio Community 2022运行hello world
  • (原創) 人會胖會瘦,都是自我要求的結果 (日記)
  • (转)大道至简,职场上做人做事做管理
  • .bat批处理(七):PC端从手机内复制文件到本地
  • .form文件_一篇文章学会文件上传
  • .NET 命令行参数包含应用程序路径吗?
  • .Net6使用WebSocket与前端进行通信
  • .NET国产化改造探索(三)、银河麒麟安装.NET 8环境
  • @GetMapping和@RequestMapping的区别
  • @WebServiceClient注解,wsdlLocation 可配置
  • [ C++ ] 继承
  • [ vulhub漏洞复现篇 ] Celery <4.0 Redis未授权访问+Pickle反序列化利用
  • [2019.3.20]BZOJ4573 [Zjoi2016]大森林
  • [Android开源]EasySharedPreferences:优雅的进行SharedPreferences数据存储操作
  • [BIZ] - 1.金融交易系统特点
  • [BUG]vscode插件live server无法自动打开浏览器
  • [C#]winform使用引导APSF和梯度自适应卷积增强夜间雾图像的可见性算法实现夜间雾霾图像的可见度增强