F28335时钟及系统控制

一、系统时钟结构图

时钟信号为单片机工作提供了稳定了时间周期,从而使系统能够正常的运行,时钟信号就像人体内不可缺少的一部分,故要想单片机正常工作就得给它提供一个时钟信号。

1.1 时钟信号来源:

在这里插入图片描述
1、由上图1、2部分可以看出,时钟信号来源分为两个部分,分别如下:
1) 采用外部的振荡器 外部时钟 XCLKIN引脚 也可以通过X1引脚来提供
外部时钟信号接入方法有2种:分别针对电压为3.3V的外部时钟和1.9V的外部时钟
接入方式1:采用3.3V的外部时钟
在这里插入图片描述
管脚接法:XCLKIN引脚接入外部时钟信号,VDDIO不得超过3.3V,X1接地,X2 悬空。

接入方式2:采用1.9V的外部时钟
在这里插入图片描述
管角接法:XCLKIN接地,X1引脚接入外部时钟信号,VDD不得超过1.9V,X2 悬空。

2) 采用f28335内部振荡器,称为内部时钟,通过 X1与X2连接一个晶体。
在这里插入图片描述
管脚接法:在X1和X2接入一个外部晶振 30MHz

2、在一般情况下采用内部时钟方式且希望CPU工作在150MHz频率下,但内部时钟晶振只能产生30MHz频率,所以通过内部一个PLL(图中第三部分)进行配置,从而产生150MHz的时钟频率来供给内核。
过程如下:
1) 设置PLLSTS寄存器[OSCOFF]位,使晶振产生的时钟信号进来;
2) 设置PLLSTS寄存器[PLLOFF]位,使时钟信号走下方路线;
3) 设置PLLCR中n取10,于是得到30*10=300MHz;
4) 设置PLLSTS寄存器[DIVSEL]位,选择预分配/2,从而得到300/2=150MHz的时钟频率传输给CPU。

二、F28335系统控制及外设时钟

在这里插入图片描述
锁相环模块除了为28335内核提供时钟,通过系统时钟提供高速和低速两种时钟
不同的外设工作在不同的时钟频率,时钟频率的不同则内部损耗也不同 所以我们只需在时钟控制系统中用到什么外设去开启对应的外部时钟

三、时钟相关寄存器

3.1 时钟单元常用寄存器

1) PLLSTS:PLL锁相环状态寄存器 该寄存器就是配置时钟来源图中的[OSCOFF]与[PLLOFF]及[DIVSEL]位;
2) PLLCR: PLL控制寄存器 该寄存器配置时钟来源图中的n来实现倍频功能,与前一寄存器就可以为CPU产生150MHz的时钟信号。
3) HISPCP: 高速外设时钟预分配寄存器 当该寄存器=1,则频率为150/2=75MHz;
4) LOSPCP: 低速外设时钟预分配寄存器 当该寄存器=2,则频率为150/4=37.5MHz;
5) PCLKCR0/1/3: 外设时钟控制寄存器0/1/3,该寄存器是管理外设的时钟信号寄存器;
6) LPMCR0: 低功耗模式控制寄存器0;
7) WDCNTR: 看门狗计数寄存器;
8) WDKEY: 看门狗复位寄存器;
9) WDCR: 看门狗控制寄存器;

3.2 外设时钟控制寄存器PCLKCR0/1/3

1) 外设时钟控制寄存器PCLKCR0各位定义
在这里插入图片描述
2) 外设时钟控制寄存器PCLKCR1各位定义

在这里插入图片描述
3) 外设时钟控制寄存器PCLKCR3各位定义

在这里插入图片描述
PCLKCR0/1/3是控制外设的时钟,当我们用到哪一个外设就需要通过选择控制该外设的PCLKCR寄存器来开启对应的时钟。

四、自定义系统时钟

下列关于TI提供的和系统时钟相关的文件和函数

InitSysCtrl()函数

