找回密码
 注册
关于网站域名变更的通知
查看: 252|回复: 2
打印 上一主题 下一主题

DSP28335的系统初始化

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2021-11-30 13:30 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
近日工作中又涉及到了DSP28335的应用,看来TI的芯片还是得到了公司领导的认可,也直接丢了一份DSP28335的FOC程序给我理解。以前读书阶段较为简单的接触过一段时间,对DSP28335的基础功能部分有了一些浅显的了解,现在工作中要实际开始用了,开始发现之前学习的程度还是不够,因此要更加深入的探究一遍。可能非常基础,希望大家也不要见笑,人真是年龄越大忘东西越快。$ @. ]5 i3 T( I- J1 S$ L) E

& E3 t& I7 w5 T9 ^# L3 z系统初始化
( F$ W4 r' J0 I5 C7 |% T首先从系统的初始化开始,系统初始化主要是系统时钟、看门狗等功能模块的基础配置,TI官方配置的系统初始化函数如下:, [- G) ^1 s2 O3 M) j

) ~  n. T' ?8 ]" p5 v! X8 _: `void InitSysCtrl(void)
( v4 `) G7 w, E6 C{
% I/ p1 V% h- I4 d " A. ^- q2 B4 V8 l0 w& g' F$ V
   // Disable the watchdog6 u* Y; s# ^# [
   DisableDog();/ ~8 \0 ?4 u: A% [0 f

. j# {+ Z' S- x% ?   // Initialize the PLL control: PLLCR and DIVSEL
+ N$ m" O7 i7 O   // DSP28_PLLCR and DSP28_DIVSEL are defined in DSP2833x_Examples.h
1 B; y( G6 @* V2 U   InitPll(DSP28_PLLCR,DSP28_DIVSEL);7 O4 S  f+ E3 B4 g2 f& r

7 J# ]8 T! w$ i( t   // Initialize the peripheral clocks
; f- @( w( x; l# I1 k+ M# W   InitPeripheralClocks();
) T$ g( F2 K' R- s& e7 @3 |}
* [/ {9 k$ @" b" N3 P上面代码主要由3个子函数构成,分别为 DisableDog();、InitPll(DSP28_PLLCR,DSP28_DIVSEL);、 InitPeripheralClocks();这三个子函数的功能我们也来一一分析。5 o2 K: E& Q: I3 U) I
) O( d& K! U' W$ R! A  v% n* j
看门狗配置函数DisableDog()
8 G6 \/ k: W8 _首先是开门狗初始化函数DisableDog(),函数代码如下:
* K# S! O- i- R- H; _6 W/ Q% Z" `6 u" W0 F5 p( b% c
void DisableDog(void)1 v% h2 J5 H2 D4 y
{
, D1 K8 f' l6 L& M# ~  J    EALLOW;) i. n5 Z# d2 b. ?. T1 z
    SysCtrlRegs.WDCR= 0x0068;
4 }  T" B( y6 Y& z$ \    EDIS;
; q2 A% J- y9 S- A# ~}
  ^0 B$ P* O" v$ i7 N& `代码解释:
7 `" ]5 `6 c8 P( }
" v2 A' M+ r# l1、EALLOW /EDIS 打开/关闭状态寄存器保护。EALLOW/EDIS 是DSP为了防止杂散代码或指针破坏关键寄存器的状态宏定义指令,关键寄存器包括ePWM、Flash、器件仿真寄存器、FLASH寄存器、CSM寄存器、PIE矢量表、系统控制寄存器、GPIOMux寄存器等,这些寄存器的状态决定DSP是否稳定运行,因此需要修改之前应用EALLOW打开保护,修改完后必须用EDIS关闭。5 ^1 C! {# K8 G* B1 F/ X# r

( K- O2 F+ I9 \- F2、配置SysCtrlRegs.WDCR寄存器为0x0068。关闭看门狗,也可以戏称为把狗杀了,好残忍,看门狗的实际作用就是防止CPU跑飞或者其他故障导致系统出现不可挽回的故障,如果一段时间收不到CPU稳定运行的信号就会复位CPU,从而保证CPU的稳定性。打开WDCR寄存器表可知,寄存器后8位起到实际作用,0x0068 = 0110 1000 ,第7位置0看门狗不满足复位条件,第6位置1禁止看门狗模块,第5~3位写101强制写,第2~0位写000配置看门狗时钟。关键为第6位置1禁止看门狗模块。, u) ]4 j: l) G+ W' k/ f

