嵌入式linux之裸机程序2(无图,详细了解需要下载文章末尾里pdf查看,还有配套讲解视频)

                              裸机程序的讲解

1 GPIO实验

1.1 原理介绍:汇编指令与原理图

从这两张图我们可以知道让gpb5输出0灯亮,输出1灯灭。如何让GPB5输出高低电平需要打开s3c2440数据手册来查找相应的控制寄存器。

1.2 用汇编点亮一个led

我们开始裸机程序的编写

上图是汇编程序的代码。这我根据韦东山老师写的jz2440程序自己改写的,第九行的地址就是数据手册里的gpbcon的地址,将他的10-11位设置成01就成了输出模式,然后我们赋予gpbdat寄存器0值,点亮led1,进入死循环。

1.3 Makefile分析

打开makefile

第一行代表的是目标文件和依赖文件

第二行是用arm-linux-gcc编译器来编译ledon.s得到led_on.o这个目标文件

第三行是将这个目标文件设置成地址为0的一个目标文件

第四行是将上面得led_on.elf转换成arm可以执行的二进制文件。

1.4 烧写

在烧写之前大家可以先看看1.5s3c2440的启动流程。

首先打开jflash软件,将烧写工程打开

这个文件我已经给大家放到资料文件中,打开之后我们选择一下芯片的型号为arm9,然后选择norflash的型号,注意在这里是无法用jlink下载程序到nandflash的,并没有与之相对应的芯片型号。选择之后我们点击targ-connect进行连接,连接好之后进行擦除然后打开要下载的二进制文件进行烧写,注意这里的地址为0

1.5 s3c2440启动流程 

在这里我们放一张图让大家更好的理解一下2440的启动流程

2440有两种启动方式,在2440上只有4ksram,他外接了64Msdram,并且有两种外存设备,norflashnandflashnorflash十分特别他的内部是可以执行程序的。当我们把程序下载到norflash可以不用在意栈的大小,但是nand里面的前4k才能够放到sram中,在设置栈的时候需要设置一下他的范围。Norflash启动时cpu的开始地址是从nor,nand启动的开始地址是0,硬件会自动把nandflash的前4k复制到nandflash.

1.6 C语言操作寄存器与运行环境

下面我们来看一下c语言关于mian函数的配置

在我们学习c的时候一直都是从写MIAN开始运行,但是为什么会是从main执行大部分人都不是很了解,其实main函数是一个跳转,他的前段也是汇编写启动文件,启动文件初始化当前程序环境,这种初始化分为软初始化和硬件初始化,上图中都有详细介绍,其中软件初始化的功能有三个,设置返回地址,调用main,清理工作

上图就是启动代码crt0.s他里面包含了栈的初始化和硬件的初始化,还有一个死循环进行清理工作。

1.7 c语言写控制led程序与makefile分析

首先分析c程序。.,前两行的宏定义,之后对*int *0x56000050进行赋值,对于第六行的gpfcon就是一个对地址赋值的操作,设置arm原理与前面汇编的操作相同。

我们再看一下makefile,第一行还是表示了目标文件与源文件的关系。

第二行将启动文件编译

第三行对c文件进行编译

第四行把这两个目标文件的地址确定下来,产生一个连接的代码

第五行把连接好的obj文件转变成arm能识别的二进制代码

第六行进行反汇编运算,在这里也可以不用执行。

到此整个运行完毕。

1.8 按键控制led灯  

接下来我自己修改一下韦东山老师的程序把他移植到mini2440。这里我们驱动一个蜂鸣器,现场演示。

2存储管理器原理

  下面我们开始介绍存储管理器的原理。

存储管理单元的作用是接受cpu传过来的地址,相应的访问对应的设备,在进行地址访问时候CPU是不需要具体访问到需要访问的设备,而是交给存储管理器来操作。存储管理器接受到地址后要做以下四件事情,1给一个片选信号选中要访问的设备 2bank选择信号 3

传输列地址  4 传输行地址

在这里我们穿插一下2440的启动方式便于我们更好的理解程序。2440有两种启动方式,第一种norflash启动,上电后开始运行nor上面的程序,进行关看门狗,初始化管理存储器,等等。另外一个nandflash启动,系统从0地址开始运行,但是由于2440本身硬件的程序原因,2440nand的前4K程序放到片内sram里面运行(也就是0地址),在这4K程序里面一般要写初始化的程序,最后将nand后面的程序放入初始化的sdram中运行。

