嵌入式从入门到放弃??

Posted 嵌入式大杂烩

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了嵌入式从入门到放弃??相关的知识,希望对你有一定的参考价值。

👇 星标「Linux大陆」,一起进步!👇

来来来,让我们一起,左手右手一个慢动作。

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

第一步,做出实体芯片。

单片机一般理解为MCU(Microcontroller Unit,微控制单元),包含定时器、ALU(Arithmetic Logic Unit,算术逻辑单元)、内存、寄存器、总线等部分。而普通的意义的单片机还包含GPIO、串口(UART)、DMA、协处理器、AD\\DA等等。

看懂如下图

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


流水线


前置:数字逻辑电路,集成电路设计及其EDA技术,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 <stdio.h>
%}
%union {char *s; int n;}
%token <s> NAME NUMBER
%destructor { free($$); } NAME NUMBER
%token <n> IF WHILE DO
%type <n> if0
%token GOTO ELSE INT IN OUT HALT
...
...
%%
int yyerror(char *s){ printf("%s\\n",s); }
int main(){ yyparse(); }
%{
#include <string.h>
#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)

前置:汇编语言

%{
#include <stdio.h>
%}
%union {char *s; int n;}
%token <s> NAME NUMBER
%destructor { free($$); } NAME NUMBER
%token <n> IF WHILE DO
%type <n> if0
%token GOTO ELSE INT IN OUT HALT
...
...
%%
int yyerror(char *s){ printf("%s\\n",s); }
int main(){ yyparse(); }
%{
#include <string.h>
#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);}

然后开始写操作系统
前置:ucos(嵌入式操作系统)


系统宏定义,系统功能配置,系统头文件,初始化文件,调度文件,任务管理文件
系统时间管理文件,信号量文件,邮箱文件,消息队列文件,内存管理文件,系统服务文件,MAIN文件。

写操作系统中的任务
前置:C语言,数据结构,算法导论。

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

拿着含辛茹苦的板子还需要配置最小系统以及外围器件
前置: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,天线技术等等。

以上回答来源:知乎,作者:彭谟威

链接:https://www.zhihu.com/question/28580074/answer/93515413

看完这位同学的回答,网友纷纷评论表示:

化学,光学,半导体物理,等等就光刻胶涂胶的方式就够你研究一辈子了


这是一个人的活吗?

没有一定水平干不了这些的,微电子专业,呵呵

然后再制造出通量电容,回到过去,干死自己


最后一张图是PCB layout还是IC的?

。。。看完我已经不想学单片机了。。手动再见

好吧,短短几分钟,经历了一遍《从入门到放弃》

  ︿( ̄︶ ̄)︿不能更详细。。。

其实,一位道友曾经尝试过制作51单片机,接下来欣赏网友一路向北lm的制作过程:

设计的电路原理图如下

PCB设计如下,双面板,10*10以内(打印比较便宜),3D图效果图如下:

板卡功能:

1. 板载8个LED  可做流水灯实验。

2. 板载4位一体数码管 可做数码管静态 动态显示实验。

3. 板载CH340下载芯片,可以通过USB实现一键下载。

4. 板载MAX232串口芯片,现在串口下载,串口通讯。

5. 板载继电器模块,可实现对大电流大电压的控制。

6. 板载蜂鸣器模块,可以作为相关应用的提示。

7. 板载1602液晶接口,可以实时显示相关字符数据。

8. 板载12864液晶接口,可以实时显示汉子字符数据。

9. 板载四颗独立按键,可以实现对一些功能的触发。

10. 板载NRF24L01 无线接口,实现无线传输。

11.所有IO口引出,方便调试。

几天后,拿到打印后的板子,红色很是喜庆哈。

     
马不停蹄的焊接,很累啊,这么多贴片测试的过程必然艰辛。

大功告成,一块板子横空出世,赶紧试试, 板子焊接完成正面图,还算可以。

LED、数码管、蜂鸣器、继电器一切OK,USB CH340 下载电路也OK,使用Max232 DB9串口下载也OK,液晶接口1602 12864 也可以正常显示,基本功能都一切正常这次打板还是比较成功的。趁着这股劲,一鼓作气,多焊机了几块板子,摆一排,成就感爆棚。

下面是测试功能的一些图,包括1602、12864与oled显示。

▲1602显示

▲12864显示

▲oled显示

本文来源网络,版权归原作者所有。如涉及作品版权问题,请联系我进行删除。

往期推荐:

嵌入式开发小记,实用小知识分享

分享几个Ubuntu必装的软件

嵌入式行业需要什么样的技术人才?

常用的开源协议有哪些?

在公众号聊天界面回复1024,可获取嵌入式资源;回复 m ,可查看文章汇总。

点击阅读原文,查看更多分享。

以上是关于嵌入式从入门到放弃??的主要内容,如果未能解决你的问题,请参考以下文章

GO语言从入门到放弃

Volatile从入门到放弃

python全栈开发从入门到放弃之函数基础

Handler机制从入门到放弃

vue-cli从入门到放弃

Python爬虫从入门到放弃(十九)之 Scrapy爬取所有知乎用户信息(下)