2 f5 G0 q* L- B: R0 |8 b6 [% ?8 B0 q; E$ Y; ^! D, x, ?. X

6 J# q1 [7 K. _锁相环初始化函数 InitPll(DSP28_PLLCR,DSP28_DIVSEL)
+ Q/ e7 R& l/ X$ I% I5 F其次是锁相环初始化函数,在DSP中锁相环函数主要是用在时钟的分频上,将晶振产生的震荡进行分频和倍频操作,是整个芯片心脏——时钟能够起作用的关键之处,因此必须在程序开头对其进行配置。其代码如下:
5 z2 b4 W( E" a2 x
0 I' e) @) |1 I0 w4 i" s0 ivoid InitPll(Uint16 val, Uint16 divsel). @0 @2 M! b* N; b! K# z
{
9 H6 m# |, H( Z+ j
( n9 z9 H! G9 H$ X4 N   // Make sure the PLL is not running in limp mode  确保PLL没有运行在故障状态! L1 v3 n! P. `3 t5 ^* y7 L/ n
   if (SysCtrlRegs.PLLSTS.bit.MCLKSTS != 0)& `( A# ~+ d. D! a, m1 e0 q
   {" I. Y0 G8 v/ f2 y
      // Missing external clock has been detected
: _1 t* a% s7 U' j      // Replace this line with a call to an appropriate6 Y8 E5 |7 w! k( d
      // SystemShutdown(); function.) s. |! _2 _2 `+ g  F
       // 若检测到系统失去外部时钟,则关闭系统: Y0 C* n( N4 m6 N
      asm("        ESTOP0");
1 ~7 [! J/ p6 ?# j4 E   }7 m& G& d3 M$ ^; {+ Y
" f8 W# J( h" v  o% r+ X( E
   // DIVSEL MUST be 0 before PLLCR can be changed from 在PLLCR可以从更改前,DIVSEL必须为0
( T' {5 m! m' O+ E   // 0x0000. It is set to 0 by an external reset XRSn 通过外部重置XRSn将其设置为0
0 c. B" X3 Y  m   // This puts us in 1/4- Y4 L' |4 T9 h9 u! S9 w% q5 z
   if (SysCtrlRegs.PLLSTS.bit.DIVSEL != 0)* H+ ~! W! e' w0 x
   {
8 e/ V6 N5 e: s# s; J4 O# ?; H$ t       EALLOW;- a) q, N6 b+ |( k$ _# q
       SysCtrlRegs.PLLSTS.bit.DIVSEL = 0;
5 B2 \2 w% B& Z9 x0 t9 `       EDIS;9 R/ N# r7 x$ b; a! r, o% W
   }, h4 w+ C2 f( D% Q; L! B4 w
' B) Q* y& c$ f' G, K5 o
   // Change the PLLCR  更改PLLCR
6 H- z) M4 M3 ]4 V- o8 |& K2 S   if (SysCtrlRegs.PLLCR.bit.DIV != val)" y& _  l6 ]2 m+ }. W* T1 f
   {" e$ H1 q. v1 w. }( A3 E; B

7 @2 M! g. |6 ^: p      EALLOW;
; p" I9 R( L. Q% B- ?      // Before setting PLLCR turn off missing clock detect logic 在设置PLLCR之前,关闭缺失时钟检测逻辑4 m+ s' J; B/ F5 G7 T
      SysCtrlRegs.PLLSTS.bit.MCLKOFF = 1;6 t# c. F, Z8 t
      SysCtrlRegs.PLLCR.bit.DIV = val;
5 n7 r( e! o" J! j+ z      EDIS;
! J$ ^$ ^: A+ y6 h# o! ~ ) w( R+ o" z9 z$ ]) z# Q& A% f; H9 H
      DisableDog();
- X, `/ y! o  e  R+ R3 f1 u2 J
; H) i: a) Y7 a, R8 m      while(SysCtrlRegs.PLLSTS.bit.PLLLOCKS != 1)5 x  R6 p- M2 P, v) Q
      {- r0 H; Q- T  B) k1 F
          // Uncomment to service the watchdog' ~3 S( H  X7 `# W  i# ?
          // ServiceDog();/ V0 a8 y9 ~4 G) ^/ y; O, e, T# V
      }
# }/ x; W5 W. |3 ^4 {( o1 H 3 |/ g5 J6 Z8 p; ~+ G. ]7 w
      EALLOW;3 j# m# y3 c2 m" ?
      SysCtrlRegs.PLLSTS.bit.MCLKOFF = 0;6 z* k" O4 p) n, n3 ]
      EDIS;9 ]5 N1 n6 Z  ~6 a; o  H3 a
    }
; R& x- d+ @7 A* i: K 2 m2 F4 L4 _( X3 ~
    // If switching to 1/2 如果切换至1/2
5 n  {8 m4 U9 B- _    if((divsel == 1)||(divsel == 2))% b* C! q& R& W2 P( W  j, [
    {6 S0 J7 u3 G4 g  s) ~4 I3 E
        EALLOW;( o, I* S  l3 h. Y$ W5 r) n% h3 Z
        SysCtrlRegs.PLLSTS.bit.DIVSEL = divsel;# V$ m) H' G9 i0 L2 e
        EDIS;+ A& e  U% y0 b- v  j
    }
: d7 B. P& o5 a, X* g/ j( ~$ \
) Q$ Z7 ?1 G: w    // NOTE: ONLY USE THIS SETTING IF PLL IS BYPASSED (I.E. PLLCR = 0) OR OFF
. W* ?' d5 \" |- @' f- B    // If switching to 1/1  如果切换至 1/1
4 D  [( {4 g8 B& |    // * First go to 1/2 and let the power settle; k' `. Z8 o# B/ q7 [
    //   The time required will depend on the system, this is only an example3 v$ Q' t- \" T& g$ v; H
    // * Then switch to 1/1
# P0 C- }" c: U! U, T! \5 M    if(divsel == 3)
$ d1 W6 z8 L/ R$ X, p    {# j! [# o  {& N* s+ F
        EALLOW;
# k$ k& \% |8 P6 P& W        SysCtrlRegs.PLLSTS.bit.DIVSEL = 2;7 s% z' m1 S# _6 ^. U% f% U
        DELAY_US(50L);
& N% h0 R- W& m2 I. q, Q% Y9 b        SysCtrlRegs.PLLSTS.bit.DIVSEL = 3;& ~( a" Z$ m6 p+ V# P% ~7 V3 H
        EDIS;& S' s2 y" `9 F+ F4 I1 n% i
    }- H" h2 Y/ v% S8 ~
}9 I6 }) K/ I8 Q+ j- ^

8 N3 E$ O. ]) ?; rvoid InitPll(Uint16 val, Uint16 divsel)" x* V1 E  P7 w. M5 {* R- l3 g( i) g
{
7 c& x" E6 ~$ f5 q# w' N: ~9 T $ I- q$ A- Q1 M: e. c9 B% @
   // Make sure the PLL is not running in limp mode
5 f" J6 o; }+ f   if (SysCtrlRegs.PLLSTS.bit.MCLKSTS != 0)
4 D1 j" O8 V; ]9 }# H3 V, l% x   {
- ^6 e( m7 P% ~# G( t" x" ]7 G1 W      // Missing external clock has been detected
# W' L9 P( @3 G% |      // Replace this line with a call to an appropriate
( t0 V* ?# {, }6 }9 z      // SystemShutdown(); function.
  a' s- Z: Y/ K# L9 E) l( W      asm("        ESTOP0");3 V$ y$ f. n" ~$ G. \% N
   }
& m8 ~& E% S" k9 F. j3 `- ^
& E' R$ w1 m. w$ M; F" E   // DIVSEL MUST be 0 before PLLCR can be changed from
2 H+ ]; Q, ]& {) e4 K) \5 K   // 0x0000. It is set to 0 by an external reset XRSn
! @9 t+ R! \+ V: a0 Z   // This puts us in 1/4
% N" d1 R; ?, C: e- L- Q   if (SysCtrlRegs.PLLSTS.bit.DIVSEL != 0)
- h0 s( m: P9 D) [4 s   {: A2 T) {" m9 c4 n
       EALLOW;
" E  L+ Z7 ]; Z       SysCtrlRegs.PLLSTS.bit.DIVSEL = 0;
! w  V$ Z$ J, [2 Y7 \% N# D' f       EDIS;
% @" j, w0 Z: p( H   }
% j6 r7 q, `8 O; w: o8 ] 6 ]* q# M4 g; V
   // Change the PLLCR
0 ?# g" I4 g* M1 f9 C   if (SysCtrlRegs.PLLCR.bit.DIV != val)$ u) G. {8 p9 k! u. b
   {
$ d. q9 |- ]3 l( } * r$ T! ]. d) N; f0 v
      EALLOW;
, x; F& D% S3 p/ [      // Before setting PLLCR turn off missing clock detect logic1 M$ K$ P% W" M) B3 O
      SysCtrlRegs.PLLSTS.bit.MCLKOFF = 1;
  s3 @6 G4 y( a- k" A% ?      SysCtrlRegs.PLLCR.bit.DIV = val;8 m: Q' o8 z; p- [/ G- q2 v/ A
      EDIS;
# N) Y1 c+ _* V ; y* [2 ~. {! L" K5 K* z
      DisableDog();' m: }+ h2 }6 r2 r  F! d% r& d

7 J& q0 |( _. W. m1 Z      while(SysCtrlRegs.PLLSTS.bit.PLLLOCKS != 1)
  R  T) a. \9 M$ c) p6 ]6 q( X8 w      {
8 J$ W3 i7 N0 g3 p% e3 `4 M- p3 ~% q          // Uncomment to service the watchdog  {1 c; w- B* \8 @& J$ j5 u
          // ServiceDog();5 ~4 u! q9 U' t0 J2 K8 {  q' t
      }
% V) H7 o& S' h' z
$ b+ [) M/ [" h2 G/ W2 u      EALLOW;
/ Y% r) {1 Z4 m0 ?) z      SysCtrlRegs.PLLSTS.bit.MCLKOFF = 0;
, @- K4 t2 c- j) ]% `      EDIS;! p4 k! y" ~) P
    }# ^6 w7 Y  U5 }8 ]; Q7 O$ C
: S1 c5 u& j0 E4 f
    // If switching to 1/2
4 P8 `' B' N" v& C' Y    if((divsel == 1)||(divsel == 2))
- d9 T, A$ v/ H1 M3 Z# ?    {
$ C9 W/ ~* B4 n) |" ]$ D        EALLOW;
1 @( w$ e+ Y& x        SysCtrlRegs.PLLSTS.bit.DIVSEL = divsel;% N- Q: I. \- U1 }- M4 k$ @) B
        EDIS;, F4 A) y" P+ F5 x; {$ j1 W+ z
    }
