欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-06-08 22:57:25
...

初始化函数

#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指针不能回来。那么定时时间到后就会使单片机复位。
X281x的时钟和系统控制初始化代码分析
X281x的时钟和系统控制初始化代码分析
代码SysCtrlRegs.WDCR = 0x0068;其实是将WDCR=0000_0000_0110_1000,结合上面两种图,可知这里将WDDIS设为1,使看门狗模块失效

//在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
具体计算过程如下:X281x的时钟和系统控制初始化代码分析
PLL(锁相环):一种控制晶振使其相对于参考信号保持恒定的电路
外部晶振或外部时钟输入信号XCLKIN和送至CPU的时钟信号CLKIN有以下3种X281x的时钟和系统控制初始化代码分析
所以,当使用30MHz晶振为F2812提供时基时,PPL寄存器设置为0xA时,就是进行10倍频,然后再除以2,最终送至CPU的时钟就是150MHz

  • SysCtrlRegs.HISPCP.all = 0x0001;

HISPCP(高速外设时钟预定标寄存器):配置高速外设所需的时钟
X281x的时钟和系统控制初始化代码分析
HSPCLK可以对于SYSCLKOUT有关的高速外设时钟(HSPCLK)的速率进行配置。
X281x的时钟和系统控制初始化代码分析
所以SysCtrlRegs.HISPCP.all = 0x0001中将HISPCP设置为1,即HSPCLK=150/2=75MHz

  • SysCtrlRegs.LOSPCP.all = 0x0002;

LOSPCP(低速外设时钟预定标寄存器):配置低速外设所需的时钟
X281x的时钟和系统控制初始化代码分析
LSPCLK可以对于SYSCLKOUT有关的低速外设时钟(LSPCLK)的速率进行配置。
X281x的时钟和系统控制初始化代码分析
所以SysCtrlRegs.LOSPCP.all = 0x0002;中将LOSPCP设置为1,即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)进行位操作
X281x的时钟和系统控制初始化代码分析

  • 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

相关标签: dsp