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
,结合上面两种图,可知这里将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
具体计算过程如下:
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设置为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)进行位操作
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
上一篇: FPGA7 3BCD计数器级联
下一篇: php制作圆形用户头像方法
推荐阅读