. J) R" Q6 Q( ~3 O
6 x& O, T9 w  b$ ~    // NOTE: ONLY USE THIS SETTING IF PLL IS BYPASSED (I.E. PLLCR = 0) OR OFF4 M; O, P- |! M: {7 G) Q  b& M3 K
    // If switching to 1/1' x/ E1 K# O( `7 B" r9 X
    // * First go to 1/2 and let the power settle
. u$ ]1 a! U; p0 V1 O    //   The time required will depend on the system, this is only an example0 X5 b  ~6 m9 l, r5 ~+ d" H
    // * Then switch to 1/1
; E* V7 E4 B2 r, ~    if(divsel == 3)* Z" W! i) y- Z
    {
& A: g4 P; _1 I, ?$ @        EALLOW;9 \  c8 i6 l! b- r
        SysCtrlRegs.PLLSTS.bit.DIVSEL = 2;
) |7 a# |3 e/ G+ P" G- Q' b        DELAY_US(50L);
  @  m' m" H7 ]  ]# V) j8 T" |        SysCtrlRegs.PLLSTS.bit.DIVSEL = 3;
+ ]7 b+ x( Q: ?4 e- k! A        EDIS;
  d5 z1 l- h" u    }% V4 k9 m! f8 d+ Y* v
代码解释:
6 ]: r6 x' \- P( ?" y2 V
, @) X6 v( M: r5 \1、if (SysCtrlRegs.PLLSTS.bit.MCLKSTS != 0),检测外部时钟是否存在,保证在外部时钟正常的情况下运行系统。0 i: a/ G' F6 ]* M8 `+ V

- P  |* ?0 A6 V7 E2、  if (SysCtrlRegs.PLLSTS.bit.DIVSEL != 0),如果8~7位不等于0,则强制置为0。/ o) j, |) \2 S  ^/ v& @
6 D, q& Y" U/ P4 I4 t
! \4 r9 V" Z8 A( y* Q, }' G3 D

