热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

第一部分:S5PV210_GPIO_LED_1

今天开始从ARM的最简单的部分开始写博客了那就是通过设置GPIO来点亮LED灯。第一步,先看原理图和硬件工作原理由硬件工作原理图我们可以知道,要想LED亮,只需要将GPJ0端

  今天开始从ARM的最简单的部分开始写博客了

  那就是通过设置GPIO来点亮LED灯。

第一步,先看原理图和硬件工作原理

 

由硬件工作原理图我们可以知道,要想LED亮,只需要将GPJ0端设置为低电平,并且为输出状态,就可以了,这里我们只设置前面三个GPJ0端口的。

对应的GPIO是:GPJO_3,GPJO_4,GPJO_5,

第二步,查看数据手册

(1)第一步,看涉及哪些寄存器

  

我们一共看到GPJ0相关的有6个寄存器,相应寄存器的作用是:

GPJ0CON:(地址:0xE0200240)(control)控制寄存器,配置各引脚的工作模式

GPJ0DAT:(地址:0xE0200244)(data)当引脚为输入/输出模式时,寄存器相应位和引脚高低电平一致

GPJ0PUD:(pull up down):控制引脚内部弱上拉,下拉

GPJ0DRV:(driver)配置引脚的驱动能力

GPJ0CONPDN:

GPJ0PUDPDN:

总结:也就是我们只需要写GPJ0CON寄存器和GPJ0DAT寄存器就可以了

(2)看GPJ0CON寄存器

往寄存器写1可以设置为输出模式了。(初始值为0,默认为输入模式)

(2)看GPJ0DAT寄存器

这里有两个问题:为什么设置为低电平和输出状态呢?

1.我们都知道电流是从电压高的流向电压低的时候,LED灯就会亮了,而左边端口是接高电压,所以右边端口就肯定是接低电平了,就设置为0就好了。

 

2.从数据手册我们可以看到:

  当端口被设置为输入模式的时候,我们寄存器GPJ0DAT所对应的位的数据(1或者0)是由GPJ0接口上的状态来决定的(高低电平)(也就是寄存器上的值是由GPJ0接口决定的).也就是端口上是低电平,那么寄存器上的值就是0.端口上是高电平,寄存器上的值就是1了。

  当端口被设置为输出模式的时候,GPJ0接口上的状态就和我们寄存器上的值是一样的(就是GPJ0接口上的状态是由寄存器上的值来决定的)。也就是说我们往寄存器上写0,端口上就是低电平;我们往寄存器上写1,端口上是就是高电平。

这就是我们为什么用输出模式了。往寄存器写0可以设置为低电平了。(初始值为0,默认为低电平)

第三步,写代码

先用汇编代码来写

(1)功能:全部灯亮

1  _start:                        //这里用的是ldr的伪命令,就是不用区分合法立即数还是非法立即数,=就是伪,%#就是真
2     ldr r0, =0xE0200240            //0xE0200240对应的是GPJ0CON寄存器,它就是控制接口的状态的,是输出还是输入
3     ldr r1, =0x11111111            //0x11111111就对应着8个接口的状态,1就表示输出状态,0就表示输入状态,每个接口就有
4     str r1, [r0]                //8个状态,其他状态可以查数据手册就知道了
5 ldr r0, =0x0 //这里的0表示的就是输出了低电平,如果是1的话就输出的是高电平 6 ldr r1, =0xE0200244 //0xE0200244对应的是GPJ0DAT寄存器,它就是用来输出什么的,是输出高电平还是低电平 7 str r0, [r1]

(2)功能:用位操作来实现指定的灯亮

 1 .global _start
 2  _start:                        
 3     ldr r0, =GPJ0CON            
 4     ldr r1, =0x11111111
 5     str r1, [r0]                    
 6     
 7     ldr r0, =(1<<3) | (0<<4) | (1<<5)        //这里就是使用了那个或运算,和左移,它的作用和0x2的作用一样            
 8     ldr r1, =GPJ0DAT                        //在中间加了那个0是为了比较容易看清楚代码的作用
 9     str r0, [r1]
