你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

如何从零造单片机?

[复制链接]
gaosmile 发布时间:2021-1-7 12:12
来来来,让我们一起,左手右手一个慢动作。每一个方向都值得一个人用一生去钻研,每一个步骤都有其自身的魅力。8 w" Y3 ~2 d/ }9 u, W
第一步,做出实体芯片。: l8 v' Z1 d" u" ?+ |  f
单片机一般理解为MCU(Microcontroller Unit,微控制单元),包含定时器、ALU(Arithmetic Logic Unit,算术逻辑单元)、内存、寄存器、总线等部分。而普通的意义的单片机还包含GPIO、串口(UART)、DMA、协处理器、AD\DA等等。8 {9 R7 R" A" G6 ]
看懂如下图前置:计算机组成原理,微机原理。1 L- i5 m# q* w9 O
微信图片_20210107120741.png
6 J1 i$ Y/ a$ Q2 h# `流水线- d& P% j' D2 s9 i
微信图片_20210107120746.jpg / D5 V# i/ d* U& a( S& u: c
前置:数字逻辑电路,集成电路设计及其EDA技术,verilog4 x& `9 ]. [' z+ p, n6 l' R/ X
把各个模块细分为寄存器级,比如移位运算器、节拍器、译码器、存储器等
5 I4 ]+ c% G/ o, Q# x
  1. : Y9 E. [4 v+ ?6 V5 n7 Y  e
  2. module minicpu(clk, reset, run, in, cs, pcout, irout, qtop, abus, dbus, out);) y8 `4 [# A. v7 T
  3. ' Z* F! Y" ^9 G! T/ J4 c
  4. input clk,reset,run;
    " ^( }6 X) ~9 X. _! o
  5. input [15:0] in;. v+ F5 C+ Y+ i" x, i- Z' h
  6. output [1:0] cs;
    & i( n0 Y. @, a" E4 g& U& ~
  7. output [15:0] irout, qtop, dbus, out;
    7 X4 s( C: d3 U
  8. output [11:0] pcout, abus;
    : j- l+ B$ b( L* @& n3 c5 `4 c
  9. wire [15:0] qnext, ramout, aluout;
    ( P3 o7 x3 F/ y1 s- K7 k6 k
  10. reg [11:0] abus;
    : n$ I5 x+ [9 u& X9 H& I
  11. reg halt, jump, pcinc, push, pop, thru, qthru, dbus2qtop, dbus2ram, dbus2obuf, ir2dbus, qtop2dbus, alu2dbus, ram2dbus, in2dbus;
    2 _4 T) D! z/ K& P8 h- S$ J
  12. reg pop2, ir2abus, qtop2abus, qnext2abus;. A4 V, Y) ~2 l' ]3 G! B1 o
  13. reg [11:0] pcout, pcnext;
    8 B# A3 ]7 k2 U
  14. reg [15:0] out;
    : f& f& a2 \9 b( ^
  15.   T1 l, R# a: h% {0 r* |
  16. statef statef0(.clk(clk),.reset(reset),.run(run),.halt(halt),.cs(cs));
    , q- u$ ]- T9 n) L3 _, e
  17. stackm stackm0(.clk(clk),.reset(reset),.load(dbus2qtop),.push(push),.pop(pop),.pop2(pop2),.thru(qthru),.d(dbus),.dthru(ramout),.qtop(qtop),.qnext(qnext));
    5 z" I* p* m2 _0 m
  18. alu alu0(.a(qtop),.b(qnext),.f(irout[4:0]),.s(aluout));9 |$ g1 p7 u' R5 N! K: M! Y4 V- `
  19. dpram #(16,10,1024) dpram0(.clk(clk),.load1(dbus2ram),.addr1(abus),.addr2(pcnext),.d1(dbus),.q1(ramout),.q2(irout));
    $ k5 T2 V  C/ M* e9 U
复制代码

3 }1 F6 N+ m; _' J9 V- k
物理上是这样的
* e; f- x" ?+ }8 m3 j
$ j* L0 d' H# }( X
微信图片_20210107120749.jpg & a, C% ]! ]! z  {7 g
然后会调试BUG,看时序。0 o6 y3 q* [7 Z* y- r
前置:时序用MODELSIM,综合用QUARTUS II 等等
* i1 o7 [6 i+ p
9 d' x; g. K. f4 g. f
然后此时才刚刚开始。, Z) \0 W! Q# y- w5 I7 M! c
继续生成电路网表,时序收敛,如果不对继续返回上述流程继续调试。
+ n- Q3 C9 ]: i' Z9 R7 I  D前置:Synopsys
回顾一下
% F5 b8 m: u) t& d& c% S- v
  \4 f( [) t+ I# e8 j+ W! t
微信图片_20210107120752.png

' h+ u) G% w. ]$ K, ?

9 q" u$ G. e* W, |3 v+ f6 i
. ]( V  C5 n5 Q9 W5 B0 y
9 c' G- ^. `) X1 v7 h
微信图片_20210107120755.jpg
8 |  ?$ I9 h1 g1 c- T) X2 c此时应该生成版图文件,然后根据制造厂商提供的物理器件库进行最后的各种设计规则检查。

& q1 h0 o% D' ]前置:集成电路版图设计,软件有Cadence:Virtuoso Layout Editor

) T1 h, g# W3 v# p