InitSysCtrl()函数的定义在DSP2833x_SysCtrl.c中:
在这里插入图片描述
第一句: 该函数中默认关闭看门狗;
第二句: 系统初始化时钟频率配置(默认150MHz),可以进入修改;
在这里插入图片描述
第三句: 初始化外设时钟;
这个是用来初始化外设模块的时钟,具体分2个步骤:
首先设置高、低速外设预定标寄存器;
第二是对各个外设时钟进行有选择的使能;
为了降低功耗,尽量不使能不用的外设模块时钟;
注:如果某一外设时钟没使能,则不能对其相关的寄存器进行读写;

void InitPeripheralClocks(void)
{
EALLOW;

// HISPCP/LOSPCP prescale register settings, normally it will be set to default values
SysCtrlRegs.HISPCP.all = 0x0001;//72MHz
SysCtrlRegs.LOSPCP.all = 0x0002;//Lowspeedclock=SYSCLKOUT/4=150/4=37.5MHZ;

// XCLKOUT to SYSCLKOUT ratio. By default XCLKOUT = 1/4 SYSCLKOUT
// XTIMCLK = SYSCLKOUT/2
XintfRegs.XINTCNF2.bit.XTIMCLK = 1;
// XCLKOUT = XTIMCLK/2
XintfRegs.XINTCNF2.bit.CLKMODE = 1;
// Enable XCLKOUT
XintfRegs.XINTCNF2.bit.CLKOFF = 0;
// This function is not written to be an example of efficient code.

SysCtrlRegs.PCLKCR0.bit.ADCENCLK = 1; // ADC

ADC_cal();

SysCtrlRegs.PCLKCR0.bit.I2CAENCLK = 1; // I2C
SysCtrlRegs.PCLKCR0.bit.SCIAENCLK = 1; // SCI-A
SysCtrlRegs.PCLKCR0.bit.SCIBENCLK = 1; // SCI-B
SysCtrlRegs.PCLKCR0.bit.SCICENCLK = 1; // SCI-C
SysCtrlRegs.PCLKCR0.bit.SPIAENCLK = 1; // SPI-A
SysCtrlRegs.PCLKCR0.bit.MCBSPAENCLK = 1; // McBSP-A
SysCtrlRegs.PCLKCR0.bit.MCBSPBENCLK = 1; // McBSP-B
SysCtrlRegs.PCLKCR0.bit.ECANAENCLK=1; // eCAN-A
SysCtrlRegs.PCLKCR0.bit.ECANBENCLK=1; // eCAN-B

SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 0; // Disable TBCLK within the ePWM
SysCtrlRegs.PCLKCR1.bit.EPWM1ENCLK = 1; // ePWM1
SysCtrlRegs.PCLKCR1.bit.EPWM2ENCLK = 1; // ePWM2
SysCtrlRegs.PCLKCR1.bit.EPWM3ENCLK = 1; // ePWM3
SysCtrlRegs.PCLKCR1.bit.EPWM4ENCLK = 1; // ePWM4
SysCtrlRegs.PCLKCR1.bit.EPWM5ENCLK = 1; // ePWM5
SysCtrlRegs.PCLKCR1.bit.EPWM6ENCLK = 1; // ePWM6
SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 1; // Enable TBCLK within the ePWM

SysCtrlRegs.PCLKCR1.bit.ECAP3ENCLK = 1; // eCAP3
SysCtrlRegs.PCLKCR1.bit.ECAP4ENCLK = 1; // eCAP4
SysCtrlRegs.PCLKCR1.bit.ECAP5ENCLK = 1; // eCAP5
SysCtrlRegs.PCLKCR1.bit.ECAP6ENCLK = 1; // eCAP6
SysCtrlRegs.PCLKCR1.bit.ECAP1ENCLK = 1; // eCAP1
SysCtrlRegs.PCLKCR1.bit.ECAP2ENCLK = 1; // eCAP2
SysCtrlRegs.PCLKCR1.bit.EQEP1ENCLK = 1; // eQEP1
SysCtrlRegs.PCLKCR1.bit.EQEP2ENCLK = 1; // eQEP2

SysCtrlRegs.PCLKCR3.bit.CPUTIMER0ENCLK = 1; // CPU Timer 0
SysCtrlRegs.PCLKCR3.bit.CPUTIMER1ENCLK = 1; // CPU Timer 1
SysCtrlRegs.PCLKCR3.bit.CPUTIMER2ENCLK = 1; // CPU Timer 2

SysCtrlRegs.PCLKCR3.bit.DMAENCLK = 1; // DMA Clock
SysCtrlRegs.PCLKCR3.bit.XINTFENCLK = 1; // XTIMCLK
SysCtrlRegs.PCLKCR3.bit.GPIOINENCLK = 1; // GPIO input clock

EDIS;
}

