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;
需使用指针间接访问哦。
好了原理就讲到这了。
写程序吧。