一、 文章描述
本文主要粗略描述当前设计普通电子产品时,CPU最小系统相关描述。文章主要以当前rk3288核心平台的最小系统搭建为基础,通过涉及的硬件资源,来简述各自功能,目的,以及最终的电路实现。
本文主要主要分为以下几个方面来描述:
可编程控制处理器的最小系统应包含什么?(即跑一个处理器的必要条件);
CPU,RAM,ROM,REG相关简述;
RK3288最小系统电路简述
二、 可编程控制处理器的最小系统应包含什么
*2.1 何为可编程处理器?
何为可编程控制处理器?现阶段由于嵌入式涉及到各行各业,对于依照可重复擦写的处理控制器而言,名字多种多样,如单片机,arm,dsp,fpga,实际都是可编程控制处理器。
在80年代前,控制器就是控制器(PLC),处理器就是处理器(计算器),两个是不搭的东西。控制器顾名思义,是为了完成对应开关设备控制的设备,主要用于开关控制,流水线控制;而处理器则是将一些信息集中起来,进行运算处理,然后输出,主要用于科学研究,数学运算等场合。
后来由于人类业务层的需求逐步提升,所以一些控制器需要一些简单运算,则添加了对应的运算器,渐渐随着人类的需求提升,现阶段的可编程控制器的处理能力已经不亚于普通民用计算机;同时处理器希望资源共享,同外界设备运算能力协调互补,则需要一些外设的通讯口达到和其他计算机的互动,为了管理这些接口,则增添了一些控制部分。
所以现阶段,处理器和控制器都混为一团了。你中有我,我中有你,只是侧重点不一样,则占的权重性稍不同。
2.2 一个可编程处理器最小系统
为了让可编程处理器运转起来,一般情况分为开关机电路,复位电路,串口打印电路,处理器自身和外围电路几部分。
开关机电路:这个即开关电源作用,管控着当前最小系统的电源;
复位电路:实际是一个硬件中断事件的异常,用于告知处理器从“0”开始运行的入口,也就是系统运行之始,上电自带了上电复位逻辑,直接让处理器的PC寄存器直接指向reset的入口地址,也就是0位地址;
串口打印电路:这个之所以列入最小系统主要是用于打印当前系统的信息,一个系统的状态到底如何,肯定是它自运行检查是最清楚的,用户在设计系统需要观察某个端口或者寄存器的状态时,可通过其打印出数据;
处理器周围电路:处理器运行除了电源和复位电路外,还需要两个载体。一个是放置处理器程序的载体,一个是在运算时,存放寄存器的临时数据的载体;前者由于存储程序不可丢失,称之位ROM,后者只是存储临时数据,重点考虑的是速度,所以不需要保证掉电数据不丢失,称之为RAM.
三、 可编程控制处理器的RAM/ROM
对于一个CPU而言,它的程序放置在一块掉电不丢失的记忆体中,在CPU启动后,就会将这些数据加载到对应的指令总线上,按逻辑顺序运行。
而在运行中的数据,临时放置在一个高速的临时记忆体中。
上述描述就是ROM和RAM的最初基本用途。如下图,为一个CPU如何运行的简单框架:
面并没有将cpu写成逻辑运算器。这是由于上述所有模块都可能集成在CPU里面。实际为了保证cpu的正常运行,cpu内部都有ROM,RAM(或者寄存器)。在ROM里存放程序,在RAM存放临时数据。
当前由于需求不断的挑战,CPU的运算能力和可控制能力越来越强悍,功能也越来越丰富,产品的需求复杂度也越来越大,为了实现一个产品需求,则需要的资源越来越丰富了。
但是对于CPU而言,主要考虑是控制能力和运算能力,性能是最主要的,考虑其侧重点,成本,尺寸原因,处理器内部的RAM和ROM一般都很小,最大也就是个位M为单位,大多数都是K为单位的空间。
为了记录视频流等其他大数据的时候,就需要额外的存储体了。为了处理一些图像那些缓存占用较大的RAM场合时候,也需要额外的RAM了。
同时为了保证代码的模块化,系统化,迭代性,现在的代码都很大,尤其是一些带了文件系统运行环境的场合,为了兼容各个库,代码自身就大于RAM和ROM的需求。
为了解决上述问题,用户就需要扩展ROM和RAM.
3.1 嵌入式ROM
上述描述了ROM在嵌入式粗略应用。CPU自带ROM很小,可以通过地址总线的方式外扩ROM.
自带ROM符合地址总线访问,即处理器可以直接按照地址指令的方式直接获取指定地址的存储代码。但是由于大小一般在M级BYTEs内,所以一般只是存储的是CPU的初始启动代码,一般称作为bios或者uboot第一阶段代码。
外扩展ROM。外扩展ROM,分为两类。一类是兼容CPU地址总线,和CPU的自带rom一样,都是通过地址总线直接访问。实际对于一个CPU处理器在设计之初,考虑到扩展和规范,一般按照设备类型对地址总线的范围进行了划分,保证了一种类型地址一定量的预留。具体可以参照任何一个芯片的地址方面的资料。同CPU上其他片上模块资源一样(AD,UART,SPI等),对ROM也有预留,如符合地址总线的nor flash。
第二类是不和CPU地址总线直接兼容的存储模块。如nandflash,spi flash,sd卡,sdio flash,sata等等。他们是通过地址总线上的模块二次访问对应存储设备,比如EMMC接口,或者sdio接口,这些接口可以通过地址总线直接访问,然后这些接口可以通过配置对应模块寄存器达到访问对应存储器的目的,但是CPU不能直接通过地址总线在这些设备上取数据。
CODE存储体
所以实际运行的程序,都是在CPU可以直接访问的地址上设备运行。所以第二类设备上程序cpu不能直接解读,没有办法让PC寄存器直接取指运行。
Cpu上电后,直接运行的程序,即内部片上的flash,或者一定模式拨码切换映射到内部片上flash地址总线上的外部flash,即通过一定硬件模式切换,让CPU或者地址0x0000-内部flash大小的地址是在CPU内部,还是地址总线上对应的这个地址上。
而对于大的程序,由于内部存储机构放不下,则需要放置在外扩的外部ROM中,由于成本和地址范围问题(具体见后续关于CPU地址的相关文档),这些ROM往往选择的是第二类的ROM。但这些ROM却不能直接访问,而CPU运行指令,是指令总线自发的,所以需要将程序放到cpu能够直接访问的地址,而且这个地址需要都大,能够放置一些文件系统一些信息,一些操作系统调度资源,即RAM上。这就是片上程序首要工作,初始化RAM,将uboot的第二部分搬运到RAM上,然后PC指向RAM的首地址,同样UBOOT的第二阶段就会再次搬运外扩ROM中的内核搬到指定RAM上,再将PC指向内核首地址。
当然有些设备考虑速度,直接将uboot放入再外扩的ROM中,如并口nor flash中,cpu直接访问,不搬运uboot部分,直接运行nor上程序,搬运内核。
但考虑成本问题,一般都是用片上资源+第二类flash。
DATA存储体
这个一般都是采用第二类的rom。
3.2 嵌入式RAM
RAM最初目的是放置临时数据的。由于在运算时,是很多参数和条件运算。如:
I = a+ b + c;
b++;
a = b + I;
在这个过程中,运算单元最初只有两-3个入口(寄存器),因为运算单元 交互就这三个单元,但一个复杂运算不止需要这三个寄存器,那么在参与计算时,这些变量放置在哪里?而且这些变量会反复应用很多次,所以就需要一个放置这些数据的地方,我们成为RAM。在arm系列,RAM和寄存器时统一的地址排列,都是地址总线上一份子。
说白了,RAM就是arm上对这些寄存器缓存扩展。当然这是最初的使用。它可以看作一个模块,和其他外设一样,挂载在地址总线,CPU可以直接访问其内部数据,如同访问片上ROM,寄存器,和其他模块的访问端口地址总线一样。
由于RAM读写速度高于内部ROM的存储体,所以在RAM资源足够情况下,往往会在上电时,将程序拷贝到RAM中,然后跳入进去运行。尤其是code大于cpu片上ROM的场合。
即,RAM除了放置临时数据(变量),还可放置CODE。
四、 RK3288最小系统电路简述
4.1 电源上电电路
通过控制sw2来完成电源管理芯片的上电启动。一个上升沿完成开机,一个下降沿保持低电平6s以上完成关机。
4.2 复位电路
可以机械的按下按键达到控制PMIC发出复位信号给CPU复位。
4.3 UART电路
当前串口采用了串口2为debug口。
4.4 最小系统电路
当前RAM选择可扩展的RAM芯片,可以采用128M,256M,512M这样的方式pin to pin扩展。由于一个系列都是一样的封装和pin脚排序,完全兼容。当前考虑后续扩展,所以采用了4个RAM的方式。
调试时,注意测试时钟,用对应CPU公司的RAM测试软件,来确认RAM的布线是否可靠。
4.5 ROM
采用了EMMC接口的flash。由于pin to pin原因,当前默认为16G.下图为CPU上的flash接口,cpu的各个接口电源独立,这里从R106供入,且电压不一样,对应的速率不一样,有1.8v和3.3v两种模式,具体见芯片和flash速率。
五、 总结
由于结构简单,这里只是对最小系统简单阐述。后续在软件调试中,会再次对FLASH进行描述。
原作者:匠心源