首页 > 行业信息 > 如何从零开始做一个单片机?
  • 如何从零开始做一个单片机?

  • 2018-02-24 16:20:45 阅读量:20089 来源:立创商城

今天给大家介绍一下从芯片制作开始,到最后编写驱动程序整个过程中,每一步所需要的知识。

每一个方向都值得一个人用一生去钻研,每一个步骤都有其自身的魅力。

第一步,做出实体芯片。

单片机一般理解为MCU(Microcontroller Unit,微控制单元)

包含定时器、ALU(Arithmetic Logic Unit,算术逻辑单元)、内存、寄存器、总线等部分

而普通的意义的单片机还包含GPIO、串口(UART)、DMA、协处理器、AD\DA等等。

看懂如下图

前置:计算机组成原理,微机原理。 

流水线 

前置:数字逻辑电路,集成电路设计及其EDA(LCED.CN)技术,verilog

把各个模块细分为寄存器级,比如移位运算器、节拍器、译码器、存储器等

module minicpu(clk, reset, run, in, cs, pcout, irout, qtop, abus, dbus, out);

 input clk,reset,run;

 input [15:0] in;

 output [1:0] cs;

 output [15:0] irout, qtop, dbus, out;

 output [11:0] pcout, abus;

 wire [15:0] qnext, ramout, aluout;

 reg [11:0] abus;

 reg halt, jump, pcinc, push, pop, thru, qthru, dbus2qtop, dbus2ram, dbus2obuf, ir2dbus, qtop2dbus, alu2dbus, ram2dbus, in2dbus;

 reg pop2, ir2abus, qtop2abus, qnext2abus;

 reg [11:0] pcout, pcnext;

 reg [15:0] out;

 statef statef0(.clk(clk),.reset(reset),.run(run),.halt(halt),.cs(cs));

 stackm stackm0(.clk(clk),.reset(reset),.load(dbus2qtop),.push(push),.pop(pop),.pop2(pop2),.thru(qthru),.d(dbus),.dthru(ramout),.qtop(qtop),.qnext(qnext));

 alu alu0(.a(qtop),.b(qnext),.f(irout[4:0]),.s(aluout));

 dpram #(16,10,1024) dpram0(.clk(clk),.load1(dbus2ram),.addr1(abus),.addr2(pcnext),.d1(dbus),.q1(ramout),.q2(irout));

物理上是这样的 

然后会调试BUG,看时序。

前置:时序用MODELSIM,综合用QUARTUS II 等等

然后此时才刚刚开始。

继续生成电路网表,时序收敛,如果不对继续返回上述流程继续调试。

前置:Synopsys

回顾一下 

 

此时应该生成版图文件,然后根据制造厂商提供的物理器件库进行最后的各种设计规则检查。

前置:集成电路版图设计,软件有Cadence:Virtuoso Layout Editor 

送到代工厂

还要懂元器件

前置:半导体物理,半导体器件物理,固体物理,电介质物理,量子力学,热力学与数理统计。 

根据得到的图表设计版图和工艺流程,大概是这样

前置:集成电路制造 

然后进行电气测试,电磁测试,最后封装。

前置:集成电路封装技术 

最后不能忘记出片的时候

焚香沐浴更衣,朝南拜三拜,祈祷不会有大问题。

第二步,设计系统驱动。

终于得到了物理上的片子

我们开始写汇编器,编译器。

本质上烧写进ROM的是这样的机器码。 

汇编器(把汇编语言变成机器码)

前置:perl

#!/usr/bin/perl -W

//********

*********//

print "*** LABEL LIST ***\n";

foreach $l (sort(keys(%label))){

    printf "%-8s%03X\n",$l,$label{$l};

}

$addr=0;

print "\n*** MACHINE PROGRAM ***\n";

foreach (@source){

    $line = $_;

    s/\w+://;

    if(/PUSHI\s+(-?\d+)/){

       printf "%03X:%04X\t$line",$addr++,$MCODE{PUSHI}+($1&0xfff);

    } elsif(/(PUSH|POP|JMP|JZ|JNZ)\s+(\w+)/){

       printf "%03X:%04X\t$line",$addr++,$MCODE{$1}+$label{$2};

    }elsif(/(-?\d+)/){

       printf "%03X:%04X\t$line",$addr++,$1&0xffff;

    } elsif(/([A-Z]+)/){

       printf "%03X:%04X\t$line",$addr++,$MCODE{$1};

    } else {

       print "\t\t$line";

    }

}

编译器 BISON和FLEX(把高级语言转换成汇编语言)

前置:编译原理

%{

#include 

%}

%union {char *s; int n;}

%token  NAME NUMBER

%destructor { free($$); } NAME NUMBER

%token  IF WHILE DO

%type  if0

%token GOTO ELSE INT IN OUT HALT