10     
11     b .                                    //和那个b . 的作用是一样的啊

(3)功能:一个延迟函数的写法,及其汇编代码的解释

 1 delay:
 2     ldr r2, =9000000
 3     ldr r3, =0x0
 4     
 5 delay_loop:
 6     sub r2, r2, #1                        //这里就是等价于:sub r2, #1,其实就是r2 = r2 - 1;  
 7     cmp r2, r3                    
 8     bne delay_loop
 9     mov pc, lr                    
10     
11  
12  /*
13  总结:
14  1. bne用法:
15  bne指令: 非零则跳转
16 
17 个人总结:cmp 和bne连用: 先是用cmp进行那个比较,然后将比较的结果与0比较,如果不为0,则跳到bne紧跟着的标记(如bne sleep,则跳到sleep处)。就是说不相等就跳转。
18 
19 2.cmp的用法:
20 cmp是比较指令,cmp的功能相当于减法指令。它不保存结果,只是影响相应的标志位。ZF (Zero Flag):零标志位。
21 它记录相关指令执行后,其结果是否为0
22 其他的指令通过识别这些被影响的标志位来得知比较结果。
23 
24 cmp指令格式:   cmp   操作对象1, 操作对象2
25 
26 计算 操作对象1 - 操作对象2 但不保存结果,只是根据结果修改相应的标志位。
27 也就是说它把标志位修改成了1了。因为不相等就跳转,并且不为零就跳转
28 
29 3.b指令和bl指令的区别:
30 B或BL指令引起处理器转移到“子程序名”处开始执行。两者的不同之处在于BL指令在转移到子程序执行之前,
31 将其下一条指令的地址拷贝到R14(LR,链接寄存器)。由于BL指令保存了下条指令的地址,
32 因此使用指令“MOV PC ,LR”即可实现子程序的返回。而B指令则无法实现子程序的返回,只能实现单纯的跳转。
33 用户在编程的时候,可根据具体应用选用合适的子程序调用语句。
34 
35 b delay :就可以跳转到delay下面的那个程序那里执行了,和bl delay也可以
36 
37  */

用c语言来写

(1)功能:一闪一闪的

 1 #define GPJ0CON  0xE0200240            
 2 #define GPJ0DAT  0xE0200244
 3 
 4 void delay(void);
 5 
 6 //这个函数就用来实现一闪一闪的功能
 7 void led_blink(void)
 8 {
 9     unsigned int *p = (volatile unsigned int *)GPJ0CON;        //强制类型转换
10     unsigned int *p1 = (volatile unsigned int *)GPJ0DAT;
11     
12     *p = 0x11111111;                //把那个接口的模式调为输出模式
13     
14     while(1)            //死循环
15     {
16         //点亮
17         *p1 = (0<<3)|(0<<4)|(0<<5);        
18     
19         //延迟
20         delay();
21     
22         //熄灭
23         *p1 = (1<<3)|(1<<4)|(1<<5);                //这里写成了那个*p = (1<<3)|(1<<4)|(1<<5),出错了
24                                                 //就是把接口关闭了,所以后面就不亮了
25         //延迟
26         delay();
27     }
28 
29 }
30 
31 
32 void delay(void)
33 {
34     volatile unsigned int i = 900000;        //volatile的意思就是让编译器不对这进行那个优化了
35                                             //如果进行了优化,就可能起不到延迟的功能了
36     while(i--);
37 }

参考来源:朱老师物联网大教程


