|
单片机
4 g8 L7 i5 Y. y9 D3 u# D# x/ N
6 @7 ^( |$ f/ |; A h; |' b o单片机的最小系统?内部的主要结构?
/ c3 Y1 O2 d L! D) w
* a0 b6 h" n8 o答:最小系统:电源、晶振(为系统提供基本的时钟信号)、复位电路;内部结构:ROM/RAM、计时器、中断、I/O串并行口、总线扩展控制。
; d7 d4 l# C- c4 E1 H3 {) g1 Q5 w6 G2 ]
RAM和ROM的区别?
: c+ Y; D/ d/ K% o! ]9 G* y
1 p$ p) B) b+ T4 ^答:ROM(只读存储器):它的信息一次写入后只能被读出,而不能被操作者修改或者删除。一般用于存放固定的程序或数据表格。但是,“只读”这个概念有时候可以被一些新特性的器件颠覆。9 O7 _/ u! D; f. c
) \# k) ~# g# z7 LRAM(随机存储器):它就是我们平时说的内存,主要用来存放各种现场的输入/输出数据、中间计算结果,以及与外部存储器交换信息,或者作堆栈(特点:先进后出,后进先出)用。它的存储单元根据具体需要可以读出或者改写。
2 m* ^! s1 p6 o9 n# |5 m
! n. J: X& m5 {; W6 G% W两者区别:RAM只能用于暂时存放程序与数据。一旦电源关闭或发生断电,RAM中的数据就会丢失。而ROM中的数据在电源关闭或者断电后仍然会保留下来。6 ^& Q4 z- K7 N- e6 L7 C5 b# H
' R- v! m1 C9 k简而言之:相同点它们都是用来存储数据的" v3 Q- y1 R( Y# @$ R5 U/ h
6 `4 _) ^/ t8 o3 ?
不同点存储数据的方式与数据能不能在二次加工不同
9 X8 |5 j4 l- g( B1 b1 o4 X4 n
; J! u$ Y1 z, K* Y, r7 v3 K) a) L单片机I/O口有什么作用?I/0口的驱动能力?上拉电阻与下拉电阻的作用?
( N3 h: z0 q o, f8 r: s8 J1 w9 w, q/ ~" k& ?
答:I/O口最主要的功能用来与外部器件实现数据信息的交互、速度匹配、数据传送方式和增强单片机的负载能力。它在两者之间扮演桥梁的作用,单片机拥有着串行与并行接口。每个种类的单片机的不同并行口也有着各自不同的功能。
% [- a: s* g0 E3 l4 H5 v/ V6 t
/ ~) n5 _) s! [) h6 D单片机输出低电平时,将允许外部器件,向单片机引脚内灌入电流,这个电流,称为“灌电流”,外部电路称为“灌电流负载”。3 D) y C1 D0 L$ ^9 H" o Z3 W# N
/ p# H9 v" T- H0 h; I* ?) d 单片机输出高电平时,则允许外部器件,从单片机的引脚拉出电流,这个电流,称为“拉电流”,外部电路称为“拉电流负载”。
6 |# g. y% X$ g$ o! x- ~$ B$ [
3 `$ _7 {7 E9 A单片机输出驱动能力的问题:每个单个的引脚,输出低电平的时候,允许外部电路,向引脚灌入的最大电流为 10 mA;每个 8 位的接口(P1、P2 以及 P3),允许向引脚灌入的总电流最大为 15 mA,而 P0 的能力强一些,允许向引脚灌入的最大总电流为26 mA;全部的四个接口所允许的灌电流之和,最大为 71 mA。而当这些引脚“输出高电平”的时候,单片机的“拉电流”能力呢?可以说是太差了,竟然不到 1 mA。& i6 b: w# X* M$ b$ d" [; E
& ^: _2 U G2 _" G* _. l9 L结论就是:单片机输出低电平的时候,驱动能力尚可,而输出高电平的时候,就没有输出电流的能力。
4 u" v3 g8 I, r1 Z0 ~$ |
, f6 }! t. H& I4 U) I综上所述:灌电流负载,是合理的;而“拉电流负载”和“上拉电阻”会产生很大的无效电流,并且功耗大。
3 y2 ]- l# W& @; ~- C! ?( E1 I# x. S- e* g P3 g7 E9 p
设计单片机的负载电路,应该采用“灌电流负载”的电路形式,以避免无谓的电流消耗。
- Q) e- ^6 {4 Z, D) V- ?; q3 `; i; y1 M7 @" q6 q9 M# f
在数字电路中,只有二种状态,要么是高电平,要么是低电平,在通电初期,这些输出状态是不确定的,为了使电路确定状态,必需使用上拉电阻或下拉电阻,使一个原来不确定电平变高的叫上拉电阻,否则就是下拉电阻,上拉电阻就是从电源上接一只电阻到这个状态口上就可以了,(就是把高的电压加到这个点上去,这个点的电位就高了)下拉电阻的接法,从这个状态口接一只电阻到负极(或数字接地),因电路形式与类别不同,当输入端有信号,这种变化会反应到输出口,从输出口得到了一个状态,本来应该完成任务了,但这会儿输入口已没信号了,可输出端还是这个状态(这个人习惯不好,开门后总是不关门,加一只弹簧,(电阻)让它自己关门,)这时候也要用到上下拉电阻,这里有复位的作用。( n+ m: f: b3 a, n- A
6 {$ j2 _" P }3 L& n2 A常见的时钟电路有哪些?为什么要使用PLL?+ z" E d9 ~9 f7 N4 r$ X. s3 s0 V
4 [ k: ]# P0 E; j8 Q6 `答:先了解一下什么是时钟电路?
( O Q( K% g8 Q+ Y" A2 C \6 M
5 L* b- X% f( G* [, @0 t3 X时钟电路就是产生像时钟一样准确运动的振荡电路,任何工作都按时间顺序。用于产生这个时间的电路就是时钟电路。
6 H% a+ ?" L( C0 ]. r# ?
3 O' V0 u" i# { 组成:晶体振荡器、晶震控制芯片和电容组成。
. R% O2 k. C8 S' y2 R
& E+ X* ]) }% l: U" H }现在流行的串行时钟电路有:DS1302、DS1307、PCF8485等
& L4 _. {4 r* \% H3 @9 k; E
\+ |' q" J, F6 k* F9 V2 R它们的特点:接口简单、价格低廉、使用方便。
- l9 {# O( `, ? Y) F+ m) p+ ~: _5 U4 {5 e# B* _$ B
DS1302:具有涓细电流充电能力的电路,主要特点:采用串行数据传输,可为掉电保护电源提供可编程的充电功能,并且可以关闭充电功能。采用普通32.768KHz晶振。
_* x' O+ q5 z3 l
8 n5 u" J8 w) m5 z! hPLL(PhaseLocked Loop):锁相环电路。用来统一整合时脉讯号,使高频器件正常工作。如:内存的存取资料等。PLL用于振荡器中的反馈技术。许多电子设备要正常工作,通常需要外部的输入信号与内部的振荡信号同步。一般的晶振由于工艺与成本原因,做不到很高的频率,而在需要高频应用时,有相应的器件VCO,实现转成高频,但不稳定,故利用锁相环路就可以实现稳定且高频的时脉冲讯号。
+ M# d7 c% e$ j. t/ d: w
5 w' A* o! A6 Z2 }什么是时脉:指同步电路中时钟的基础频率,它以(若千次周期每秒)来度量,单位是(Hz)
+ ?) t& t) h% D& i( X$ ?
$ w& p& u# b9 B8 S# ~7 u总之:PLL可以同步频率,相位正交。倍频、变频。3 m0 y p- h4 p
( Q8 C! L' h* s1 w3 b$ P& ]单片机的寻址方式有哪些?0 k) ]9 |9 `& r' \& C
/ L* h8 s/ D( k答:80C51有七种寻址方式:
- Z! ^. p h( w0 G) `& R
8 M! j3 p, O2 _7 B" \/ p. a1、立即寻址,寻址空间为ROM;
O3 d8 b' O9 C7 c" D" g! i1 h$ g
2、直接寻址,寻址空间为片内RAM的低128B和特殊功能寄存器;
4 J( W$ ]) Y3 g) ^2 T5 L# K1 ~. Z, ?; T( |
3、寄存器寻址,寻址空间为A、B、DPTR、CY、通用工作寄存器等;2 P! F a3 _" a* X( z, I
' H' {* j+ z0 J& z/ l$ o* S* O
4、寄存器间接寻址,片内RAM低128B、片外RAM;. H: c) ^8 t9 e& [! Y4 D
1 e$ u" b3 b1 G4 c& H, e8 X) S/ P5、相对寻址,寻址空间为ROM;! E; D s& J$ [3 d' u( w7 f
5 D$ k" }# v6 G5 \& o+ l9 b6、变址寻址,寻址空间为ROM;5 \& U/ T+ F/ g6 H3 B' `
7 o- H/ X2 [; b" Y: b4 i
7、位寻址,寻址空间为片内RAM低128B的位寻址区的128个位,其字节地址为20H~2FH;以及部分可以位寻址的特殊功能寄存器。
7 z( u- ~& Z4 G" d2 x& G6 T3 o9 @5 Y3 o7 v s1 f8 Y' e
2 o3 M( t8 \9 r( E. c$ \: T0 d3 {( l- H' X/ G; \
参考:AT89C51单片机能直接认识和执行的机器指令有255条,有7种寻址方式,即立即寻址、直接寻址、寄存器寻址、寄存器间接寻址、变址寻址、相对寻址和位寻址。0 }+ J: [1 n' c( u, R
$ C6 c- ^6 z# |$ c6 Z, J: R
% Y0 w# {! y- n) d. S
. j# x% ?" t0 \# u: Z# s1. 直接寻址:
' A# e4 R* C6 C( t& _. ~& v" Q! ~& I( Y
指令中直接给出参与操作的数据的地址,该地址一般用direct表示。
7 s4 Y+ M; G& s2 y" E& g2 X: o: r; \/ \+ N0 S- U& d2 v( U7 S
汇编指令:MOV A,direct
$ H# k; A5 Q4 Q7 x
O: B4 H# ]- R \6 ?该指令的功能是将片内RAM地址direct单元中的内容(参与操作的数据)传送到累加器A中,双字节指令。& `# V# U Z8 h [2 p
6 B/ f3 `, I. x( V
% ?. h; s3 d- M0 s) x' V/ @% [
1 m8 `4 a/ q; J% X; ~2. 立即寻址:7 x3 G7 K+ e- e6 O" C/ `2 t
3 O: W2 S, |" X5 ]* ~& ^* S指令中直接给出参与操作的数据,称立即数,用data表示。在汇编语言中,为标明立即数,为data加前缀”#”。立即数可以是8位和16位二进制数,分别用#data和#data16表示。
, [/ q( L2 K$ F5 ~: n; p2 l/ L- z& x+ A% s' ~4 c7 C
汇编语言指令:MOV A,#data
# V. l. D3 o2 X/ \/ k5 a7 f! ~5 i
) S6 S3 t. K6 ~$ H1 R该指令将立即数data传送到累加器A中,双字节指令。. ?, {3 \7 P# p
/ M, E% |' B2 x( T7 i
3 {7 J1 ?3 Q( C: U7 Y: E a4 j! Y E% W7 n% \4 @' a' {
3. 寄存器寻址:
9 a( b+ G8 `1 H/ X& p% Y ?. ^9 s0 u; Q( x3 Q! ?
参与操作的数据存放在寄存器中,汇编指令中直接以寄存器名来表示参与操作的数据地址,寄存器包括工作寄存器R0~R7、累加器A、AB、数据指针DPTR和位运算寄存器C。6 r1 H: W. L3 Z: l! ]/ N
7 ^: J' V: v) p6 X8 O3 B. v b汇编语言指令:MOV A,Rn ;n=0~7' M# R- z& b% p+ |0 i; S6 R
+ I! K" `, l H; T: u! E6 X4 W0 @该指令将Rn中的内容传送到累加器A中,单字节指令。2 z: W8 ~' V7 x0 Z j( k5 D
- W, W+ \' e$ ~7 H; G+ e2 _
7 D9 D% g& o0 B# d% w0 m: h/ u, ]% M! A" U# t/ m' z# W4 N
4. 寄存器间接寻址:
5 e( {0 _; K( {+ D7 o# z7 E
_4 |; j1 E3 a8 W( I* p寄存器间接寻址为二次寻址,第一次寻址得到寄存器的内容为(Ri)或(DPTR),第二次寻址是将第一次寻址得到的寄存器内容作为地址,并在其中存、取参与操作的数据。汇编语言中,寄存器前缀@是寄存器间接寻址的标志,有@Ri、@DPTR等。
/ S! n8 u" I/ O" ?) }4 V8 ?: U; v& a( Y
/ d6 t+ N. G$ ^汇编语言指令:MOV A,@Ri ;i=0、12 q# t- f8 n, C
7 V( m W) `0 v5 j" F& u3 O) \- ~( |该指令是将Ri中的内容作为地址,再将该地址中的内容传送到累加器A中,单字节指令。2 J$ X8 E! e6 ^, [& }; b! J
. n& H O" U' V' z1 O. p# ^+ ]- s * z( B! w H9 ?$ i% m
% P9 s8 z( g+ D6 T; h! i& o
5. 变址寻址:
* |1 x- _: y7 ]. B \, r
. D+ o0 X" y" s0 y; m6 W- J7 b间接寻址由两个寄存器提供。若由A、PC提供,在汇编语言指令中寻址地址表示为@A+PC;若由A和DPTR提供,在汇编语言指令中寻址地址为@A+DPTR。其中,PC或DPTR被称为基址寄存器,A被称为变址寄存器,基址与变址相加为16位无符号加法。若变址寄存器A中内容加基址寄存器DPTR(或PC)中内容时,低8位有进位,则该进位直接加到高位,不影响进位标志。因变址寻址指令多用于查表,故常称为查表指令。% N' c, G$ L1 `! r$ X9 w
* N8 E; _( L6 `5 S( ?# v% u
汇编语言指令:MOVC A,@A+DPTR
) L# G r! L. H
( I9 Y$ R2 Q7 w& b! A1 Y! w5 w" A8 K该指令将DPTR中的内容加上A中的内容作为地址,再将该地址中的内容传送到累加器A中,单字节指令。8 }2 l( n: r+ a Q7 W6 g
' m6 F( }4 n; m- ^3 u6 `, \
" w( B5 c- U/ L
3 N- `; l& X# R* i7 r6. 相对寻址:, J7 O; N. ^8 g( c& y# J/ p$ o _
8 H; {/ I+ v$ J; |! v相对寻址是以相对寻址指令的下一条指令的程序计数器PC的内容为基值,加上指令机器代码中的“相对地址”,形成新的PC值(要转移的指令地址)的寻址方式。指令机器代码中“相对地址”指的是用一个带符号的8位二进制补码表示的偏移字节数,其取值范围为-128~+127,负数表示向后转移,正数表示向前转移。
4 [6 J* ]& u( [& P- O) t1 A$ `0 E" a+ J. w/ ^' ^; i% _: q
若(PC)表示该指令在ROM中的首地址,该指令字节数为2,执行时分两步操作:(PC)←(PC)+2,(PC)←(PC)+相对地址。第一步完成后,PC中的值为该指令的下一条指令的首地址;第二步完成后,PC中的内容(PC)为转移的目标地址。所以,转移的目标地址范围是该相对寻址指令的下一条指令首址加上-128~—+127字节的地址。3 G0 q! E5 Y1 A* g3 {& F4 G
" _& Q. J! Y9 `' {9 U' Y; U; s; u3 f
汇编语言指令:SJMP rel
3 Z6 K1 i. M& V3 p9 ~* t" m/ I, ^
# R0 d0 _& g2 M# L. s' @汇编语言相对寻址指令中的”rel”往往是一个标号地址,表示ROM中某转移目标地址。汇编软件对该汇编语言指令进行汇编时,自动算出“相对地址”并填入机器代码中,应将”rel”理解为“带有相对意义的转移目标地址”。
% V( |% L! D8 e$ H7 j A; ^" C
: g7 ~) g: K. y8 X; CRel=(PC)+相对寻址指令字节数+相对地址5 l8 H( W$ F' K, i/ p
) U, ^* `' ]9 W3 [其中,(PC)为该指令所在ROM中的首地址。0 r, y5 J; v8 v" |. t7 t
# n% k: e$ t: |( v / S4 v, {8 F0 K- l' y% P: N
" m0 Y& _1 A) H' X4 x( b6 {4 H7. 位寻址:) c' s* t. b) x I0 ~6 W
- c" a/ b8 S% G, ~1 z
参与操作的数据为“位”,而不是字节,是对片内数据存储器RAM和SFR中可位寻址单元的位进行操作的寻址方式。. b7 l) x/ Q) [1 j
: E0 B8 }8 K- {9 \& K* C) U
汇编语言指令:ANL C,bit2 _; Z% b8 _' ]5 }
! q2 }6 N! {, p6 N v9 l" E该指令将bit(位地址)中的内容(0或1)与C中的内容进行与操作,再将结果传送到PSW中的进位标志C中。
+ }( f2 |( [) Z' J* H
2 e2 m: }( M2 A( }6 \7 w! n9 L7 ?) F9 X什么是时钟周期?机器周期?指令周期?它们之间的关系? K# n' B' ?. M
+ s$ K; ^3 b% S* ~+ x7 ~/ U
答:1、时钟周期又叫做振荡周期;单片机内部时钟电路产生(或外部时钟电路送入)的信号周期,单片机的时序信号是以时钟周期信号为基础而形成的,在它的基础上形成了机器周期、指令周期和各种时序信号。定义为时钟脉冲的倒数(可以这样理解:时钟周期就是单片机外接晶振的倒数,例如:12M的晶振,它的时钟周期就是1/12us),是计算机中最基本的、最小的时间单位。在一个时钟周期内,CPU仅完成一个最基本的动作。
: u3 x. f P7 K' d. j' G, [( D
2、计算机中,为了便于管理,常把一条指令的执行过程划分为若干个阶段,每一个阶段完成一项工作。例如:取指令、存储器读、存储器写等,这每一项工作称为一个基本操作。完成一项基本操作所需要的时间成为机器周期。一般情况,一个机器周期由若干个S周期(状态周期)组成。机器周期是单片机的基本操作周期,每个机器周期包含S1、S2、……S6这6个状态,每个状态包含两拍P1和P2,每个拍为一个时钟周期(振荡周期)。因此,一个机器周期包含12个时钟周期。依次可表示为S1P1、S1P2、S2P1、S2P2……、S6P1、S6P2。# H( u8 Z; C7 I, R" h6 t8 h
/ q7 Y' n: Y; F/ r& O
3、指令周期:计算机从取一条指令开始,到执行完该指令所需要的时间称为指令周期。不同的指令,指令长度不同,指令周期也不一样。但指令周期以机器周期为单位,指令不同,所需的机器指令也不同。/ F& L; ?2 y* N' V0 [
& [& m6 F% K7 `3 S% A0 F- _0 y51单片机指令根据指令长度与执行周期分为:% \: |( |$ y, x# W& I! E D% O
& i, @1 B) Y" [1) 单字节单周期指令% ~1 A4 S! k& u0 [0 S1 r# X
+ Y2 s# l7 i! U8 h( Y! b
2) 单字节双周期指令6 g% t4 ^- w9 t3 B' ` \+ N k" S
5 ~0 z4 I( {7 f$ b" o0 ]2 u
3) 双字节单周期指令
, w0 N" G* ?6 @/ p4 L( o( G! [$ G' L6 w% [; B1 ^9 A3 }
4) 双字节双周期指令; x6 F8 d/ m# M( M" d# l1 d
* X+ E$ x7 b) o/ @% j5) 三字节双周期指令* E- {5 @; w/ D- T+ ^
5 ]) U6 L; }. u |) W4 _6) 一字节四周期指令
' C- z+ Q/ r$ U+ l; I$ ^# r5 }( D/ Z: } u5 d% T1 N
总结:时钟周期是最小单位,机器周期需要1个或者多个时钟周期,指令周期需要1个或者多个机器周期;机器周期是指完成一个基本操作的时间。指令周期是CPU的关键指标,指取出并执行一条指令的时间。一般以机器周期为单位,分单指令执行周期、双指令执行周期等。机器周期是完成一个基本操作的时间单元。时钟周期是CPU的晶振的工作频率的倒数。
; X2 i& k0 Y7 Q
* p# |8 \* m3 r9 E% f8 A单片机有哪些接口,各模块有哪些特性及应用环境?+ f- o1 B6 _, t" A' \+ L2 K9 P
9 Z4 g! h/ A; j7 R/ W) p3 j答:接口电路——用于衔接外设与总线,实现存储空间扩展、I/O口线扩展、类型转换(电平转换、串并转换、A/D转换)、功能模块、通信扩展、总线扩展等。1 X9 [, q, \, l- K8 c& p
+ ]! I$ P- M+ @, M
外围设备——工作设备,连接在接口电路上,主要有输出设备和输入设备。1 s( J2 R6 F. g; n3 N8 @; M8 y- _) _
: \: B3 u n0 @' v9 ]: r( w7 X9 t" C) z
1 R, P& G. r, j& V" X5 Q# D, t9 g9 a看门狗相关问题:5 Z* H6 Z* ]$ y) i
, U/ p, T" J1 u/ O# k
看门狗的原理?3 F: b( P& I, ~
& N: T( M4 u0 r6 @6 G
答:工作原理:在系统运行以后就启动看门狗计数器,此时看门狗就开始自动计时,如果达到一定的时间还不去给它进行清零,看门狗计数器就会溢出从而引起看门狗中断,造成系统的复位。$ @0 o b& [. n5 {/ D
, Z! D* m3 C7 d- H: |9 M为什么会溢出呢?& j$ c: Y3 h: ]: o) K% X: E
1 S5 J' A8 T2 g: G/ R
因为看门狗是一个计数器,而计数器位数有限。能够装的数值也就有限(比如8位的最多装256个数,16位的最多装65536个数),从开启看门狗那刻起,它就开始不停的数机器周期,数一个机器周期就计数器加1,加到计数器盛不下了(这就是溢出)就产生一个复位信号,重启系统。
, C+ R$ i2 x2 `3 u6 k2 j3 V% O2 C7 f* k- [* o8 x: ]
看门狗分为软件看门狗和硬件看门狗,在什么情况下软件看门狗失效?( V! x' X& i% u& p W$ X: _
. d! u# W7 }2 f. Z& U答:硬件看门狗是利用一个定时器电路,其定时输出连接到电路的复位端,程序在一定时间范围内对定时器清零,因此程序正常工作时,定时器总不能溢出,也就不能产生复位信号。如果程序出现故障,不在定时周期内复位看门狗,就使得看门狗定时器溢出产生复位信号并重启系统。/ a4 r! _0 w9 f- R T
/ A7 a9 Q5 v4 f9 `2 l
软件看门狗原理上一样,只是将硬件电路上的定时器用处理器的内部定时器代替,这样可以简化硬件电路设计,但是在可靠性方面不如硬件定时器。
% V" r9 t: B7 ]' z% n7 F5 `: o1 K
- k, k+ [8 A/ g7 ?1、系统内部定时器自身发生故障看门狗就会失效(当然可以通过双定时器相互监视,成本高);- [8 J: S- C5 ?
! V/ }0 J3 h! c. X1 Z. C/ Q2、中断系统故障导致定时器中断失效。( G+ [. J; `$ b2 U/ o
$ v: U& }) s4 A1 R, h
3、整个程序死机。主程序出现异常。 V% L t, q& h$ ~: w g
3 e$ K+ T8 R' {
什么时候喂狗?怎么喂狗?喂狗的注意事项?
: Z+ p+ u' O: [5 o2 T8 e* U+ v9 l% y; S% {/ Q5 O* \6 p. A
答:在实际的单片机应用系统中,到底选用哪种型号的看门狗,采用何种喂狗方式和看门狗连接方式以及在编程中喂狗命令应该放在程序中什么位置,这要根据现场干扰源的特点、已采用的干扰措施、单片机硬件资源和软件结构特点以及对单片机系统的可靠性等具体情况而定。
. x/ C; @' h' L6 M# y1 m) o0 ^7 N9 e7 O9 x2 K# f9 }
看门狗一般应用到程序的那些位置?
1 [" O6 H1 }# ]7 M, [
0 D& \( u* \4 ~0 S( @6 X3 w答: 一些重要的程序,必须让它一直跑着;而且还要时时关心它的状态——不能让它出现死锁现象。(当然,如果一个主程序会出现死锁,肯定是设计或者编程上的失误。首要做的事是Debug。)但如果时间紧迫可以用软件看门狗,暂时应急。
: b1 w( Z+ C. {& w w5 u1 z1 h3 ^# D
喂狗命令放置位置:/ f- p- O: [2 V. C4 ]) X/ i+ }
% ~+ U' O5 C! D. f8 U" |- J5 R
定时中断服务子程序中;7 ~$ w& |" e5 C7 r( g
( ^1 W/ c) H) F1 l! l0 I
主程序中.7 x: r1 o( `! R8 {& T. J& [
6 \1 [" v3 S& x$ q复位相关问题:' {$ c0 `' g. e; ?) i
# Q# [( G. r1 W, V0 @* C' W" L/ s
复位时单片机有什么动作?! d# E' F$ v8 Y$ e/ k
' S g/ N2 A% h" \0 z
答:主要做的就是初始化每个寄存器,包括最重要的PC指针,不包括RAM,然后单片机从复位地址开始执行程序。
) p$ h2 O7 N, j# P b& g a1 u' v+ ^! N! @
必须使RST引脚(9)加上持续两个机器周期(即24个振荡周期)的高电平。单片机就执行复位操作。如果RST持续为高电平,单片机就处于循环复位状态。
& c) q9 N x+ z/ o1 S( ~" S
* W* P$ S; b# g( }1 x单片机有哪些复位源,什么情况下会导致各个复位源: u j) u0 o; V6 w$ V
3 S- I, m' g& B" F, T, E
答:
4 F* r" b5 v4 s" W* e+ K1 `4 p. ]' r! l0 y. ~, w. W6 {' v1 {
6个复位源
8 f7 A0 x. O. V& x9 p- _9 w; L4 Z# Y% s) F9 R
TM4C123GH6PM微控制器有6个复位源:+ k4 x* s ^$ N# f* q9 D
/ F3 t# M# U! t(1)上电复位(POR);- c, h' a, _$ p" E9 c n
" A' N, P7 m+ }! `) g( W0 {(2)外部复位输入引脚有效(RST);
$ N: M) @. S& P$ x& d! C
! H8 h- O' M; g4 s6 Z, B) M(3)掉电检测可以用于由以下任一事件引起:① 低于BOR0,触发值是BOR0的 最高电压值;② 低于BOR1,触发值是BOR1的最高 电压值。2 g. o+ a* D( K/ v `% i2 P
1 b/ x4 {7 s' n4 g0 s u0 i; w(4)软件启动复位(利用软件复位寄存器);
$ u* b7 w7 Y, S9 D ^& D- D
7 N& ?7 c+ y& _6 o& \: A(5)违反看门狗复位条件;8 V" w( v/ `0 v6 f4 @
# D; A, u: ^9 j- }8 M* |# o1 ?(6)MOSC故障。
; m" t8 m7 f) c9 e9 T4 W, s7 _
* _: n* L% R7 T: }' H * G: g3 n5 D" U
" `7 z/ H9 T' V% ?1 p6 S
STM8S共有9个复位源:
$ u% F6 d: a5 Y5 K- R1 r p9 t5 ]7 P8 i0 |( \: ?- w2 c
NRST引脚产生的外部复位
" [4 X0 |5 w+ ?) B8 T4 x+ K }1 J* l* `4 x
上电复位(POR)
, `6 k+ F- y5 h) t' W2 F
5 g E" ]' o$ ]) c; d% l2 I掉电复位(BOR)
% R8 k7 I# k8 n) P% f' g9 A& U! r+ k8 {9 Q0 b) f. X3 U# I5 E
独立看门狗复位( V$ Q5 m3 H6 h% N5 T0 N8 I
1 `# L0 W8 W9 W) q* g ]" A% D窗口看门狗复位
0 V" |7 d8 |- @# G9 Y* T2 f$ ]' B3 d8 S# _+ i" j8 P S
软件复位
# {/ V' R6 {9 A, C- o. M9 i5 U: S; c, N- t1 E1 T7 `
SWIM复位9 d. m# ~7 f* T/ Y' {" K! |! `& H
: z. o& z8 h% x7 t( h% W! B- R非法操作码复位2 ^2 E8 B4 t2 @( H
4 p6 k# V/ {# M' F- \+ E% Y A
EMS复位:当一些关键的寄存器被破坏或错误加载时产生的复位! c6 d- c- Y/ {2 Q; P$ v3 L% I. c* f
5 a" x6 t) ]( D4 `3 G6 m
所有的复位源最终都作用于NRST管脚,并在复位过程中保持低电平。复位入口向量在内存映射中位于固定的地址6000h。
5 r& s8 G! h9 Z2 \3 i6 J6 m1 S
& y) H7 w2 m# O复位的两种启动方式?
. ]1 ~5 S% q$ ?6 K7 p' ~2 r3 x4 V( t7 C
/ b# r- ]) E0 a' \* e答:1、上电复位:要求接通电源后,自动实现复位操作。
# H o7 a, {# q, U5 f
t* a, ?& e4 W# D* i2 m 2、按钮复位:要求接通电源后,单片机自动复位,并且在单片机运行期间,使用开关也可以实现复位。; h, v" _. x9 `
1 Q; _ F, |$ p `) [( J' o& N* s
复位存在哪些问题?. v4 ?9 t* Y z0 D
( A" [; m2 [7 ]$ @( t答:采用上电复位:复位信号上电过程中有掉电现象,可能会造成逻辑方面的错误导致相关芯片复位时间不够、二次复位等、从而不能够正常工作起来。原因:产生的复位信号给了几个芯片用,导致这个复位信号的负载压力比较大,驱动能力不够从而往下调电,此现象常常出现在RC复位上。
1 H& V: q* E; g
/ y4 C& _( l% t; D G. N复位信号上电前有毛刺与复位信号上电时有毛刺,可能会造成逻辑方面的错误导致相关芯片复位时间不够。方案:加大上拉电阻的阻值。) u4 ?% f/ @* O9 `, r
9 g1 R) X7 ~/ p* S. p4 j/ z# b
复位电路有哪些?那种比较好?; n& _" ~6 k5 ]
' I5 S# `3 U9 D- Z8 Z. s; Q7 K答:单片机复位电路主要有四种类型:
9 Z0 {- d7 A: u0 j$ m' d5 S
0 Q0 l& n3 m5 s3 S8 I1 o+ Z# _0 V3 C(1)微分型复位电路:
! n/ P0 ~( S8 V4 D8 H- a6 ^5 y( T% A9 p: a9 ~. S
(2)积分型复位电路:
; `9 W6 N* w( N0 P0 B! d. r3 J# `8 C; C6 A8 u* F
(3)比较器型复位电路:
/ i) U, e# L4 I7 g$ X3 `9 U8 J4 i7 z& x7 r
比较器型复位电路的基本原理。上电复位时,由于组成了一个RC低通网络,所以比较器的正相输入端的电压比负相端输入电压延迟一定时间.而比较器的负相端网络的时间常数远远小于正相端RC网络的时间常数,因此在正端电压还没有超过负端电压时,比较器输出低电平,经反相器后产生高电平.复位脉冲的宽度主要取决于正常电压上升的速度.由于负端电压放电回路时间常数较大,因此对电源电压的波动不敏感.但是容易产生以下二种不利现象:
% Z/ z( f$ R$ K8 C" I* s2 ?8 d! V d; `4 W+ g; v& f9 k- T% [/ V9 M
1)电源二次开关间隔太短时,复位不可靠:
' z* j- i9 w( J* B7 ?$ P& \$ c7 i6 W; R) ?
2)当电源电压中有浪涌现象时,可能在浪涌消失后不能产生复位脉冲。
, r# w& S8 d8 J8 w. ?) [4 `7 [0 l
& u! _+ e9 e% I9 k" O为此,将改进比较器重定电路,可以利用数字逻辑的方法和比较器配合,设计的比较器重定电路。此电路稍加改进即可作为上电复位和看门狗复位电路共同复位的电路,大大提高了复位的可靠性。6 U$ k0 D6 F3 \! _; t, W8 C
( p% x" W4 J a5 X( ? v& R3 _0 \(4)看门狗型复位电路.) @( e- {* K. T& A
2 s3 s" N3 w; h7 q) ? e看门狗型复位电路主要利用CPU正常工作时,定时复位计数器,使得计数器的值不超过某一设定的值;当CPU不能正常工作时,由于计数器不能被复位,因此其计数会超过某一值,从而产生复位脉冲,使得CPU恢复正常工作状态。此复位电路的可靠性主要取决于软件设计,即将定时向复位电路发出脉冲的程序放在何处是最优的设计。一般设计,将此段程序放在定时器中断服务子程序中。然而,有时这种设计仍然会引起程序走飞或工作不正常。原因主要是:当程序"走飞"发生时,定时器初始化以及开中断之后的话,这种"走飞"情况就有可能不能由Watchdog复位电路校正回来.因为定时器中断一真在产生,即使程序不正常,Watchdog也能被正常复位.为此提出定时器加预设的设计方法.即在初始化时压入堆栈一个地址,在此地址内执行的是一条关中断和一条死循环语句.在所有不被程序代码占用的地址尽可能地用子程序返回指令RET代替.这样,当程序走飞后,其进入陷阱的可能性将大大增加.而一旦进入陷阱,定时器停止工作并且关闭中断,从而使Watchdog复位电路会产生一个复位脉冲将CPU复位.当然这种技术用于实时性较强的控制或处理软件中有一定的困难。
& j, g4 J" t. t: N8 a3 t
: B- O( f* Y$ M8 L6 W由此可见,四种复位电路中,看门狗型复位电路较其他三中复位电路更加适合。
% _% @* e; `$ T r" D2 o4 Y3 b/ u) |# r8 X
堆栈相关问题:* G; h! \5 V- c6 N4 f3 Z( t
0 l; o9 D; w; G堆栈的原理?过程怎么操作?* g$ g K5 L7 G. M7 J3 G- i+ f
( T9 V3 r! k) O& S答:单片机RAM中,常常会指定一个专门的区域来存放某些特别的数据,它遵循先进后出、后进先出的原则。这个RAM区就是堆栈。堆栈是一种数据结构(数据项按序排列:堆,顺序随意。栈,后进先出)。使用一个称作堆栈指针的专用寄存器指示前的操作位置,堆栈指针总是指向栈顶。& R3 k" R9 y# \8 d) ]
+ r- x( R- R0 G2 W
操作过程:( E$ I# S7 k$ r3 S$ k) @
0 f& x3 m" Y1 ?0 Z/ o% k9 l
1) 堆栈的建立(初始化)8 ]: ^7 G* O/ K
( J! h/ c" A/ v& i
2) 参数入栈(push)
3 ]3 x' C) i/ k% L# N
, M ], `1 }5 G* m6 Y3) 参数出栈(pop)(后进先出)
; O0 J; ~0 v* h0 L- s/ A3 `; l8 M- m( g2 m
堆栈应用在什么地方?存在什么问题?怎么解决?$ P8 p c/ Z" R1 C
8 W* o8 H; d) B' T, q. W答:在80C51单片机中,堆栈在子程序调用和中断时会把断点地址自动进栈和出栈。进栈和出栈的指令(PUSH、POP)操作可用于保护现场和恢复现场。由于子程序调用和中断都允许嵌套,并可以多级嵌套,而现场的保护也往往使用堆栈,所以一定要注意给堆栈以一定的深度,以免造成堆栈内容的破坏而引起程序执行的“跑飞”。8 s: ~2 z: F% M. I' H+ }4 D, U, @
' O! K O) t- b6 ^1 N( ~ . T8 Z; s* A: G8 q3 C/ |7 f' o
9 X# q8 ]& l4 F7 a* r" u% m# L3 W- A
堆栈指针SP在80C51中存放当前的堆栈栈顶所指存储单元地址的一个8位寄存器。80C51单片机的堆栈是向上生成的,即进栈时SP的内容是增加的;出栈时SP的内容是减少的。
. v7 G# G* e+ D8 t) g5 `5 r1 N+ K7 I5 I/ b( g) R+ Z# r
系统复位后。80C51的SP内容为07H。若不重新定义,则以07H为栈底,压栈的内容从08H单元开始存放。但工作寄存器R0~R7有4组,占有内部RAM地址为00H~1FH,位寻址区占有内部RAM地址为20H~2FH。若程序中使用了工作寄存器1~3组或位寻址区,则必须通过软件对SP的内容重新定义,使堆栈区设定在片内数据RAM区中的某一区域内(如30H),堆栈深度不能超过片内RAM空间。
' J1 [! a, c. s' Q5 J- F
& T; c" j0 P# Z3 o ! a6 G9 k' Y% w4 }' r5 H( r
/ o- q! e. d$ o; u: c& S
学习堆栈的作用?. v+ |/ {0 s) H( |( I: ?; I
9 r8 H! H- G2 S/ J: o, e \! x- y答:在片内RAM中,常常要指定一个专门的区域来存放某些特别的数据,它遵循顺序存取和后进先出(LIFO/FILO)的原则,这个RAM区叫堆栈。
/ ~1 o6 I# |. b7 B K
/ G9 D2 L6 i/ S7 s; e1.子程序调用和中断服务时CPU自动将当前PC值压栈保存,返回时自动将PC值弹栈。
5 X5 w3 m+ V. ]) H% j5 |, |$ r9 h' z+ ?, B' J: `0 K
2.保护现场/恢复现场. q/ `* z; f; h4 X5 f/ F! ~6 ?
8 q8 w1 W; i0 ^" L5 G3.数据传输
* u: w! P( Y- R7 N% h8 Z7 X" D: |0 L% V+ d( V
$ v7 E% y- y2 R, O
, y$ n" K7 S' W1 x也就是说,堆栈是进入中断的时候用到的,单片机一旦遇到中断请求,就会去处理中断,处理完后再回来处理主程序,这样就涉及到了一个问题,单片机要保存中断之前的信息,以便处理完后能够回到主程序中,单片机会在响应中断前,把单片机现在的指针地址(也就是处理完要返回的地址),以及一些必要的数据压入堆栈(没有这些数据,单片机处理完中断后就无法确定主程序的状态)。4 e3 Z' \8 V6 z3 p4 D1 K8 F# c9 Y
/ q4 s5 h2 b( y# V! P8 f. p( _
1 T' L; h! Y; k' b
+ r4 b6 K- ?0 t$ ?0 }' C中断相关问题:3 Z) f- r( \1 O
! L5 M( y& ?% r
中断的响应过程?优先级?% _1 V, r9 b3 E( S0 g
, q- A- s$ x1 L |. U' b3 @( {
答:1、响应过程:
% ^# l9 _& P. @* M, O
6 |3 m9 S* M" Z1)根据响应的中断源的中断优先级,使相应的优先级状态触发器置1;
" C* N4 L5 ~9 O2 R9 l9 ~, ^2 x6 A" G9 Z% K
2) 执行硬件中断服务子程序调用,并把当前程序计数器PC的内容压入堆栈,保护断点,寻找中断源。9 E5 i4 k& O+ j; A4 M; S
' A1 n3 X; }7 c: a- C5 c9 V0 a
3) 清除相应的中断请求标志位(串行口中断请求标志RI和TI除外);3 p q6 V( U6 U
, ^( |2 c$ {1 [3 ^, k5 L: J$ Q9 n' j
4) 把被响应的中断源所对应的中断服务程序的入口地址(中断矢量)送入PC,从而转入相应的中断服务程序。
0 n4 k! j+ a1 \# i% T" A k; Z0 M
5) 中断返回,程序返回断点处进行执行。
2 r+ O& m* X- X& D
/ e- ~% B6 `( c6 H! m2、优先级:中断的优先级有两个:查询优先级与执行优先级* M& {3 y6 Z1 L
; J! q- ^- z. n$ a0 B# _1 A查询优先级:查询优先级是不可以更改和设置的
( `* c% a$ z+ R2 W3 H$ S# Y& ]" b
; ]5 r8 M2 p+ {: O1)系统默认的优先级(逻辑上):
" Y, o. c3 H3 g3 }( D
* H" w; z4 U; C' N5 n( g/ \外部中断0 > 定时器中断0 > 外部中断1 > 定时器中断1 > 串行中断
! s" m+ k' ~1 p! z: {
: \" ?0 A' S; L8 Z, v8 y2)由IP寄存器来决定优先级。当IP对应位置为1时,该中断级别提高。同为1是按默认级别
& X( P k# F! a; l( u3 S! U* Z4 F" I. y- X& e& x
中断嵌套的好处与坏处?' ?9 C2 O* B. s2 f
/ D, g. T, |2 x) B6 T4 P# c7 w+ f答:中断嵌套:CPU在处理级别较低的中断过程中,出现了级别较高的中断请求。CPU停止执行低级别中断,执行高级别的中断处理程序后,再接着执行低级别的未被处理完的中断程序。. q- D- _( @( E* q" Z' P2 j
, \& w7 e+ y1 @# z- E2 _- @ i8 P使用中断嵌套可以使高优先级别的中断得到及时的响应和处理。
! N+ q6 ?' I/ x7 X: ~
8 u0 O$ j" l6 X T7 A( ^& Y1) CPU与外部设备并行工作
- `# \) g Z9 C& D- W7 s% Y& G3 q: ^) a3 |& T* l0 c
2) 能够处理例外事件# F) x4 M+ O# T* V
8 T5 O% J8 R& c9 R X3 K( x5 b3) 实现实时处理
) s a. z6 {! ?" ^& V1 Z4 T3 M# G. Q% }* g! T
4) 实现人机联系
# z7 t* F; ^4 Z" J
3 C( ~8 J0 e; N6 k5) 实现用户程序与操作系统的联系
/ `1 ~- j, O) R$ b b" E' U( s+ g, V5 C4 k8 L6 J$ g
6) 实现多道程序并行执行
& A7 ]# ]! G. o- m7 T
`% L' }+ W9 t4 b- P1 s, d9 e7) 在多处理机系统中,实现处理机之间的联系
( `$ p2 X2 g/ _( t/ W7 M( J1 K* W
0 ^0 T- {* M+ s8 p' v* D3 P坏处:高级别的中断一直持续的话会影响低级别中断的处理。0 C9 f' V, @. s. o
2 B4 s; f' a6 x) J中断向量表的理解
/ e) w* _! U8 h P( k" J! o3 s+ q( e4 P; S9 Y4 E" u; `
答:中断源的识别标志,可用来形成相应的中断服务程序的入口地址或存放中断服务程序的首地址称为中断向量。把所有的中断向量集中起来,按中断类型号从小到大的顺序存放到存储器的某一区域内,这个存放中断向量的存储区叫做中断向量表,即中断服务程序入口地址表。6 s) k9 O& r$ m% k9 _; F
+ n# V* V V( _+ u8 N5 }中断在单片机中起到什么作用?
8 n$ W5 V* h* S9 ~, r, Y' v4 y8 _) d
答:中断能实现快速的CPU与慢速的外设同步工作,实现数据传送、故障检测与处理、人机联系、多机系统、多道程序分时操作、实时信息处理等。
9 Y: t9 W7 G4 y4 R* j, W; T" ~" ]- P" B5 k8 u/ i' S! U
& C* Q4 ]$ z9 N; G7 C% ^2 |
. Z7 m) I% ^ f* E& J, S( h其它:$ W4 F9 ^( q" r. L0 T' ^$ D; G
$ M4 [8 s1 a3 \& G+ |* z
什么是临界段,哪些情况下会存在临界段的问题,如何进行临界段保护。
% w; f# |; j- @# @: b& p$ l' ]5 k8 b/ ?+ S: U+ |- r
答:1.临界段代码,也叫临界区,是指那些必须完整连续运行,不可被打断的代码段。: S5 O2 ^ v% [/ b) [# x" q
6 ?* B: L6 S' `$ u# q* [0 B2. ①读取或者修改变量(特别是用于任务间通信的全局变量)的代码,一般来说这是最常见的临界代码。
$ `: ]6 u) t& {+ `6 q+ ?( h2 l9 |% l: J4 o+ S1 v$ {
②调用公共函数的代码,特别是不可重入的函数,如果多个任务都访问这个函数,结果是可想而知的。总之,对于临界段要做到执行时间越短越好,否则会影响系统的实时性。/ [8 \# C H/ v O+ t, i7 T
( N+ [7 o; C5 H
3.中断处理程序和任务都会访问的临界段代码,需要使用关中断的方法加以保护;仅由任务访问的临界段代码,可以通过给调度器上锁的方法来保护。- \: X7 s1 W, ]) Z+ W( p
8 I% p, y, e( Z什么是可重入型函数,使用时需要注意哪些问题5 G: t, j$ _/ t$ y2 Z, J
3 g; C [+ x1 l* O8 E
答:可重入函数7 R3 y. i( [7 _5 z' I5 ]
6 T# G, f T! q. d
不为连续的调用持有静态数据。2 i) s1 D5 p! |5 c: u; |0 i) S
% A, m k$ |2 F0 s0 j
不返回指向静态数据的指针;所有数据都由函数的调用者提供。
. p6 f$ L6 A) h( t, g R7 R1 N" z) T* y# L- {3 n% @" k
使用本地数据,或者通过制作全局数据的本地拷贝来保护全局数据。1 K7 A6 N; l# i+ l* \
! A0 K+ k5 F% [9 J" _# L
如果必须访问全局变量,记住利用互斥信号量来保护全局变量。
5 n, G8 z/ F; B: @, d" D0 B# }% ?4 C4 f+ j
绝不调用任何不可重入函数。) ]- L0 c5 P Q' Z: ~
/ z$ F! F6 {$ }! G/ @
8 E$ s& {# L/ ?: m
, ?! R8 w/ K! S0 W+ P$ `
注意事项:
4 g9 r3 T1 U6 @" m5 |' f u' Z! P9 ^
1 :编写可重入函数时,应注意局部变量的使用(如编写C/C++ 语言的可重入函数时,应使用auto 即缺省态局部变量或寄存器变量)+ E, Z8 Z! x/ s4 d k& a; e
% f' {7 y1 e% ^+ z* n6 S
说明:编写C/C++语言的可重入函数时,不应使用static局部变量,否则必须经过特殊处理,才能使函数具有可重入性。
2 @/ i$ T# a3 E- g8 c) r) X$ h& `/ t; Q& T) G: i$ N' Q0 B
2 :编写可重入函数时,若使用全局变量,则应通过关中断、信号量(即P 、V 操作)等手段对其加以保护
+ \. I% I+ }( o4 V
8 y$ t7 Q( l0 Q- ~) K说明:若对所使用的全局变量不加以保护,则此函数就不具有可重入性,即当多个进程调用此函数时,很有可能使有关全局变量变为不可知状态。
0 V4 v% j: B, h' U' p( H6 L
1 p" a6 ^; s4 u9 G! S$ L专用词汇解释:
3 k. e+ \+ L* m5 C& Z7 X( P3 U- C
VCC:C=circuit 表示电路的意思, 即接入电路的电压;. M5 V! o' B' a- P A8 Y- x1 S9 r
2 g& D( c9 h/ Z1 Z, V7 R" @
VDD:D=device 表示器件的意思, 即器件 内部的工作电压;, \0 o, n0 N2 {* H9 A
# n$ A, K- ], j对于数字电路来说,VCC是电路的供电电压,VDD是芯片的工作电压(通常Vcc>Vdd),VSS是接地点;有些IC既有VDD引脚又有VCC引脚,说明这种器件自身带有电压转换功能。
' w: W' s8 F L8 x4 p. v1 g8 Y9 K" P) J6 `# A* j/ V" x) _
VEE:发射极电源电压, Emitter Voltage, 一般用于 ECL 电路的负电源电压.4 Y* {- u. H! j$ w7 D$ _- W
- G- \- H1 R+ G# O: d |4 v. W# {VSS:S=series 表示公共连接的意思,通常是指电路公共接地端电压。9 z' J/ y" g& f5 I
9 j( M0 c) `% @
VPP:不同芯片对Vpp的定义稍有不同,比如电压峰峰值,单片机中Vpp多数定义为编程电压
3 \$ T. U' B* q7 t
& c+ P. U% D! H5 l6 ~ G' p M在场效应管(或COMS器件)中,VDD为漏极,VSS为源极,VDD和VSS指的是元件引脚,而不表示供电电压。一般来说VCC=模拟电源,VDD=数字电源,VSS=数字地,VEE=负电源8 z# A! Y7 h/ m. r+ S5 I
0 Z# I5 W% F; h q( h4 A
0 k# @4 N [+ R9 k! w, \ |
|