...

...

%%

int yyerror(char *s){ printf("%s\n",s); }

int main(){ yyparse(); }

%{

 #include 

 #include "y.tab.h"

 int n=0;

%}

...

...

while    {yylval.n=++n;return(WHILE);}

[0-9]+       {yylval.s=strdup(yytext);return(NUMBER);}

[a-zA-Z][a-zA-Z0-9]*    {yylval.s=strdup(yytext);return(NAME);}

.            {return(yytext[0]);}

%%

int yywrap(){ return(1);}

终于可以固化进ROM可以跑程序了,你还需要一段小型的开启代码(bootloader)

前置:汇编语言

start: JK start

       nop

       sdal 32

       sdah 0

       datp

loop:  ting

       inl

       ting

       inh

       jend cxcute

       nop

       jmp loop

       inc

excute: call 32

        nop

        jmp start

        nop

然后开始写操作系统

前置:ucos(嵌入式操作系统)

系统宏定义,系统功能配置,系统头文件,初始化文件,调度文件,任务管理文件

系统时间管理文件,信号量文件,邮箱文件,消息队列文件,内存管理文件,

系统服务文件,MAIN文件。

写操作系统中的任务

前置:C语言,数据结构,算法导论。

double KalmanFilter(const double ResrcData,

                                        double ProcessNiose_Q,double MeasureNoise_R,double InitialPrediction)

{

        double R = MeasureNoise_R;

        double Q = ProcessNiose_Q;

        static        double x_last;

        double x_mid = x_last;

        double x_now;

        static        double p_last;

        double p_mid ;

        double p_now;

        double kg;        

        x_mid=x_last; //x_last=x(k-1|k-1),x_mid=x(k|k-1)

        p_mid=p_last+Q; //p_mid=p(k|k-1),p_last=p(k-1|k-1),Q=噪声

        kg=p_mid/(p_mid+R); //kg为kalman filter,R为噪声

        x_now=x_mid+kg*(ResrcData-x_mid);//估计出的最优值

        p_now=(1-kg)*p_mid;//最优值对应的covariance        

        p_last = p_now; //更新covariance值

        x_last = x_now; //更新系统状态值

        return x_now;                

}

拿着含辛茹苦的板子还需要配置最小系统以及外围器件

前置:PCB设计和制造,电焊等技艺,模电、高频电子线路,信号与系统

如果有信号传输

通讯协议

前置:SPI,I2C,CAN,TCP/IP、wifi等等

uint SPI_RW(uint uchar)

{

uint bit_ctr;

for(bit_ctr=0;bit_ctr<8;bit_ctr++) // output 8-bit { MOSI = (uchar & 0x80);
 // output 'uchar', MSB to MOSI uchar = (uchar << 1); 
// shift next bit into MSB.. SCK = 1; 
// Set SCK high.. uchar |= MISO; // capture current MISO bit SCK = 0;
 // ..then set SCK low again } return(uchar); // return read uchar }

RF天线

前置:微波技术,电磁场与电磁波,HFSS,天线技术等等。

欢迎各位大神给予指导~

来源:知乎 

作者:彭谟威 

热门物料
型号
价格
LR8341A-T33/线性稳压器(LDO) 0.143
SN65LBC184DR/RS-485/RS-422芯片 3.75
ADS1256IDBR/模数转换芯片ADC 42.32
ADS1220IPWR/模数转换芯片ADC 16.35
TMS320F28035PNT/单片机(MCU/MPU/SOC) 18.66
TPS54331DR/DC-DC电源芯片 0.8793
ADS1115IDGSR/模数转换芯片ADC 6.22
AMC1200BDWVR/隔离放大器 3.69
DRV8870DDAR/电机驱动芯片 1.7
ISO3082DWR/RS-485/RS-422芯片 2.7
您的浏览器版本过低(IE8及IE8以下的浏览器或者其他浏览器的兼容模式),存在严重安全漏洞,请切换浏览器为极速模式或者将IE浏览器升级到更高版本。 【查看详情】
推荐您下载并使用 立创商城APP 或者最新版 谷歌浏览器火狐浏览器360浏览器搜狗浏览器QQ浏览器 的极(高)速模式进行访问。
© 2022 深圳市立创电子商务有限公司 版权所有

提示

您确定删除此收货地址吗?

提示

您确定删除此收货地址吗?

成功提示

content

失败提示

content

微信咨询

关注公众号咨询客服

咨询客服
  • 在线客服热线

    0755-83865666

  • 服务时间

    工作日  8:30~20:30

    节假日  8:30~18:00

  • 服务投诉

QQ咨询
优惠券
芯媒体

立创商城旗下芯媒体

微信号:icsight

建议反馈
填问卷 立创用户体验问卷调查 立即参与
活动规则
活动规则
展开客服