% P7 J' ^+ G% u0 N) `3、if (SysCtrlRegs.PLLCR.bit.DIV != val),如果锁相环控制寄存器PLLCR的3~0位不等于10实现10倍频,则使得锁相环状态寄存器MCLKOFF标志位为1,并强制置锁相环控制寄存器PLLCR的3~0位等于10。并且锁定锁相环,然后打开时钟丢失检测功能。
- C+ U9 l' F3 g# T- Y2 F# Z- d$ I
7 }' ~6 ~% J9 \
4、if((divsel == 1)||(divsel == 2)) 与 if(divsel == 3) ,配置锁相环的分频。通过查询头文件可以看到这两个值。证明系统默认的倍频数位10倍频,系统默认的分频数为2分频。
, Y8 b# l' w) W# q- Z; c0 G& D- }" d

6 a3 r1 l( [/ l9 p, B, {0 e
: C" R/ G& C. f7 N/ I" Y" K7 n2 ~  l7 }- v( N$ E  F; c
由于目前的生产工艺,晶振频率为30Mhz的晶振性能更优,配置外部晶振为30Mhz成为主流,因此选择的倍频数为10,分频数为2,30*10/2 = 150 Mhz ,这也是DSP28335主频为150M的由来。
. ?  N2 @5 \( l
! y, T) j2 k  @7 [3、初始化外设时钟函数InitPeripheralClocks();9 w# ?+ t# R" {" Q) W6 Q) Y
在进行了外部晶振的倍频和分频后,芯片就要将自己的动力分配给各个外设,驱动各个外设进行工作,这个动力的分配就是初始化外设时钟函数的作用,函数代码如下:, o5 r4 C5 P. R. t, a6 R# D

) V% `( {- {* L8 ~, ?$ e; V2 Mvoid InitPeripheralClocks(void)
% V; j( w2 u1 F; X' X{
1 ?1 u' R, b: M, R7 [   EALLOW;2 e: g& d+ s5 N6 C
: b/ h+ H' {* f' Y5 ]* F$ I
// HISPCP/LOSPCP prescale register settings, normally it will be set to default values& m  k, L; D. s- b+ W) f& i( ?1 u4 j
   SysCtrlRegs.HISPCP.all = 0x0001;  T  I( ~4 x* L/ A
   SysCtrlRegs.LOSPCP.all = 0x0002;
+ Q2 o) I3 W) E, K) s2 ?) L7 I
+ |4 {* ^! c& t' ?& E9 P// XCLKOUT to SYSCLKOUT ratio.  By default XCLKOUT = 1/4 SYSCLKOUT
" C7 `$ G: J6 j! R+ p   // XTIMCLK = SYSCLKOUT/2
* F) d. p8 d+ c. [, g7 ~   XintfRegs.XINTCNF2.bit.XTIMCLK = 1;
, @4 e( Q+ v6 Z5 N7 q   // XCLKOUT = XTIMCLK/2
+ U! ^* g. C: w- |+ @! G   XintfRegs.XINTCNF2.bit.CLKMODE = 1;- }+ B# S1 y3 n7 Z0 u, v) s
   // Enable XCLKOUT( D. Z% X2 L$ b! O* T
   XintfRegs.XINTCNF2.bit.CLKOFF = 0;+ k0 K. {; k# y& ~

7 r; v) x" O! w1 E// Peripheral clock enables set for the selected peripherals.
/ J: D; ?* ~* x- u' e% k% Q// If you are not using a peripheral leave the clock off* O5 Y6 K0 ~6 v  \5 [
// to save on power.
( U) ~3 ~, q# R//0 f& c0 ?! d. Y& v7 k) H( |5 t& W( ]
// Note: not all peripherals are available on all 2833x derivates.3 Q- i% H  s! ~$ n
// Refer to the datasheet for your particular device.
. Z! N( Y: i$ O, ?, V! W, v//) x! @2 B% ]! N3 J, ]
// This function is not written to be an example of efficient code.
: H0 S: J) g$ v, P/ p 6 x. F7 J- ^' [# S. b4 K
   SysCtrlRegs.PCLKCR0.bit.ADCENCLK = 1;    // ADC
& {, ?7 }* J0 d% g2 |" C) h. d : M( z* r/ Y* \1 Y
   // *IMPORTANT*
) s) a* O6 Q' L: Z  _   // The ADC_cal function, which  copies the ADC calibration values from TI reserved
- l+ q  B& _2 |- i, S   // OTP into the ADCREFSEL and ADCOFFTRIM registers, occurs automatically in the: x8 b$ \; ~) M& o- ]
   // Boot ROM. If the boot ROM code is bypassed during the debug process, the1 N6 W1 }" E( l& G" w5 N5 p0 J# J
   // following function MUST be called for the ADC to function according0 v2 E$ U7 {9 [1 w; E
   // to specification. The clocks to the ADC MUST be enabled before calling this
5 C+ B$ f# R* E2 P5 A, L   // function.$ N4 @: k- o, B# I5 t
   // See the device data manual and/or the ADC Reference
) X" ]3 k' j9 ?. T   // Manual for more information.
- O. R; u/ A/ h! R' i; w6 i . x/ s; I# P6 U1 g0 g' S2 [  o
   ADC_cal();
8 W- @6 U' ]' E 3 V( X' R3 E0 V4 \

! w  v( F; M1 I' c" v   SysCtrlRegs.PCLKCR0.bit.I2CAENCLK = 1;   // I2C
) P3 a" m8 x- P5 I0 `, }   SysCtrlRegs.PCLKCR0.bit.SCIAENCLK = 1;   // SCI-A1 @7 T2 p: w/ }/ c' h) h
   SysCtrlRegs.PCLKCR0.bit.SCIBENCLK = 1;   // SCI-B
( X5 R' N& E, V- J   SysCtrlRegs.PCLKCR0.bit.SCICENCLK = 1;   // SCI-C
2 y( L; i. M* m   SysCtrlRegs.PCLKCR0.bit.SPIAENCLK = 1;   // SPI-A
8 C1 }5 C- z, _" j7 j0 K   SysCtrlRegs.PCLKCR0.bit.MCBSPAENCLK = 1; // McBSP-A4 q: w* `4 i7 s" P8 r
   SysCtrlRegs.PCLKCR0.bit.MCBSPBENCLK = 1; // McBSP-B
# p/ ^9 o, B- {. t% g   SysCtrlRegs.PCLKCR0.bit.ECANAENCLK=1;    // eCAN-A5 j3 |& X$ H: ^2 X. n
   SysCtrlRegs.PCLKCR0.bit.ECANBENCLK=1;    // eCAN-B4 L5 y! A6 N! i( k# B
# x* n( j3 X* D. Q9 s
   SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 0;   // Disable TBCLK within the ePWM1 H; ^2 q: w8 }  O
   SysCtrlRegs.PCLKCR1.bit.EPWM1ENCLK = 1;  // ePWM1- |2 f+ l0 f9 x0 l3 n$ }
   SysCtrlRegs.PCLKCR1.bit.EPWM2ENCLK = 1;  // ePWM2) [3 G8 ~) A$ l: P
   SysCtrlRegs.PCLKCR1.bit.EPWM3ENCLK = 1;  // ePWM3: V; n4 p0 ?% [# b2 N* U2 @
   SysCtrlRegs.PCLKCR1.bit.EPWM4ENCLK = 1;  // ePWM4
9 Z2 C& |  y" E9 z$ u& w! X   SysCtrlRegs.PCLKCR1.bit.EPWM5ENCLK = 1;  // ePWM59 O2 j/ [# a1 R! _# c6 f
   SysCtrlRegs.PCLKCR1.bit.EPWM6ENCLK = 1;  // ePWM6% Y" _9 x2 ?5 m
  // SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 1;   // Enable TBCLK within the ePWM  x. {: n- ~0 H/ T8 ?

+ D, O; ]$ B2 V8 B   SysCtrlRegs.PCLKCR1.bit.ECAP3ENCLK = 1;  // eCAP3
. u  @4 E+ }5 O0 h# o   SysCtrlRegs.PCLKCR1.bit.ECAP4ENCLK = 1;  // eCAP42 ?, u7 D6 S- r& q- m* p, D
   SysCtrlRegs.PCLKCR1.bit.ECAP5ENCLK = 1;  // eCAP5
, W. G- I$ P3 E5 j. p   SysCtrlRegs.PCLKCR1.bit.ECAP6ENCLK = 1;  // eCAP67 i$ ?1 @0 |$ @4 H& f
   SysCtrlRegs.PCLKCR1.bit.ECAP1ENCLK = 1;  // eCAP12 T+ O0 k8 O1 w6 |, u) z
   SysCtrlRegs.PCLKCR1.bit.ECAP2ENCLK = 1;  // eCAP2$ J( E/ s8 `2 @* B  R* x
   SysCtrlRegs.PCLKCR1.bit.EQEP1ENCLK = 1;  // eQEP1
6 o  Z) S) q3 J! A. C- r3 }   SysCtrlRegs.PCLKCR1.bit.EQEP2ENCLK = 1;  // eQEP2* |1 E2 {. n/ B

