首先说明一下,我只是一个嵌入式的新手,之前在学校的时候只学过简单的51单片机、基础的C语言和数电模电。上课的时候听老师说过嵌入式,但对这个词没有什么概念,也不知道学嵌入式能干什么。虽然自己在网上看了很多关于嵌入式学习的帖子,但还是一知半解,不知该从何入手。那种茫然的感觉真挺郁闷的--!
快毕业了,有幸来到一家从事嵌入式产品设计的公司实习。在师傅的带领下开始接触基础的嵌入式开发。一个星期的岗前培训给我最大的感觉是:有人带比自己学快很多。也正是这个想法,让我打算通过日志记录自己每天的收获和感悟,分享给大家。希望能够通过这种形式和正在学嵌入式的朋友们互相交流,也真心希望能够得到行业内前辈们的指导。
PS:由于个人能力暂时比较有限,在这里不敢妄谈经验。不过帖子里每一步都是我亲自操作完成的,如果帖子描述的不是很详细,大家可以看一下操作视频。希望通过图文+视频的方式,将实现过程更清晰的呈现给大家,也希望各位前辈在闲暇之余能指点一下,这里先谢过了~(*^__^*) 嘻嘻……
先上视频了
第一次录的没经验,分辨率设置低了,上传优酷之后变得有点儿模糊,所以下面也给出了网盘地址,里面是视频源文件,70M左右
优酷版视频点击此处观看:v.youku.com/v_show/id_XNTM2NjY3MDg4.html
视频源文件网盘版下载地址:dl.vmall.com/c0v5iubcin
PS:等到视频录制结束之后再听才发现和之前的初衷差别蛮大的,尤其是开场白,这是后来加上的,感觉还不如不加呢o(╯□╰)o原本希望用一种轻松的语气和讨论的方式和大家交流,结果听起来很像是说教,过于正式和严肃了。第一次录制视频,心情比较复杂和忐忑,语言表达的也很不自然...希望在今后的视频中可以带给大家一种更加轻松的感觉。学习不一定是痛苦的,交流不一定是严肃的,简单一些,或许更自然。
第一期内容是最基础的无操作系统下基于ARM处理器流水灯的实现。
开发环境:WinXP
软件工具:RVDS2.2下的CodeWarrior、AXD,至于RVDS2.2软件,只要从网上下载并安装到自己的计算机上就可以了
硬件平台:ARM11 S3C6410处理器、J-LINK V8(使用前要安装相应的驱动哦~)
在这里想先和大家分享一个小感悟,这两天才发现的:
就以这个流水灯实现为例,之前在学校老师讲流水灯的实现用了6节课,而且听完了还不是很清楚。原因在于老师会先讲什么是寄存器,什么是寻址,然后是汇编的各个指令...其实这些内容里面和流水灯实现关联都不够紧密,听的很多,可没什么重点。如果从目标出发来看这个问题我觉得会更清晰。
流水灯为什么会亮->LED发光->LED为什么会发光->LED两端有了高低压差->LED两端为什么会有压差->电路连接一段是高电平另一端是ARM的某个管脚->只要ARM管脚输出低电平LED就会亮->ARM管脚如何输出低电平/哪个管脚输出低电平?
这样一想思路就清楚了。流水灯的实现也就很简单了:
1.查看原理图,找到连接LED的ARM管脚
2.查看ARM手册,找到这个管脚的位置及控制方法(寄存器)
3.使用某个软件(这里使用的是ADS)编写一个控制该寄存器程序
4.通过工具(JLINK)连接PC和处理器平台,把编写好的程序从PC机下载到处理器平台运行。
这是自己这几天实习的小感悟,换一种思路学习,或许会事半功倍,希望能给初学者朋友一些启发。
接下来是流水灯在ARM11处理器实现的具体内容:
首先是原理图和寄存器介绍:
这个呢,就是led的原理图,这里就可以明白的看到led是如何点亮的。VDD33V代表高电平,只要NLED3输出为低电平就可以点亮LED灯了。
这就是管脚的连接方式,这样就可以找到控制led的寄存器。方块里面的代表了ARM处理器的相关引脚和功能。
这三张截图向我们介绍了控制led灯的寄存器的概况
这时在RVDS2.2中创建一个工程,用到的软件就是CodeWarrior
这张图显示了在所建的工程中添加一个文本文件用来编写实现代码
代码写好之后,我们需要配置一下Release中的对应选项
配置图2
配置图3
配置图4
配置图5
在调试之前呢,我们需要添加相应的JLINK动态库
这张图中可以大致地看出JLINK的连接方式,连接比较简单,线都是防误插的,只要都连上就可以喽~
最后我在这里把视频中的代码也贴上来,希望朋友们可以用到:
Main.c
#define rGPMCON (*(volatile unsigned *)(0x7F008820))
#define rGPMDAT (*(volatile unsigned *)(0x7F008824))
#define rGPMPUD (*(volatile unsigned *)(0x7F008828))
void msDelay(int time)
{
volatile unsigned int i,j;
for(i = 0; i < 2000000; i++)
for(j=0; j<time; j++);
}
void GPIO_Init(void)
{
rGPMCON = 0x11111;//初始化控制寄存器,使每一个寄存器处于output状态
rGPMDAT = 0X1F;//初始化控制寄存器,使每一个灯都灭着
}
void LedTest(void)
{
volatile unsigned int i;
while (1)
{
for(i=0; i<4; i++)
{
rGPMDAT = ~(1<<i);//用位操作控制灯的循环点亮
msDelay(10);//延时10ms
}
}
}
void Main(void)
{
GPIO_Init();
LedTest();
}
Init.s
IMPORT Main
AREA |C$$code|, CODE, READONLY
global start
start
bl Main
END
裸机的相关知识比较少,这期就差不多讲完了。下期开始主要是Linux的相关内容,大家要是有什么想了解的知识点可以在帖子里面告诉我,只要是我会的,尽量录制在下期视频和大家交流。 |