推荐阅读
  • 在进行QT交叉编译时,可能会遇到与目标架构不匹配的宏定义问题。例如,当为ARM或MIPS架构编译时,需要确保使用正确的宏(如QT_ARCH_ARM或QT_ARCH_MIPS),而不是默认的QT_ARCH_I386。本文将详细介绍如何正确配置编译环境以避免此类错误。 ... [详细]
  • 本文详细介绍了C语言的起源、发展及其标准化过程,涵盖了从早期的BCPL和B语言到现代C语言的演变,并探讨了其在操作系统和跨平台编程中的重要地位。 ... [详细]
  • 深入理解 SQL 视图、存储过程与事务
    本文详细介绍了SQL中的视图、存储过程和事务的概念及应用。视图为用户提供了一种灵活的数据查询方式,存储过程则封装了复杂的SQL逻辑,而事务确保了数据库操作的完整性和一致性。 ... [详细]
  • XNA 3.0 游戏编程:从 XML 文件加载数据
    本文介绍如何在 XNA 3.0 游戏项目中从 XML 文件加载数据。我们将探讨如何将 XML 数据序列化为二进制文件,并通过内容管道加载到游戏中。此外,还会涉及自定义类型读取器和写入器的实现。 ... [详细]
  • C++构造函数与初始化列表详解
    本文深入探讨了C++中构造函数的初始化列表,包括赋值与初始化的区别、初始化列表的使用规则、静态成员初始化等内容。通过实例和调试证明,详细解释了初始化列表在对象创建时的重要性。 ... [详细]
  • 本文汇总了在正式宴会上常用的寒暄语句,包括欢迎词、感谢词及日常问候,适用于各种正式场合。这些语句不仅有助于提升交际礼仪,还能增进彼此之间的友好关系。 ... [详细]
  • PHP 5.5.0rc1 发布:深入解析 Zend OPcache
    2013年5月9日,PHP官方发布了PHP 5.5.0rc1和PHP 5.4.15正式版,这两个版本均支持64位环境。本文将详细介绍Zend OPcache的功能及其在Windows环境下的配置与测试。 ... [详细]
  • 深入理解Java泛型:JDK 5的新特性
    本文详细介绍了Java泛型的概念及其在JDK 5中的应用,通过具体代码示例解释了泛型的引入、作用和优势。同时,探讨了泛型类、泛型方法和泛型接口的实现,并深入讲解了通配符的使用。 ... [详细]
  • 解决JAX-WS动态客户端工厂弃用问题并迁移到XFire
    在处理Java项目中的JAR包冲突时,我们遇到了JaxWsDynamicClientFactory被弃用的问题,并成功将其迁移到org.codehaus.xfire.client。本文详细介绍了这一过程及解决方案。 ... [详细]
  • 本题探讨如何通过最大流算法解决农场排水系统的设计问题。题目要求计算从水源点到汇合点的最大水流速率,使用经典的EK(Edmonds-Karp)和Dinic算法进行求解。 ... [详细]
  • 尽管深度学习带来了广泛的应用前景,其训练通常需要强大的计算资源。然而,并非所有开发者都能负担得起高性能服务器或专用硬件。本文探讨了如何在有限的硬件条件下(如ARM CPU)高效运行深度神经网络,特别是通过选择合适的工具和框架来加速模型推理。 ... [详细]
  • 解析SQL查询结果的排序问题及其解决方案
    本文探讨了为什么某些SQL查询返回的数据集未能按预期顺序排列,并提供了详细的解决方案,帮助开发者理解并解决这一常见问题。 ... [详细]
  • 利用决策树预测NBA比赛胜负的Python数据挖掘实践
    本文通过使用2013-14赛季NBA赛程与结果数据集以及2013年NBA排名数据,结合《Python数据挖掘入门与实践》一书中的方法,展示如何应用决策树算法进行比赛胜负预测。我们将详细讲解数据预处理、特征工程及模型评估等关键步骤。 ... [详细]
  • Coursera ML 机器学习
    2019独角兽企业重金招聘Python工程师标准线性回归算法计算过程CostFunction梯度下降算法多变量回归![选择特征](https:static.oschina.n ... [详细]
  • yikesnews第11期:微软Office两个0day和一个提权0day
    点击阅读原文可点击链接根据法国大选被黑客干扰,发送了带漏洞的文档Trumps_Attack_on_Syria_English.docx而此漏洞与ESET&FireEy ... [详细]
author-avatar
chung
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有