0 G; f, Z7 X4 F4 C% F9 V   SysCtrlRegs.PCLKCR3.bit.CPUTIMER0ENCLK = 1; // CPU Timer 0: M# Y( G/ A8 `$ ?3 I# _' c5 U  U
   SysCtrlRegs.PCLKCR3.bit.CPUTIMER1ENCLK = 1; // CPU Timer 1' b, x$ H/ p. S2 h1 {  q- k% C( i
   SysCtrlRegs.PCLKCR3.bit.CPUTIMER2ENCLK = 1; // CPU Timer 2
0 \( T5 G. G7 m  x0 i
" N, w0 p4 \) e* j4 Q0 w( \) U0 o   SysCtrlRegs.PCLKCR3.bit.DMAENCLK = 1;       // DMA Clock9 T3 P' `9 g" }, p& u) ^
   SysCtrlRegs.PCLKCR3.bit.XINTFENCLK = 1;     // XTIMCLK/ ?4 {: g3 R- e1 Q1 w$ C# _+ O
   SysCtrlRegs.PCLKCR3.bit.GPIOINENCLK = 1;    // GPIO input clock3 U  `) g: x. b( `

4 z# K9 |$ i9 g9 R   EDIS;
6 C3 |8 G1 ]$ |; q# V6 ~5 }/ }5 D}: N3 Y8 S+ Y# D: c: Y8 q& W; p
代码解释:8 z6 A) q; S- g: c0 k+ Z8 M" f
( d; m9 P. }' X# }0 C
1、SysCtrlRegs.HISPCP.all = 0x0001;  设置高速外设时钟分频 = sysclk / 2。
! |+ l7 `% D% A# [3 [" B: M: l/ D( K. g6 C7 X) d

4 w$ c9 m" J" H 2、SysCtrlRegs.LOSPCP.all = 0x0002;设置低速外设时钟低速外设时钟分频 = sysclk / 2,这里命名稍微有点出入,但是查询头文件后确实是这个功能。只不过换了一种方式表示。本来我以为我很细,但是发现是我很粗,错过前一句的命名风格,实际就是这么命名的。# f: Z) D. F! F/ X* l' h/ B

  t" _% A5 w1 b+ @

7 _4 j. U: y* W9 G" O& W! }) k9 {: j: t& M; {9 _
: E( T& L1 `& H5 @8 A
. ~! k: D! j  U2 i
3、XintfRegs.XINTCNF2.bit.XTIMCLK = 1;配置外部存储器的时钟为默认状态。
& B7 ^# ^- Y) J6 T+ s0 j: w3 ^% v# S, W  n1 C
% R0 T5 }  u) J

