X281x的时钟和系统控制初始化代码分析

初始化函数

#include "DSP28_Device.h"
/*********************************************************************
*
*名    称:InitSysCtrl()
*
*功    能:该函数对2812的系统控制寄存器进行初始化
*
*入口参数:无
*
*出口参数:无
*
*********************************************************************/
void InitSysCtrl(void)
{
	Uint16 i; //unsigned int
	EALLOW;
	
	SysCtrlRegs.WDCR = 0x0068; 
	
   	SysCtrlRegs.PLLCR = 0xA;  
   	
	// 延时,使得PLL模块能够完成初始化操作
   	for(i= 0; i< 5000; i++){}
       
	// 高速时钟预定标器和低速时钟预定标器,产生高速外设时钟HSPCLK和低速外设时钟LSPCLK
   	SysCtrlRegs.HISPCP.all = 0x0001;
   	SysCtrlRegs.LOSPCP.all = 0x0002;
	
	// 对工程中使用到的外设进行时钟使能
	// SysCtrlRegs.PCLKCR.bit.EVAENCLK=1;
	// SysCtrlRegs.PCLKCR.bit.EVBENCLK=1;
	// SysCtrlRegs.PCLKCR.bit.SCIENCLKA=1;
	// SysCtrlRegs.PCLKCR.bit.SCIENCLKB=1;
				
   EDIS;
}

代码解析

  • EALLOW;

汇编语言,允许修改核心寄存器

//在DSP28_Device.h头文件有定义
#define	 EALLOW	asm("EALLOW")
  • SysCtrlRegs.WDCR = 0x0068;

禁止看门狗,硬件看门狗是利用了一个定时器,来监控主程序的运行,也就是说在主程序的运行过程中,我们要在定时时间到之前对定时器进行复位如果出现死循环,或者说PC指针不能回来。那么定时时间到后就会使单片机复位。
在这里插入图片描述
在这里插入图片描述
代码SysCtrlRegs.WDCR = 0x0068;其实是将WDCR=0000_0000_0110_1000
从第0位到第16位解读:

  • 000:需要时钟的分频
  • 101:看门狗检测自动,若不是101,立刻重启
  • 1:这是WDDIS设为1,使看门狗模块失效
  • 0000_0000_0:无
//在DSP28_GlobalVariableDefs.c中对SysCtrlRegs进行了定义
#pragma DATA_SECTION(SysCtrlRegs,"SysCtrlRegsFile");
volatile struct SYS_CTRL_REGS SysCtrlRegs;

//对于结构体SYS_CTRL_REGS可以在DSP28_SysCtrl.h中可以查看
struct SYS_CTRL_REGS {
   Uint16  rsvd1[10];            // 0-9
   union HISPCP_REG HISPCP;      // 10: 高速外设时钟预定标寄存器(High-speed peripheral clock pre-scaler)
   union LOSPCP_REG LOSPCP;      // 11: 低速外设时钟预定标寄存器(Low-speed peripheral clock pre-scaler)
   union PCLKCR_REG PCLKCR;      // 12: Peripheral clock control register
   Uint16  rsvd2;                // 13
   Uint16  LPMCR0;               // 14: Low-power mode control register 0
   Uint16  LPMCR1;               // 15: Low-power mode control register 1
   Uint16  rsvd3;                // 16
   Uint16  PLLCR;                // 17: PLL control register
   union SCSR_REG 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
   Uint16  WDCR;                 // 25: WD timer control register
   Uint16  rsvd6[6];             // 26-31
};

  • SysCtrlRegs.PLLCR = 0xA;

初始化PLL模块
如果外部晶振为30M,则SYSCLKOUT=30*10/2=150MHz
具体计算过程如下:F2812芯片的OSC和PLL模块
PLL(锁相环):一种控制晶振使其相对于参考信号保持恒定的电路
外部晶振或外部时钟输入信号XCLKIN和送至CPU的时钟信号CLKIN有以下3种在这里插入图片描述
所以,当使用30MHz晶振为F2812提供时基时,PPL寄存器设置为0xA时,就是进行10倍频,然后再除以2,最终送至CPU的时钟就是150MHz

  • SysCtrlRegs.HISPCP.all = 0x0001;

HISPCP(高速外设时钟预定标寄存器):配置高速外设所需的时钟
在这里插入图片描述
HSPCLK可以对于SYSCLKOUT有关的高速外设时钟(HSPCLK)的速率进行配置。
在这里插入图片描述
所以SysCtrlRegs.HISPCP.all = 0x0001中将HISPCP设置为1,即HSPCLK=150/2=75MHz

  • SysCtrlRegs.LOSPCP.all = 0x0002;

LOSPCP(低速外设时钟预定标寄存器):配置低速外设所需的时钟
在这里插入图片描述
LSPCLK可以对于SYSCLKOUT有关的低速外设时钟(LSPCLK)的速率进行配置。
在这里插入图片描述
所以SysCtrlRegs.LOSPCP.all = 0x0002;中将LOSPCP设置为2,即LSPCLK=150/4=37.5MHz

  • EDIS;

汇编语言,禁止修改核心寄存器

//在DSP28_Device.h头文件有定义
#define	 EDIS	asm(" EDIS")
  • 对工程中使用到的外设进行时钟使能
SysCtrlRegs.PCLKCR.bit.EVAENCLK=1;
SysCtrlRegs.PCLKCR.bit.EVBENCLK=1;
SysCtrlRegs.PCLKCR.bit.SCIENCLKA=1;
SysCtrlRegs.PCLKCR.bit.SCIENCLKB=1;

上面几条代码都是对外设时钟控制寄存器(PCLKCR)进行位操作
在这里插入图片描述

  • ECANENCLK:若为1,将使CAN外设的系统时钟有效。
  • MCBSPENCLK:若为1,将使McBSP外设的低速时钟(LSPCLK)有效。
  • SCIBENCLK:若为1,将使SCIB外设的低速时钟(LSPCLK)有效。
  • SCIAENCLK:若为1,将使SCIA外设的低速时钟(LSPCLK)有效。
  • SPIAENCLK:若为1,将使SPI外设的低速时钟(LSPCLK)有效。
  • ADCENCLK:若为1,将使ADC外设的高速时钟(HSPCLK)有效。
  • EVBENCLK:若为1,将使EVB外设的高速时钟(HSPCLK)有效。
  • EVAENCLK:若为1,将使EVA外设的高速时钟(HSPCLK)有效。

对于上诉的位操作,若为低功耗操作,由用户清0或复位后清0

  • 4
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值