上述通过void InitPeripheralClocks(void)来进行开启外设时钟,其中所开启的如下:
// System Control Register File:
//
struct SYS_CTRL_REGS {
Uint16 rsvd7; // 0
union PLLSTS_REG PLLSTS; // 1
Uint16 rsvd1[8]; // 2-9
union HISPCP_REG HISPCP; // 10: High-speed peripheral clock pre-scaler
union LOSPCP_REG LOSPCP; // 11: Low-speed peripheral clock pre-scaler
union PCLKCR0_REG PCLKCR0; // 12: Peripheral clock control register
union PCLKCR1_REG PCLKCR1; // 13: Peripheral clock control register
union LPMCR0_REG LPMCR0; // 14: Low-power mode control register 0
Uint16 rsvd2; // 15: reserved
union PCLKCR3_REG PCLKCR3; // 16: Peripheral clock control register
union PLLCR_REG PLLCR; // 17: PLL control register
// No bit definitions are defined for SCSR because
// a read-modify-write instruction can clear the WDOVERRIDE bit
Uint16 SCSR; // 18: System control and status register
Uint16 WDCNTR; // 19: WD counter register
Uint16 rsvd4; // 20
Uint16 WDKEY; // 21: WD reset key register
Uint16 rsvd5[3]; // 22-24
// No bit definitions are defined for WDCR because
// the proper value must be written to the WDCHK field
// whenever writing to this register.
Uint16 WDCR; // 25: WD timer control register
Uint16 rsvd6[6]; // 26-31
};

如下:SysCtrlRegs.PCLKCR3.bit.GPIOINENCLK = 1 通过该句话进行分析:
1) 在void InitSysCtrl(void)中的InitPeripheralClocks()开启了GPIO外设时钟;
2) 而结构体名称为:SYS_CTRL_REGS
3) extern volatile struct SYS_CTRL_REGS SysCtrlRegs;
4) 于是可以通过SysCtrlRegs进行访问SYS_CTRL_REGS结构体;
5) union PCLKCR3_REG PCLKCR3;
6) 于是可以通过PCLKCR3进行访问PCLKCR3_REG函数;
6) union PCLKCR3_REG {
Uint16 all;
struct PCLKCR3_BITS bit;
};//由此可见该函数中包含着 PCLKCR3_BITS结构体
7) struct PCLKCR3_BITS { // bits description
Uint16 rsvd1:8; // 7:0 reserved
Uint16 CPUTIMER0ENCLK:1; // 8 Enable SYSCLKOUT to CPU-Timer 0
Uint16 CPUTIMER1ENCLK:1; // 9 Enable SYSCLKOUT to CPU-Timer 1
Uint16 CPUTIMER2ENCLK:1; // 10 Enable SYSCLKOUT to CPU-Timer 2
Uint16 DMAENCLK:1; // 11 Enable the DMA clock
Uint16 XINTFENCLK:1; // 12 Enable SYSCLKOUT to XINTF
Uint16 GPIOINENCLK:1; // Enable GPIO input clock
Uint16 rsvd2:2; // 15:14 reserved
};
8) 因此可以通过SysCtrlRegs.PCLKCR3.bit.GPIOINENCLK = 1 来进行外设GPIO的时钟开启;

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值