6 O. I- O+ e$ p! l$ T# C) C$ g4、XintfRegs.XINTCNF2.bit.CLKMODE = 1;外设时钟频率控制位,并配置为默认。
& d$ B, G- q& E: B' g7 f  S- R& v
/ a- d7 `4 Q3 K$ h, }, a

) U- N, G- q$ e# f3 Z" C/ N5、SysCtrlRegs.PCLKCR0.bit.ADCENCLK = 1等; 外设时钟使能,这里的外设时钟控制寄存器PCLKCR0控制片上各种外设时钟的工作状态,使能或者禁止,也就是说这里控制着外设的各个时钟的关闭和开通。& R& U' K! K2 l0 y

& m7 W& E  m. A$ d1 ~3 H& f  Z3 u2 P5 l小结:5 B7 q# p  c  f
通过这个系统初始化函数,我们能够得到几个关键的信息:2 p; F3 G2 ~7 F) f0 Y# ^

; I/ e8 i, o2 E1、外部晶振为30Mhz,经过锁相环PLL的倍频和分频操作可以得到DSP28335的主频150Mhz。' u" K9 ^1 v; P8 n
* Y0 R2 T* }' v7 u7 b
2、在初始化函数中,能够选择打开或者关闭各个外设时钟,并且可以配置频率大小。5 l1 `3 U# T$ f" V# C. _

% _9 ^( A: `% c! v5 t) d+ P说实话,在梳理这个初始化程序的过程中,其实好多次想撤退,心里想着反正这些都是固定好的,也不会更改其中的参数,我为什么要花这么多时间去看这个呢,但是咬着牙看下来了。看完之后其实我觉得收获还是挺大的,特别是DSP的主频150Mhz是怎么来的这个点。说来惭愧,用了DSP好久,只知道主频是150Mhz,还真不知道是经过PLL分频又倍频来的,有不有用?我感觉其实还是有用的,我们对需要从事的工作有了更一份的了解,这就有用,也希望自己在日后的学习过程中,刨根究底,不偷懒不粗略,细不细?不够细啊!忍不忍得住,那必须忍得住啊。
% x* b/ s6 W( h3 ^1 ]2 J2 F9 }: [( V' F

该用户从未签到

2#
发表于 2021-11-30 13:50 | 只看该作者
EALLOW /EDIS 打开/关闭状态寄存器保护

该用户从未签到

3#
发表于 2021-11-30 13:51 | 只看该作者
EALLOW/EDIS 是DSP为了防止杂散代码或指针破坏关键寄存器的状态宏定义指令
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-11-23 23:50 , Processed in 0.187500 second(s), 27 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表