这是用存储管理器使用sdram外设的流程。进行硬件初始化,之后我们通过配置存储控制器13个寄存器的设置值来操作相应的外设。

3 MMU原理

在介绍mmu之前我们需要介绍一下权限管理的原理。

 

我们在windows上看起来许多程序是同时运行的,其实不然,他们是分时段运行,每个程序或者说是每个进程轮流运行极小的时间,虽然时间对人来说很小,但是对程序来说已经够执行很多步骤,在这种轮流下我们就会有一种程序同时进行的感觉。第二个就是每个程序都有自己的地址空间,这是因为mmu的作用,如何没有地址空间的存在,我们实际访问的地址就是物理地址,这样造成的风险是很大的,如果我们不小心访问到硬件级别的地址,并且进行了不恰当的配置,就会造成系统崩溃等严重现象。因此程序的地址空间有效的防治了这个现象的出现。

从这张图上我们可以看到cpu发送的地址直接发送到存储管理单元为物理地址,经过mmu转化物理地址的地址成为虚拟地址。在arm上他们是列表关系,其他芯片上有一种虚拟地址=y函数*(物理地址)之类的关系。在这一章我们只需要有这种虚拟地址映射的概念就可以了,具体的页表转换不用深入研究.经过mmu执行程序会发现明显快很多。

 

4nandflash控制器原理

这是nandflash的原理图,我们可以看出来他只有8个复用总线,那么如何传输地址呢,这个就需要查看他的控制器寄存器配置和控制信号了。

  我在微机原理这门课程上已经学习了相关的配置,下面我就给大家简单说一下配置原理

例如在硬件上发送命令的话我们需要将CLE配置为高电平,才可以在总线上发送命令,其他的也是这样。在2440上我们只需要往NFADDR输入值,就会自动配置相关的使能端口,进行访问。

 

 

 

5中断控制器原理

首先来介绍一下arm7种模式。

arm7种工作模式,我们正常情况下都是系统模式,如果进入中断的话就会进入快中断模式,在进入之前我们需要保存r0-r7的原状态,之后再进入中断模式,在中断模式下会新加入r8-r15寄存器,当中断执行完成推出中断的时候r0-r7的值还是要还原,后面的寄存器虽然名字与系统模式下一样但是其实不是同一个,不做返回。

这是一个中断控制器的流程图。把引脚设置为中断模式,然后设置上升下降沿触发。并且需要配置优先级。

 

 

 

6系统时钟配置和uart原理

我们的开发板的晶振时钟是12M,通过倍频寄存器给cpu200Mhz它的频率叫fclk,再通过分频寄存器配置内存类设备的时钟hclk,普通外设串口等的时钟pclk

x上面这是一个时钟频率图

在本章我们再着重介绍一下位置无关码,位置无关码的意思就是地址实际上不是访问真实的那个地址,只是相对偏移的地址,也就是说使用无关码的话即使访问的地址没有被初始化不能使用也能继续执行下去,不会造成程序崩溃。无关码不能用在全局变量这种实际地址上。

上图就是串口的控制,首先要将对应的引脚设置为串口模式,然后我们在配置一下约定的波特率,流控,数据位,当然时钟也是要配置好的,配置好时钟之后才可以设置波特率。

之后我们就可以通过读取两个寄存器的值来获得收发的值。

7   lcd显示原理

本节我们来讲解一下lcd的工作流程

Lcd的原理图如上,我们需要控制它的垂直信号,水平信号,背光信号,时钟信号。

上面这个图讲的是lcd的工作原理,假设有一个电子颜色枪在屏幕后面,我们通过控制它的水平信号,垂直信号来进行图像的显示。他们的黑屏时间通过设置

这种时间来控制黑屏的面积。

Lcd的操作原理就是内存分配一块内存(frame buffer)来传输图像的颜色数据。将数据传送给lcd控制器,控制器根据传输的数据将图案扫描显示到LCD上。具体的LCD控制器的寄存器配置我们就不在介绍,主要是我也掌握不到位,大致流程还是和前面的控制器一样。

                                                     2018. 1.17     刘朋

 链接: https://pan.baidu.com/s/1Sn_3Blu-xncQLBS3zZk-7g 密码: wrdj

猜你喜欢

转载自blog.csdn.net/liupeng19970119/article/details/80154148