裸板实验程序解析

首先明确目标:点亮LED

怎样才能点亮LED?
查看原理图,LED灯连接在CPU管脚上,只要控制该管脚输出高低电平就可以控制LED通断。
怎么控制管脚输出高低电平?
两个步骤配置相应寄存器:
1.配置管脚功能(输入/输出/其他功能);
2.设置输出值0/1,即高/低;
怎么布置代码文件及编译?
有两种方式布置代码文件:
1.直接用汇编代码配置CPU寄存器;
2.汇编+C代码;
为什么不能只用C代码实现?
C语言程序是以main函数为入口,main函数并没有什么特别之处,也要被别人调用,并执行返回。在没有启动文件的情况下,C程序自己不能被执行。因此不能只用C代码实现点灯的功能。

下面我们来讨论使用汇编+C代码实现的方式实现目标过程中遇到的问题:
C程序中main函数被谁返回?返回到哪里?
我们平时在有操作系统的主机上开发程序时,系统中有一些库或启动文件,加上我们的应用程序。那么我们的应程序中的main函数就由启动文件或库来调用。main函数执行完,再回到系统库函数中,由其来做一些清理工作。
在裸机程序中,类似的库或启动文件就没有操作系统提供了,都要开发者自己写。这里的库或启动文件也可称作软件相关的初始化。这一部分就是在汇编代码中实现的。除此之外,我们的汇编代码中还应包括硬件初始化。
软件初始化要做的哪些事情?
1设置栈
2设置main的返回地址;
3调用main;
4清理工作。

硬件初始化做哪些事情?
1.关闭看门狗;
2.初始化时钟;
3.sdram初始化;


下面我们针对以上提到的汇编代码中软硬件初始化工作来分析,为什么要做这些工作:
在大型软件的编写过程中,为了提高代码的可读性和易移植性,我们一般选用C语言进行代码编写。C语言中,函数的调用是非常普遍的。函数调用、跳转过程中需要传递的参数和函数返回时要返回的值需要放在一段内存中,这个过程叫数据压栈。因此在调用main函数之前要指定栈,即设置栈。
什么是设置栈?即把栈指针sp指向某块内存。
既然要把栈指针指向某块内存,就要涉及到内存介质初始化的问题。上面设置的栈的内存正好是片内的sram上,不需要单独做初始化。如果该内存指向片外的sdram,就要先初始化sdram,以便读写。sdram初始化就是属于硬件初始化。
1.为什么要关看门狗?
什么是看门狗?
对于看门狗的初步认识,在一篇短文中有介绍 《认识看门狗》 
简单的说,看门狗就是为防止系统长时间挂起或跑飞而设置的一个开关。其实质是可以定时重启系统的东西。如果系统在看门狗的定时器定时耗尽之前把它清零,则系统不会重启,我们也认为此事系统没有出现长时间挂起或跑飞的问题。反之,则看门狗会把系统重启。
为什么要关闭呢?
在我们的程序中,由于不是很复杂的系统,没有独立的部分用来定时清零看门狗的定时器,所以索性把看门狗关闭,否则系统会不断重启,影响我们进行实验。
可不可以不关闭?
想不关闭看门狗也可以,不过按照上面介绍的,我们必须在其定时器耗尽之前将其清零。但是在我们一段只用汇编语言完成的LED点亮代码中,确实没有关闭看门狗,也没有出现什么异常现象,为什么?由于点亮LED操作简单,汇编只有对两个寄存器的操作,程序运行时间很短,即使我们没有关闭看门狗,系统发生重启,对于我们点亮LED也毫无影响,因为CPU重启及代码运行很快,人眼分辨不出LED闪烁,说以没有影响实验。该实验代码为方便才没做关闭看门狗的工作。
2.初始化时钟:为什么初始化时钟?
系统刚启动时,由外部晶振提供系统时钟,晶振频率很低,有些开发板上只有几兆几十兆。这个频率对CPU来说太低。目前市面上的CPU工作频率一般在1.5G左右,外部晶振频率不能直接使用,需要初始化设置后达到高频率状。除CPU频率外,系统一般还会有sdram频率(HCLK)和串口定时器(PCLK)等,这些都需要在初始化时钟时进行设置。这就是初始化时钟部分的工作。具体系统时钟工作另行说明。
3.初始化sdram(为什么初始化sdram?sdram是外部扩展的,存储空间较大,速度较慢,如果程序放在sdram中)另行说明。
以上是硬件初始化说明。

软硬件初始化合起来就是启动文件。本实验中不关心速度的问题,因此不做时钟初始化;而且代码在片内sram中直接启动,因此不适用sdram,故不用初始化。因此上面硬件初始化中,只需做关闭看门狗的工作。
在点亮led的实验中,硬件初始化只需做关闭看门狗的工作。原因是,点亮led时钟慢点没关系,不用初始化时钟;实验平台用的是片内sram,不用初始化sdram。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/53cfc2ae1a296179fb8b6569c0283660.html