|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
本帖最后由 grand 于 2021-11-11 14:14 编辑 ) A, P7 j q7 `
4 p2 C( b8 y$ [* ~ W+ u
1 a4 v5 F# T) H. t
一、控制外设时钟的寄存器有以下几个:
5 }. I/ Q" S7 c# ~* i) O" J6 NPCLKCR0(外设时钟寄存器0):作用于上图标黄外设,所有时钟默认不开启
1 V/ E( ?1 w; \! P5 [: i" S注:这里需要注意TBCLKSYNC这个寄存器,他是让ePWM模块时钟同步,且当检测到TBCLK的上升沿时,同步开启。另一个需要注意的是,及时这个寄存器没有使能ePWM,如果PCLKCR1使能了一样有效。! O# `5 @6 |- a) e
对于使能ePWM推荐做法:
# j( H! S6 k, N8 V2 y• Enable ePWM module clocks in the PCLKCR1 register.- q+ E- t/ j1 V% s5 k1 b
• Set TBCLKSYNC to 0.
, S7 C1 }+ G. @: }8 z" S1 U/ B6 B• Configure prescaler values and ePWM modes.* H% Z1 W/ H/ `5 i% P8 l' P# J
• Set TBCLKSYNC to 1. a' u0 I, V- G7 t: U7 t' E/ {5 l7 L) V
PCLKCR1(外设时钟寄存器1):作用于上图倒数第三个框的外设,所有时钟默认不开启
1 E9 x% E1 N& U, PPCLKCR3(外设时钟寄存器1):作用于GPIO,三个CPU定时器,DMA和XINTF。且三个CPU定时器和GPIO的时钟是默认使能的
7 G7 d( T% V6 V% c* ^! LHISPCP:对其作用的外设输入时钟进行分频
: C0 u- R0 ?- m* K) N" }2 j( PLOSPCP: 对其作用的外设输入时钟进行分频
* n; h1 `4 {8 u; n6 F二、CPU时钟
5 `9 Y* h5 m4 x
: R E& U% C" ~4 v' O& Z CPU时钟来源可以是内部的晶体振荡器也可以是外部的晶体振荡器或是外部直接输入时钟。
8 {- L# b3 X8 ]. n3 o如果选择外部晶体作为输入,则内部晶体可以断开。将晶体连接到芯片的X1和X2管脚上,并且XCLKIN接地。
9 T9 Q+ {+ y9 ^直接输入时钟信号,将时钟信号接到XCLKIN管脚上(允许3.3V时钟信号),X1接地,X2浮空;将时钟信号接到X1管脚上(允许1.8V时钟信号),XCLKIN接地,X2浮空。: i7 ]$ U2 D: C0 @! m2 u2 t
CPU时钟无法启振检测
2 L( }" {$ b; S+ G0 d0 m) L
7 k) M/ c: {, @0 L这里有两个计数器,一个7位,另一个13位。如果7位计数器溢出就会将13位计数器进行清零,所以在正常情况下13位的计数器不会溢出。如果OSCCLK信号突然没有了,那7位的计数器将不再计数,也就是7位计数器值不再增加无法溢出,但是PLL会输出一个“limp mode”频率,因此13位的计数器值会继续增加直至溢出。 **PLL设置**
: c7 K) |% y. p D, y3 a1
, m- [. @$ z- I8 }; C4 ~. r' @) k, NPLLCR:设置PLL的倍频数,最大可倍频5倍! R5 l) P1 d5 ~. H+ h `
PLLSTSLL状态寄存器% D: I& Y& L. T2 ~4 C) q2 y5 H. s
注:1、只有在PLLSTS[DIVSEL]为0时在可以对PLLCR进行写操作;
- h6 C* }1 j1 k- P+ \: e; d3 e, e1 `2、只有PLLSTS[PLLLOCKS]为1(就是PLL输出时钟稳定时)时才可以对PLLSTS[DIVSEL]进行操作
5 v1 W" `1 x/ g6 ^/ Z3、设备只有在PLLSTS[MCLKSTS]为0时才可以正常工作
& C) m! j; g/ P( U) f4、当/XRS或看门狗进行复位时,PLLCR和PLLSTS及寄存器所有其将会被恢复为默认值' Z, V! j; ]6 G3 P/ @: i
PLLCR操作流程图: Y2 R1 z% V' O& W$ i8 r3 s
; w* K4 W* U2 i例程: /*
% m9 v# ]4 H3 }, Q * 输入晶振频率为30MHZ; i @8 g/ o8 |8 ]
* 经PLL之后输出SYSClock=90MHZ
( L- j" H- b3 ? */
: \8 \% _7 G3 @void InitClock(void)# I8 ^, Y! t1 t4 I H
{5 B E" f, z8 Y2 }" A% s
while(SysCtrlRegs.PLLSTS.bit.MCLKSTS == 0);
- B0 [; D% g7 k- ^- F- q if(SysCtrlRegs.PLLSTS.bit.DIVSEL != 0)
" c% g+ U/ J, ]2 a3 ?) q0 h5 l. ~- o! l6 g {2 E0 @1 X* i6 j
SysCtrlRegs.PLLSTS.bit.DIVSEL = 0;4 Z, i5 @; I2 o- | \
}
, ]4 x( z( ~% M5 r SysCtrlRegs.PLLSTS.bit.MCLKOFF = 1; //关闭晶振丢失逻辑
) `5 q( Q- R/ d7 e5 M7 K7 x SysCtrlRegs.PLLCR.bit.DIV = 6; //0110; F3 n' Y( k, p+ H, N) [0 |
while(SysCtrlRegs.PLLSTS.bit.PLLLOCKS == 1); //检查时钟是否已经稳定震荡
$ u7 P# ?/ c7 `' T3 r" Y: ` SysCtrlRegs.PLLSTS.bit.MCLKOFF = 0;+ I5 P/ J+ ^* m% {# V6 N
SysCtrlRegs.PLLSTS.bit.DIVSEL = 2; //10b2 A5 D e8 R: c- I4 w* i
}
! a/ o9 T' R5 w* o- Z' _2 b
4 p" n# q( P- `* Z6 R/ `- I |
|