0 [+ Z* D% h5 v) T2 U8 I' Z  s
微信图片_20210107120758.jpg
, v! `9 o( p$ z& ?# y; R送到代工厂,还要懂元器件
前置:半导体物理,半导体器件物理,固体物理,电介质物理,量子力学,热力学与数理统计。+ R: g6 T7 O  o+ @/ I
  H0 P9 ]1 o) g! m: Y
微信图片_20210107120802.jpg
# O- h/ [' Z. w# J: M根据得到的图表设计版图和工艺流程,大概是这样  N  `& r; F/ A. ?( Q
前置:集成电路制造
# B$ D+ e! s5 O0 D
微信图片_20210107120805.jpg ( P/ \/ l9 d$ [0 h; l+ L/ |' V
然后进行电气测试,电磁测试,最后封装。
3 o- k7 E; M2 a2 i8 c( O前置:集成电路封装技术
' p6 j% [& U; c' G
; S5 t3 ^( k& S" }) p3 S
微信图片_20210107120808.jpg

- c0 W& i# ~5 x. ~1 \, ^; i0 Y, M0 U

( t1 L; L" r8 Q) N3 r
最后不能忘记出片的时候+ h$ n# D1 d2 `2 X+ }( s
焚香沐浴更衣,朝南拜三拜,祈祷不会有大问题。4 `/ z- M) ^+ ^; l  K7 z

7 n0 ^! z- F! Y1 V' t$ ~4 u
微信图片_20210107120814.jpg 4 w1 I6 h+ X( ^( F1 o
第二步,设计系统驱动。
* u. B  |0 E( E! ?1 P. }
( Q/ z$ Z5 g. m* I
终于得到了物理上的片子! o  ?9 M( m  t  n, p2 S" e
我们开始写汇编器,编译器。- t/ s5 W8 v9 k- d" H/ S7 m
本质上烧写进ROM的是这样的机器码。

2 X! P; O$ C3 m  e. U5 c
微信图片_20210107120818.jpg
1 u5 L8 R2 D/ B; o汇编器(把汇编语言变成机器码). I9 ^% H9 A, B; }4 ~" U3 M# ^
前置:perl
  1. 5 H9 Y) M  u- l
  2. #!/usr/bin/perl -W  ~9 Q6 ?  R# k5 n5 w3 @5 P
  3. //********
    2 o& _% A- g1 E% z& n4 ]! B
  4. *********//( |' k  n* \, w/ u/ B* o3 d
  5. print "*** LABEL LIST ***\n";
    2 h: V) _. U' T
  6. foreach $l (sort(keys(%label))){
    ( V' ]8 G: q; \1 Q
  7.     printf "%-8s%03X\n",$l,$label{$l};
    / U  A7 B: f3 e- e( X
  8. }
    2 X1 L  ~. x( r7 {( m; }
  9. 6 |8 `  E! u( l! b
  10. $addr=0;
    - h  V! P( i5 [3 {9 r' x
  11. print "\n*** MACHINE PROGRAM ***\n";
    ! J, r& c, Q" ^; w
  12. foreach (@source){/ G6 a2 q$ U$ I: t) M. B' \1 S
  13.     $line = $_;4 \5 X  U5 v6 y& g
  14.     s/\w+://;
    ) n* d* b7 L% N2 S2 I+ z5 b6 Y
  15.     if(/PUSHI\s+(-?\d+)/){% u+ E4 l: Q8 O/ i9 D6 i% K2 L
  16.        printf "%03X:%04X\t$line",$addr++,$MCODE{PUSHI}+($1&0xfff);
    ; ?, O/ l: J, M! E. F6 [
  17.     } elsif(/(PUSH|POP|JMP|JZ|JNZ)\s+(\w+)/){' B  r4 P2 Z( h. o$ W# o: `
  18.        printf "%03X:%04X\t$line",$addr++,$MCODE{$1}+$label{$2};
    % D. O% t7 H! x* V- g% b1 c
  19.     }elsif(/(-?\d+)/){4 x" t( B* K1 |# Q
  20.        printf "%03X:%04X\t$line",$addr++,$1&0xffff;" M6 J+ F( \: V9 _
  21.     } elsif(/([A-Z]+)/){
    % u  _% ]  h2 Q  V3 v3 Y
  22.        printf "%03X:%04X\t$line",$addr++,$MCODE{$1};
    - A+ A, q8 B, {% [, [' W5 y
  23.     } else {! _& q- l6 \/ L3 t# ?
  24.        print "\t\t$line";
      G* P) B, l- \; D% s! ~
  25.     }
    . @* e. ]8 F! P) o
  26. }
复制代码

( F5 q+ |% S8 @: P9 Z# H* M
编译器 BISON和FLEX(把高级语言转换成汇编语言)
+ \4 X# G5 h0 q' Z) H  N3 L前置:编译原理
. P; Y9 f( I; |) M/ t
  1. 8 h, W# c# m# g3 v
  2. %{2 `: n; F" z: I2 t1 d% G3 {7 q; h
  3. #include <stdio.h>
    $ s# @$ N- D+ [5 ~
  4. %}
    2 L$ W4 g1 ~- D' l  `9 I7 A6 \
  5. %union {char *s; int n;}$ |4 c& R" a: g$ z. k( D, h0 _
  6. %token <s> NAME NUMBER6 i! _0 C$ a* ]( J4 D* k
  7. %destructor { free($); } NAME NUMBER
    ! m/ q8 q/ n& f+ U
  8. %token <n> IF WHILE DO1 `3 h; t2 O+ S/ m* d8 s4 @+ O
  9. %type <n> if05 _$ \$ z$ o  x* U3 g2 m+ D9 T
  10. %token GOTO ELSE INT IN OUT HALT
    4 l# ]; `! r" U5 }
  11. ...# g7 q: j6 u$ Y  d% ^$ |5 E
  12. ...
    6 o/ h0 Z& V0 b6 F' K7 l% T; ]
  13. %%$ G6 |" N1 B4 i/ ~3 \: `9 O- v& ^
  14. int yyerror(char *s){ printf("%s\n",s); }
    & |3 Y- A) o+ X7 E& i
  15. int main(){ yyparse(); }6 A9 O6 C0 G, n) o2 N% K; |& Z8 I$ C
  16. %{
    ! |* ?2 J8 z/ A4 [/ u0 w2 `
  17. #include <string.h>5 W. `) J5 o: O
  18. #include "y.tab.h"
    % A# m- n. c. E; C+ `
  19. int n=0;
    9 b0 w+ a8 X  |; Q1 B! L! ^
  20. %}5 h7 Z3 F. `; H5 Z
  21. ...
    & j2 ^& ^+ P8 m+ Z
  22. ...
    ' k6 t! A: }* g0 Q" Y
  23. while    {yylval.n=++n;return(WHILE);}
      Z  {/ ^2 Q4 f
  24. [0-9]+       {yylval.s=strdup(yytext);return(NUMBER);}$ k6 P: P; m  B! b& X
  25. [a-zA-Z][a-zA-Z0-9]*    {yylval.s=strdup(yytext);return(NAME);}1 ?) \3 V- c) u/ x
  26. .            {return(yytext[0]);}
    % Z- [) P( E; f- i# D" J
  27. %%* H5 F1 y7 L3 o1 G2 e, t% [
  28. int yywrap(){ return(1);}
    ' r3 n- z  ?# M7 a) I6 T6 Y
复制代码
" _7 ]" v" }0 P
终于可以固化进ROM可以跑程序了,你还需要一段小型的开启代码(bootloader)
  k- a: @+ j& U  R前置:汇编语言
. m( x( r! {' ?
  1. 5 Q, P4 Q; W6 c. U% B
  2. start: JK start
    " F- @( l, S/ ~0 B+ l9 D
  3.        nop
    " q7 T- C# `* c6 R$ ^  I
  4.        sdal 32
    1 T; f+ {6 j$ ^( m/ J) `) P
  5.        sdah 04 |1 X* Y) f0 e3 V$ s* p5 z
  6.        datp) ?! o, _) q0 s" ?3 m6 G  O
  7. loop:  ting
    ' U4 u! H/ x1 c4 O1 r
  8.        inl
    3 e: y1 H" j" A. m- O, ^- ?. W
  9.        ting
    ! W' u) F! a) R  o9 P
  10.        inh
    * d* Q5 E) V  p, i$ d- Q
  11.        jend cxcute
    3 t* n4 k( H4 t+ u
  12.        nop
    $ M% L/ N; R3 u- O" q$ a% Z: R
  13.        jmp loop! h0 X; V; e0 z5 D' D- D. J; c
  14.        inc
    ! A+ {' A. h  p
  15. excute: call 329 Z2 c: o1 C6 G0 O2 Z. K0 C. a
  16.         nop: r* G, g5 A' H9 E* T
  17.         jmp start# G5 n7 n7 \. g8 n' X( I
  18.         nop
复制代码

" B7 r0 V3 U* d" U# q: X/ X2 g
然后开始写操作系统
4 Y. b* m/ j. l$ [+ k6 o2 k前置:ucos(嵌入式操作系统)

& T4 h: }2 Y2 G+ r, S: z4 f' R) L系统宏定义,系统功能配置,系统头文件,初始化文件,调度文件,任务管理文件! ^0 X, Q1 S/ n& K# R
系统时间管理文件,信号量文件,邮箱文件,消息队列文件,内存管理文件,系统服务文件,MAIN文件。

  A1 \7 e1 ?: H4 U3 u0 ^& f7 Z
写操作系统中的任务5 l; T- i/ g1 Y, P2 d
前置:C语言,数据结构,算法导论。- v* D) {1 ~! K
  1. % I7 v" |0 n% _/ l0 V+ d4 ?
  2. double KalmanFilter(const double ResrcData,
    + q/ @. L8 P4 n& V, z6 H
  3.                                         double ProcessNiose_Q,double MeasureNoise_R,double InitialPrediction). j# L- }% A$ o' c& h
  4. {
    " D* w3 p  p1 g- p" L+ o
  5.         double R = MeasureNoise_R;3 y3 Z# @9 f( y" h
  6.         double Q = ProcessNiose_Q;9 P6 Q! {6 I5 W5 [: [6 X
  7. 3 \- L. |# k& F; J6 _" ?& {
  8.         static        double x_last;8 j7 ]" E- S& i- B: X" [3 E

  9. 3 ]' K; Y  v, N
  10.         double x_mid = x_last;
    1 Z! t. S5 E! k# f& Z( z1 {
  11.         double x_now;
    * A2 N0 J9 |) ]8 S9 H& S; R5 t

  12. 4 B4 k# D3 i# u* G+ ~
  13.         static        double p_last;
    & C0 G* ?( @3 x+ H
  14. + m. u) S! T, ~5 n8 U( D) u
  15.         double p_mid ;( ]0 U% z; `" J; o8 X8 ~4 a: p# u) D
  16.         double p_now;1 \/ p1 P6 g; X5 J
  17.         double kg;        ; W2 W- t; {. o, ]0 h

  18. 1 K$ X! K# ~" a1 d8 h# G6 ^
  19.         x_mid=x_last; //x_last=x(k-1|k-1),x_mid=x(k|k-1)
    3 b, G6 o( m  }( f  a
  20.         p_mid=p_last+Q; //p_mid=p(k|k-1),p_last=p(k-1|k-1),Q=噪声
    " Y2 Z2 {* J7 k* H+ L8 D
  21.         kg=p_mid/(p_mid+R); //kg为kalman filter,R为噪声9 C$ j0 p& @$ g+ F" P8 b
  22.         x_now=x_mid+kg*(ResrcData-x_mid);//估计出的最优值
    7 X2 e- o  b$ X: m
  23.                
    % a; T& l+ j: U
  24.         p_now=(1-kg)*p_mid;//最优值对应的covariance        7 y8 k3 M8 b0 G0 P

  25. 1 |2 C5 Z# D. O& n2 j# X. R
  26.         p_last = p_now; //更新covariance值
    & O; |* T& Q/ Z- ]) E6 ?
  27.         x_last = x_now; //更新系统状态值+ Y% D# _, i3 i; g. I

  28. 2 k+ F/ ^- Q5 u
  29.         return x_now;               
    $ W# X. D+ Y6 ^9 x
  30. }
复制代码

4 f  w+ B4 o) x! p# c4 v$ v8 j! _
拿着含辛茹苦的板子还需要配置最小系统以及外围器件
& G% s" D$ B1 p5 Q* X前置:PCB设计和制造,电焊等技艺,模电、高频电子线路,信号与系统

4 A7 m5 ?' V6 {7 J& ~" x
. k+ p/ x$ j/ b) l; b/ h
微信图片_20210107120822.jpg
, K5 T4 {1 M# \) N1 c1 ^/ d
微信图片_20210107120824.jpg
( O& }/ ?* J9 v5 L" B0 q

/ G. q9 W0 T" b
如果有信号传输
9 t3 p: g! w, L通讯协议
5 }8 S+ B, [0 W8 O( z前置:SPI,I2C,CAN,TCP/IP、wifi等等0 o& g! p% i- r+ M2 s" U# C# Z! x3 M

  1. 3 i0 H6 |& ^8 ?4 C! T
  2. uint SPI_RW(uint uchar)
    / ~0 k# K+ e! g9 q" S5 k
  3. {( V- a; x4 ~* g" V7 b& V
  4.   uint bit_ctr;
      u/ z) P; t: L5 F
  5.      for(bit_ctr=0;bit_ctr<8;bit_ctr++) // output 8-bit. v  k% |4 ~& K, ?4 C# T
  6.      {
    : K: [# ?( e/ l0 i$ }8 V' I
  7.     MOSI = (uchar & 0x80);         // output 'uchar', MSB to MOSI
    / {1 B1 x* a( P0 S/ w" @
  8.     uchar = (uchar << 1);           // shift next bit into MSB..0 F( d7 A' e  L0 V5 b1 D3 z
  9.     SCK = 1;                      // Set SCK high..
    8 m! d- _) C7 o2 v
  10.     uchar |= MISO;             // capture current MISO bit  U% j) M% p& H2 W: W
  11.     SCK = 0;                  // ..then set SCK low again
    9 ]& M; X" u# d% {5 g6 X% z7 G
  12.      }
    $ }) Q& h1 y( o, k# C
  13.     return(uchar);                 // return read uchar3 v' B  M* q* G( y! A7 I5 r& v8 e
  14. }
复制代码
RF天线+ D' f2 t3 ~2 i) m/ i' V
前置:微波技术,电磁场与电磁波,HFSS,天线技术等等。
4 ]7 c8 |9 ]4 s2 }3 R

; m: x0 z" C9 E- o+ O  Q
赞 收藏 评论0 发布时间:2021-1-7 12:12

举报

0个回答
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版