GEC210 LED 裸机编程 原理介绍

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zhaozhi0810/article/details/72623005

GEC210 LED 裸机编程

 

开发环境: ADS1.2  或者 arm-linux-gcc4.4.1

开发板  : GEC210(s5pv210 soc)

 

 

原理部分:

Led的控制是单片机控制中最简单的部分,所以我们从这个开始入门。

对cpu而言,led的控制只有亮和灭,而cpu需要输出相应的高低电平即可控制led的亮和灭。

(注意我标识的几个关键字)

 

第一个步骤:看原理图

看原理图基本要弄清两个问题

a)   设备工作原理(可能需要查看相关理论知识及芯片文档)

b)   设备与cpu的连接关系

                                

图1 led原理图(210kfb-core-v11.pdf第11页)


图2 led与cpu的连接关系(210kfb-core-v11.pdf 第4页)

 

通过查看210kfb-core-v11.pdf文件相关led的部分,可以看到图1,图2的部分,我们截取了主要的相关部分

 

我们将两个图合并说明如下:


图3 led原理图

再看看这个图的原理,led的阳极通过限流电阻后,统一连接到电源3.3v的正极,为发光二极管提供电源,led的阴极连接到s5pv210的相关io引脚上。

 

此时,我们应该可以想到,s5pv210对应引脚的变化是不是就会引起led的亮和灭呢?

从原理图上我们可以看出对应引脚输出高电平,led就会熄灭,对应引脚输出低电平,led就会点亮。

(这个原理可能有些电路原理,可以参考百度中相关led的介绍。)

 

那么问题又来了:

怎么输出高电平,怎么输出低电平呢?

 

所以这个点我们还要关注led对应的cpu引脚

4个led分别对应GPJ2的0-3#引脚,每个引脚控制一个led。

怎么控制这个引脚输出的电平呢?

 

 

所以此时应该出现

第二个步骤:查看SOC(s5pv210)的文档(S5PV210_UM_REV1.1.pdf)

这个文档内容比较多(而且还是全英文的,大多数人的硬伤啊,有莫有?),好吧,我们暂时只关心GPIO的部分。

在文档的92页,文档的标题介绍了GPIO的概念(如果用过51单片机的话,就是类似P0,P1这样的io端口)

GENERALPURPOSE INPUT/ OUTPUT(通用目的的输入输出引脚)

1、S5PV210 includes 237 multi-functional input/ outputport pins and 142 memory port pins.(S5PV210包含了237个多功能输入输出引脚和142个存储引脚,这些都可以是通用的输入输出引脚)

2、There are 34 general port groups and 2 memory portgroups

   (上述这些引脚中,分了34个通用引脚组和2个存储端口组)

 

所以GPJ2看来是34个通用引脚组中的某一组了,哈哈

在92页的文档中果然就可以看到这些组了。

再往下看,就还有引脚的类型(普通引脚,快速引脚,DRAM引脚)


这个暂时可以不用关心,这是一些电气属性,基本属于硬件工程师考虑的范畴。

 

再往下,可以看到io引脚的驱动强度配置(驱动强度其实就是这个引脚能输出或输入电流的大小,因为电压和电流在一起就可以产生功率,在电压一定的情况下,改变电流大小就可以改变输出或输入功率)


对于led这一节来说,这个也不是我们需要考虑的问题,在图3中,我们看到计算的电流也就2.6mA,那么在这个表中最小的电流都超过了这个值,所以我们不需要关心这个驱动强度的配置。

 

 

好,这个文档关于GPIO总体介绍的部分我们可以暂时不看了,直接跳到相应的寄存器部分(177)。

对于所有的组,基本都有6个相应的控制寄存器名为CON,DAT,PUD,DRV,CONPDN,PUDPDN寄存器。(There are six control registers, namely, GPJ2CON, GPJ2DAT, GPJ2PUD,GPJ2DRV, GPJ2CONPDN and

GPJ2PUDPDN in thePort Group GPJ2 Control Registers. )

 

因为GPJ2PUD是设置上拉下拉电阻的, GPJ2DRV设置驱动强度的, GPJ2CONPDN设置休眠睡眠模式的配置 and GPJ2PUDPDN设置休眠睡眠模式的上拉下拉电阻的,暂时我们做最简单处理,就不关心这几个寄存器的配置了。

 

好接下来事情就好办了,只有两个寄存器需要我们认真关心,小开心一下吧。但是我们要认真理解一下这两个寄存器哦,第一次接触总有点疏忽,没关系,多看两遍了。。。

 

1、控制寄存器------配置引脚功能的寄存器(32bits


该寄存器有32位,每4位控制一个引脚的功能,所以该寄存器可以配置8个引脚的功能,每4个位的含义与具体描述相匹配

如果配置某个引脚为输出模式,即对应的4个位写为0001(二进制形式),等效于16进制的0x1。其他功能以此类推。

 

2、数据寄存器(注意该寄存器的描述部分)


1)让引脚配置成输入的时候,我们读取数据寄存器,可以得到引脚的输入状态值(0或1)

2)当一个引脚配置成输出的时候,可以通过该寄存器控制引脚的输出状态(0或1)

3)当引脚配置成功能引脚,读该寄存器的时候,读到的值是不确定的。

该寄存器只有8位,每一个位对应一个引脚。与CON寄存器的32位不同。

输出模式的时候,这个寄存器的某一位决定对应引脚的状态

输入模式的时候,这个寄存器的某一位反应(记录)了引脚的状态。

cpu的运算只能计算二进制的数值,而引脚是电平信号,二进制1就表示引脚的高电平,二进制0就表示引脚的低电平

 

 

好现在基本流程走完

我们通过上述已经知道

1)   led需要高低电平点亮或熄灭

2)   从原理图看出,led是高电平熄灭,低电平点亮

3)   对应的引脚找到,GPJ2组的0-3#引脚,一共4个引脚,每个引脚控制一个led

4)   GPJ2组的引脚我们需要配置为输出模式,修改GPJ2CON寄存器的值,比如配置第0#引脚,就设置GPJ2CON的低4位为0x1。

5)   改变GPJ2DAT寄存器的值,就可以改变GPJ2引脚的输出电平,比如让GPJ2DAT的最低位为0,GPJ2的0#引脚就会输出低电平,否则输出高电平。

 

怎么对这两个寄存器赋值?

汇编方式举例,配置GPJ2的0#引脚为输出模式

ldr r0,=0xe0200280     ;(0xe0200280是GPJ2CON的地址)

mov r1,#1

str r1,[r0]   

 

C语言方式呢?

思考:

知道一个地址(常数),如果向该地址下写数据。

1)0xe0200280 = 0x1;

2)GPJ2CON = 1;

 

*(unsigned int*)0xe0200280 = 1;

需使用指针间接访问哦。

 

好了原理就讲到这了。

写程序吧。

 

 

 

 

 

 

 

 

 

猜你喜欢

转载自blog.csdn.net/zhaozhi0810/article/details/72623005