新闻中心

EEPW首页 > 嵌入式系统 > 设计应用 > 详解流程:嵌入式产品开发的各个阶段

详解流程:嵌入式产品开发的各个阶段

作者:时间:2019-03-22来源:网络收藏

  之前,我们详细讲述了产品的研发流程,那么在这一节,我们具体以产品的硬件部分为例,再次讲解其开发过程,希望通过这一节,大家能对硬件开发流程有更深刻的认识,在以后的学习和工作中,更加规范化和标准化,提高开发技能。嵌入式硬件开发流程一般如下图,分为8个阶段:

本文引用地址:http://www.eepw.com.cn/article/201903/398757.htm

  嵌入式产品的硬件形态各异,CPU 从简单的4 位/8位单片机到32 位的ARM处理器,以及其他专用IC。另外,依据产品的不同需求,外围电路也各不相同。每一次硬件开发过程,都需要依据实际的需求,考虑多方面的因素,选择最合适的方案来。

  硬件阶段1:硬件产品需求

  和普通的嵌入式产品需求一样。阶段1:产品需求。

  硬件阶段2:硬件总体设计方案

  一个硬件开发项目,它的需求可能来自很多方面,比如市场产品的需要或性能提升的要求等,因此,作为一个硬件设计人员,我们需要主动去了解各个方面的需求并分析,根据系统所要完成的功能,选择最合适的硬件方案。

  在这一阶段,我们需要分析整个系统设计的可行性,包括方案中主要器件的可采购性,产品开发投入,项目开发周期预计,开发风险评估等,并针对开发过程中可能遇到的问题,提前选择应对方案,保证硬件的顺利完成。

  硬件阶段3:硬件电路原理图设计

  在系统方案确定后,我们即可以开展相关的设计工作,原理设计主要包括系统总体设计和详细设计,最终产生详细的设计文档和硬件原理图。

  原理设计和PCB设计是设计人员最主要的两个工作之一,在原理设计过程中,我们需要规划硬件内部资源,如系统存储空间,以及各个外围电路模块的实现。另外,对系统主要的外围电路,如电源、复位等也需要仔细的考虑,在一些高速设计或特殊应用场合,还需要考虑EMC/EMI等。

  电源是保证硬件系统正常工作的基础,设计中要详细的分析:系统能够提供的电源输入;单板需要产生的电源输出;各个电源需要提供的电流大小;电源电路效率;各个电源能够允许的波动范围;整个电源系统需要的上电顺序等等。

  为了系统稳定可靠的工作,复位电路的设计也非常重要,如何保证系统不会在外界干扰的情况下异常复位,如何保证在系统运行异常的时候能够及时复位,以及如何合理的复位,才能保证系统完整的复位后,这些也都是我们在原理设计的时候需要考虑的。

  同样的,时钟电路的设计也是非常重要的一个方面,一个不好的时钟电路设计,可能会引起通信产品的数据丢包,产生大的EMI,甚至导致系统不稳定。

  原理图设计中要有“拿来主义”!现在的芯片厂家一般都可以提供参考设计的原理图,所以要尽量的借助这些资源,在充分理解参考设计的基础上,做一些自己的发挥。

  硬件阶段4:PCB图设计

  PCB设计阶段,即是将原理图设计转化为实际的可加工的PCB 线路板,目前主流的PCB 设计软件有PADS,Candence 和Protel几种。

  PCB设计,尤其是高速PCB,需要考虑EMC/EMI,阻抗控制,信号质量等,对PCB 设计人员的要求比较高。为了验证设计的PCB是否符合要求,有的还需要进行PCB 仿真。并依据仿真结果调整PCB 的布局布线,完成整个的设计。

  硬件阶段5:PCB加工文件制作与PCB打样

  PCB绘制完成以后,在这一阶段,我们需要生成加工厂可识别的加工文件,即常说的光绘文件,将其交给加工厂打样PCB 空板。一般1~4层板可以在一周内完成打样。

  硬件阶段6:硬件产品的焊接与调试

  在拿到加工厂打样会的 PCB空板以后,接下来我们,需要检查PCB空板是否和我们设计预期一样,是否存在明显的短路或断痕,检查通过后,则需要将前期采购的元器件和PCB空板交由生产厂家进行焊接(如果PCB 电路不复杂,为了加快速度,也可以直接手工焊接元器件)。

  当PCB 已经焊接完成后,在调试PCB之前,一定要先认真检查是否有可见的短路和管脚搭锡等故障,检查是否有元器件型号放置错误,第一脚放置错误,漏装配等问题,然后用万用表测量各个电源到地的电阻,以检查是否有短路,这样可以避免贸然上电后损坏单板。调试的过程中要有平和的心态,遇见问题是非常正常的,要做的就是多做比较和分析,逐步的排除可能的原因,直致最终调试成功。

  在硬件调试过程中,需要经常使用到的调试工具有万用表和示波器,逻辑分析仪等,用于测试和观察板内信号电压和信号质量,信号时序是否满足要求。

  硬件阶段7:硬件产品测试

  当硬件产品调试通过以后,我们需要对照产品产品的需求说明,一项一项进行测试,确认是否符合预期的要求,如果达不到要求,则需要对硬件产品进行调试和修改,直到符合产品需求文明(一般都以需求说明文档作为评判的一句,当然明显的需求说明错误除外)。

  硬件阶段8:硬件产品

  我们最终开发的硬件成功。一个完整的,完成符合产品需求的硬件产品还不能说明一个成功的产品开发过程,我们还需要按照预定计划,准时高质量的完成。才是一个成功的产品开发过程。   在PIC的单片机中有多种型号有内部RC振荡器的功能,从而省去了晶振,不但节省了成本,并且我们还多了两个IO端口可以使用。

  但是,由于RC振荡器中电阻、电容的离散性很大,因此,在有内部RC振荡器的单片机中,它的内部RAM中都会有一个名为OSCCAL的校准寄存器,通过置入不同的数值来微调RC振荡器的振荡频率。并且,单片机的程序存储器中,也会有一个特殊的字来储存工厂生产时测得的校准值。下面我以常用的12C508A和12F629为例加以说明。

  PIC单片机RC振荡器的使用及校准方法

  12C508A的复位矢量是程序的最高字0x1FF,这个字节生产商已经固定的烧写为MOVLW 0xXX,指令执行后,W寄存器中即为校准值XX,当我们需要校准时,那么,在紧接着的地址0x0应该是一条这样的指令:MOVWF OSCCAL。接下去RC振荡器就会以标准的振荡频率运行了。

  12F629的校准值也存放在最高字--0x3FF中,内容是RETLW 0xXX,但它的复位矢量却是0x0。这样,在我们需要校准RC振荡器时,在初始化过程中要加上下面两句:

  CALL 0x3ff

  MOVWF OSCCAL

  当然,你还要注意寄存器的块选择位。

  以前,我在做项目时,没太注意这个问题,这是因为在使用12C508A时,HI-TECH在进行编译时已经偷偷地替我们做了这项工作。它会在程序的0x0处自动加一条MOVWF OSCCAL。用12F629做接收解码代替2272时也没发生什么问题,但是在用被它作滚动码解码器时却发现接收距离的离散性很大。经多次试验终于找出是没对振荡器的振荡频率进行校正所至。

  因此,需要另外编写用于校正的语句,我用了两种方法来实现这个目的:

  1、用内嵌汇编的形式

  #asm //此段汇编程序用于将位于程序段3FFH的call 3ffh //内部RC振荡器的校准值放入校准寄存器,bsf _STATUS,5 //在进行C语言调试时应屏蔽这段程序movwf _OSCCAL#endasm

  2、用C语言标准形式

  const unsigned char cs @ 0x3ff; //在函数体外。..

  OSCCAL=cs; //仿真时屏蔽此句

  用这两种方法都有一个小缺陷--仿真时,程序无法运行,这是由于C编译器并没有为我们在0x3FF放置一条RETLW 0xXX的语句。因此,程序运行到这里之后,并没有把一个常数(校准值)放入W寄存器然后返回,而是继续执行这条语句的下一句--0x0及其之后的程序,也就是说程序到此就乱了。因此如程序后面注释所示,在仿真时,应先屏蔽这几句程序。在程序调试完成后,需要烧写时,把注释符去掉,再编译一次就可以了。

  我还有一种想法,不用屏蔽语句,那就是用函数来实现,就是在0x3FF起建立一个函数,函数体内只有一条语句,如下:

  char jz()

  {

  return 0;

  }

  当然,还要考虑C函数返回时,一定会选择寄存器0,实际上这个函数的起始地址应小于0x3FF。但是我找了我所能找到的参考资料,并上网找了多次,也没找到为函数绝对定位的方法,希望有知道的朋友指点一下。

  还有,12C508A是一次性编程的,并且0x1FF处的内容,我们是无法改变的,也就是说你在此处编写任何指令,编程器都不会为你烧写,或者说即使烧写了也不会改变其中的内容。

  可12F629是FLASH器件,可多次编程,如果你没有故意选择,正品的编程器(如Microchip的PICSTART PLUS)是不会对存有校准值的程序空间进行编程的。即使你无意中对这个程序空间进行了编程,你也可以用一条RETLW 0xXX放在0x3FF处再编程一次就可以了,但这个XX值可能是不正确的,需经实验确定(请参考后面说明)。

  为了检验OSCCAL的值对振荡器频率的影响,特编写了下面一个小程序进行验证:

  #include

  //*********************************************************__CONFIG(INTIO & WDTDIS & PWRTEN & MCLRDIS & BOREN & PROTECT & CPD);//内部RC振荡器普通IO口;无效看门狗;上电延时;内部复位;掉电复位;代码保护;数据保护//*********************************************************#define out GPIO0 //定义输出端#define jc GPIO3 //定义检测端

  //*********************************************************void interrupt zd(); //声明中断函数//主函数***************************************************void main(){

  CMCON=7;

  OPTION=0B00000011; //分频比为1:16,

  TRISIO=0B11111110;

  GPIO=0B00000000;

  WPU=0;

  T0IF=0;

  GIE=1;

  T0IE=1;

  while(1){

  if(jc)OSCCAL=0xFF;

  else OSCCAL=0;

  }

  }

  //中断函数*************************************************void interrupt zd(){

  T0IF=0;

  out=!out;

  }

  程序其实很简单,就是在中断中让out脚的电平翻转,翻转的时间为4096个指令周期,电平周期为8192个指令周期。而指令的周期又决定于RC时钟频率。在主程序中,不断的检测JC端口的电平,然后根据此端口电平的值修改OSCCAL寄存器的值。当然,最后从OUT脚的波形周期上反映出了OSCCAL寄存器的值改变。

  经用示波器测量(抱歉,手边没有频率计),JC端接地时,OUT端的电平周期为9.5毫秒左右;而JC端接正电源时,OUT端的电平周期为6毫秒左右。也就是说OSCCAL的值越大,单片机的时钟频率越高。并且,这个变化范围是很大的,因此,如果使用PIC单片机的内部RC振荡器时,对其振荡频率进行校正是十分必要的。这也是我在做滚动码接收解码器时,产品离散性很大的原因。望大家以后使用内部RC振荡器时能够注意到此点。

  但还有一点要注意,即使你对RC振荡器进行了校正,你也别指望这个4MHz的RC振荡器肯定会很标准,实际上它还是一个RC振荡器,它的振荡频率是电压、温度的函数,也就是说这个振荡频率会随着电压和温度的变化而变化,只是经校正后的值更接近4MHz罢了,这在产品开发的一开始就要注意的。


上一页 1 2 下一页

关键词: 嵌入式

评论


相关推荐

技术专区

关闭