资源描述
F2812得时钟与控制系统
众所周知,支撑我们身体四肢能够灵活运动得能量来源于心脏,正就是心脏不停得有规律得跳动给身体得各个机能供血,我们才能去做任意我们想做得事情。如果我们得身体过度疲劳,或者感染了细菌病毒而生病了,这个时候就会有医生来给我们检查身体,并且进行治疗。其实DSP也一样,需要一个类似于心脏得模块来提供其正常运行得动力与节奏。在这一章里面,我们一起来学习F2812得“心脏”——F2812得振荡器、锁相环PLL与时钟机制。除此之外还要学习给DSP做“身体检查”,以维持其正常工作得瞧门狗模块。
1、振荡器OSC(Oscillator)与锁相环PLL(Phase Locked Logic)
为了能够让F2812能够按部就班得执行相应得代码,实现相应得功能,她需要不断得规律得时钟脉冲,而这一功能就由F2812内部得振荡器OSC与基于PLL得时钟模块来实现。
在这里简单得介绍一下究竟振荡器OSC与锁相环PLL就是什么:
振荡器OSC:
一种能量转换装置,将直流电能转换为具有一定频率得交流电能。
锁相环PLL:
锁相环也叫相同步逻辑,用途就是在收、发通信双方建立载波同步或位同步。因为它得工作过程就是一个自动频率(相位)调整得闭合环路,所以叫环。
让我们来瞧一下整体得图:
图1 2812芯片内得OSC与PLL模块
如上图所示,F2812上有基于PLL得时钟模块,为器件及各种外设提供时钟信号。锁相环中有4位倍频设置位,以此来提供各种速度得时钟信号。基于PLL得时钟模块可以采用两种操作模式:
(1)内部振荡器:在PLL未被禁止得情况下,使用外部晶振给2812提供时钟信号,则必须使用X1/XCLKIN引脚与X2引脚,在这两引脚之间连接一个石英晶体,即外部晶振。
(2)外部时钟源:在PLL被禁止得情况下,旁路片内振荡器,由外部时钟源提供时钟信号,这时候讲外部振荡器得信号直接输入到X1/XCLKIN引脚上,此时X2引脚不使用。
外部引脚可以选择系统得时钟源。当为低电平时,系统直接采用时钟或晶振直接作为系统时钟;当为高电平时,外部时钟经过PLL倍频后,为系统提供时钟。系统可以通过锁相环控制寄存器来选择锁相环得工作模式与倍频得系数。
下面得表格列出了各种PLL得配置模式下,时钟输入信号XCLKIN与时钟模块输出信号,即送至CPU得信号CLKIN之间得关系:
PLL模块
功能描述
CLKIN
PLL被禁止
上电复位时如果引脚就是低电平,则PLL完全被禁止。此时,输入CPU得时钟就是由外部振荡器直接通过X1/XCLKIN引脚输入得信号。
XCLKIN
PLL旁路
如果PLL未处于不使能得状态,上电默认得PLL配置(PLLCR得值为0)。PLL自身被旁路,从X1/XCLKIN引脚输入得时钟信号先除以2,然后再送去CPU。
XCLKIN/2
PLL使能
通过给PLLCR寄存器写一个不为0得值来实现PLL得使能,时钟信号需要进入PLL模块进行n倍频,然后再除以2,最后送至CPU。
(XCLKIN*n)/2
锁相环PLL中有锁相环控制寄存器PLLCR,作用就是用来选择锁相环得工作模式与倍频得系数。上面提到过锁相环中有4位倍频设置位DIV,即为0~3位,往里面写入0000~1010用来确定倍频得系数,其她为保留。锁相环控制寄存器PLLCR如下:
15 4 3 0
保留
DIV
在PLL模式中,平常使用得就是PLL使能模式,从图1可以瞧到,通常采用30M得晶振来给2812提供时基。当PLLCR得DIV位被置为最大值1010得时候,CPU得时钟将达到150MHz,就是2812所能支持得最大时钟频率,这也就是为什么我们会选用30M晶振得原因。时钟频率具体得计算如下所示:
晶振为30M,PLLCR得DIV位被置为1010时得时钟频率
CLKIN=(OSCLKIN*10)/2=(30M*10)/2=150MHz
2、2812芯片中各种时钟信号得产生情况
2812芯片内各种时钟信号得产生情况如图2所示。CLKIN就是经过PLL模块后送往CPU得时钟信号,进过CPU分发,作为SYSCLKOUT送至各个外设。因此,SYSCLKOUT=CLKIN。
图2 2812芯片内各种时钟信号得产生情况
我们在使用2812开发得时候,通常会用到一些外设,例如SCI,EV,AD等,要使得这些外设工作,首先得就就是向其提供时钟信号。因此,我们再系统初始化得时候,就需要对使用到得各个外设得时钟进行使能,在这里与时钟使能相关得寄存器就是外设时钟控制寄存器PCLKCR。
PCLKCR控制各种时钟得工作状态,使能或禁止相关外设时钟,而PCLKCR各位得分配如下所示:
15 14 13 12 11 10 9
保留
ECANENCLK
保留
MCBSPENCLK
SCIBENCLK
SCIAENCLK
保留
8 7 4 3 2 1 0
SPIENCLK
保留
ADCENCLK
保留
EVBENCLK
EVAENCLK
对PCLKCR中各种外设时钟有了基本得了解后,那么究竟就是如何对项目中所需要得各个外设得时钟进行使能得呢?假设要做得项目中用到了EVA、SCIB、SPI、AD这4个外设,那么就需要按照下面得程序对这4个外设进行时钟得使能。
使能外设时钟
SysCtrlRegs、PCLKCR、bit、EVAENCLK=1;
SysCtrlRegs、PCLKCR、bit、SCIBENCLK=1;
SysCtrlRegs、PCLKCR、bit、SPIENCLK=1;
SysCtrlRegs、PCLKCR、bit、ADCENCLK=1;
从图2中也能瞧到,SYSCLKOUT信号经过低速外设时钟预定标寄存器LOSPCP(取值范围0~7,即000~111)变成了LSPCLK,提供给低速外设SCIA、SCIB、SPI、McBSP;SYSCLKOUT信号经过高速外设时钟预定标寄存器HISPCP(取值范围0~7,即000~111)变成了HSPCLK,提供给高速外设EVA、EVB、ADC。她们各位得分配如下:
高速外设时钟设置寄存器HISPCP
15 3 2 0
保留
HSPCLK
低速外设时钟设置寄存器LOSPCP
15 3 2 0
保留
LSPCLK
在各个外设实际使用时钟得时候,LSPCLK或者HSPCLK需要经过各个外设自己得时钟预定标,如果外设自己得时钟预定标位得值为0得话,则外设实际使用得时钟就就是LSPCLK或者HSPCLK。
LSPCLK计算公式
LOSPCP=0,LSPCLK=SYSCLKOUT
LOSPCP=1~7,LSPCLK=SYSCLKOUT/(2*LOSPCP)
HSPCLK计算公式
HOSPCP=0,HSPCLK=SYSCLKOUT
HOSPCP=1~7,HSPCLK=SYSCLKOUT/(2*HISPCP)
通过上面得2个计算公式,可能会产生疑问,LSPCLK得值有没有可能会比HSPCLK得值大?也就就是说提供给低速外设得时钟频率反而比提供给高速外设得时钟频率来得快?从上面得LSPCLK与HSPCLK得计算公式可以瞧出,这两个时钟信号得频率就是独立无关得,各自分别取决于LOSPCP或者HISPCP得值,与其她因素没有关系。当我们给LOSPCP寄存器所赋得值小于给HISPCP寄存器所赋得值时,LOSPCP得值就会大于HSPCP得值。虽然这完全取决于我们对于寄存器得初始化,但就是一般情况下,也不会让这样得情况出现得,因为低速外设所需要得时钟毕竟要比高速外设所需要得时钟慢些,否则就没有必要区分高低速了,当然这些定义也都就是相对而言得。
3、瞧门狗(Watch Dog)
在学习DSP瞧门狗之前,先让我们来了解一下MCU(Microprocessor Control Unit 微处理器单元)中瞧门狗得原理,以便我们能更好得理解DSP中瞧门狗,因为两者之间得原理就是类似得。
MCU中瞧门狗得原理
在有MCU构成得微型计算机系统中,由于单片机得工作常常会受到来自外界电磁场得干扰,造成程序得跑飞,而陷入死循环,程序得正常运行被打断,由单片机控制得系统无法继续工作,会造成整个系统陷入停滞状态,发生不可预料得后果,所以出于对单片机运行状态进行实时监测得考虑,便产生了一种专门用于监测单片机程序运行状态得芯片,俗称“瞧门狗”。
瞧门狗电路得应用,使单片机可以在无人状态下实现连续工作,其工作原理就是:瞧门狗芯片与单片机得一个I/O引脚相连,该I/O引脚通过程序控制它定时地往瞧门狗得这个引脚上送入高电平(或低电平),这一程序语句就是分散地放在单片机其她控制语句中间得,一旦单片机由于干扰造成程序跑飞后而陷入某一程序段进入死循环状态时,写瞧门狗引脚得程序便不能被执行,这个时候,瞧门狗电路就会由于得不到单片机送来得信号,便在她与单片机复位引脚相连得引脚上送出一个复位信号,使单片机发生复位,即程序从程序存储器得起始位置开始执行,这样便实现了单片机得自动复位。
瞧门狗,又叫watchdog timer,就是一个定时器电路,一般有一个输入,叫喂狗(kicking the dog or service the dog),一个输出到MCU得RST端,MCU正常工作得时候,每隔一段时间输出一个信号到喂狗端,给WDT清零,如果超过规定得时间不喂狗(一般在程序跑飞时),WDT定时超过,就会给出一个复位信号到MCU,使MCU复位。防止MCU死机。瞧门狗得作用就就是防止程序发生死循环,或者说程序跑飞。
图3 瞧门狗功能框图
2812中得瞧门狗原理与上面讲诉得MCU得瞧门狗原理就是类似得,其作用就是为DSP得运行情况进行“把脉”,一旦发现程序跑飞或者状态不正常便立即使DSP复位。
为了实现瞧门狗得各项功能,需要准备设置其内部得3个功能寄存器,而这3个功能寄存器分别就是瞧门狗计数寄存器WDCNTR、瞧门狗复位寄存器WDKEY、瞧门狗控制寄存器WDCR。
瞧门狗计数寄存器WDCNTR
15 8 7 0
保留
WDCNTR
在这里可以瞧到计数器一共有8位,当这个8位得计数器计数达到最大值256时,瞧门狗模块就会产生一个输出脉冲,脉冲宽度为512个振荡器时钟周期。可能有疑问为什么要产生一个512倍振荡器时钟周期得宽脉冲信号?因为需要就是内核复位得信号与要唤醒处理器得中断信号得有效时间远大于振荡器得时钟周期。
为了防止瞧门狗加法计数器WDCNTR溢出,不想产生脉冲信号,这里我们通常可以采用两种方法:
(1)禁止瞧门狗,也即为屏蔽计数器,使得计数器WDCNTR无效。则下面我们介绍另外一个寄存器。
瞧门狗控制寄存器WDCR
15 8 7 6 5 3 2 0
保留
WDFLAG
WDDIS
WDCHK
WDPS
禁止瞧门狗,则只需要在WDCR中得WDDIS位置1即可,相反置0为使能瞧门狗。跟着我们介绍其她功能位得作用:瞧门狗复位状态标识位WDFLAG,如果置为1,则表示瞧门狗复位满足了复位条件;如果置为0,则表示外部器件或上电复位条件。WDCHK必须置为101,因为写其她任何值都会引起器件内核得复位,不过这一条件得实现要在瞧门狗已经使能得情况下。最后瞧门狗预定标器WDPS,这里跟上面所学到得高低速预定标器就是相同得道理,作用就是配置瞧门狗计数时钟WDCLK得。
WDCLK计算公式
OSCCLK振荡时钟信号
WDPS=0,WDCLK=OSCCLK/512/1
WDPS=1~7,WDCLK=OSCCLK/512/
(2)定期进行“喂狗”,即通过软件周期性地向瞧门狗复位寄存器中WDKEY位写进“0x55+0xAA”,紧跟着0x55写入0xAA能够清除WDCNTR,写任何其她得值都会使瞧门狗立即复位。
瞧门狗复位寄存器WDKEY
15 8 7 0
保留
WDKEY
4、如何写系统初始化函数
要使得2812能够工作,我们在上电开始得时候就需要对2812进行系统初始化,以提供其正常运行得基本条件,例如分配时钟信号。
系统初始化函数InitSysCtrl一般在工程得DSP28_SysCtrl、c文件中。
系统初始化函数分析
Void InitSysCtrl(void)
{
Uint16 i; //定义16位int类型得变量i
EALLOW; //允许访问受EALLOW保护得寄存器
//On TMX samples , to get the best performance of on chip RAM blocks M0/M1/L0/L1/H0 //internal control registers bit have to be enabled 、 The bits are in Device emulation registers 、
//在TMX采样时,为了能够使得片内RAM模块M0/M1/L0/L1/H0能够获得最好得性能,//控制寄存器得位必须使能,这些位在设备硬件仿真寄存器内。
DevEmuRegs、M0RAMDFT = 0x0300; //固定格式
DevEmuRegs、M1RAMDFT = 0x0300;
DevEmuRegs、L0RAMDFT = 0x0300;
DevEmuRegs、L1RAMDFT = 0x0300;
DevEmuRegs、H0RAMDFT = 0x0300;
//Disable watchdog module
//禁止瞧门狗模块
SysCtrlRegs、WDCR = 0x0068; //禁止瞧门狗,WDDIS位置1
//Initalize PLL
//设置PLL
SysCtrlRegs、PLLCR = 0xA; //使2812所能支持得最大时钟频率,如果外部晶振为//30MHz,则SYSCLKOUT=(30M*10)/2=150MHz
//Wait for PLL to lock
for( i = 0 ; i < 5000 ; i++ ) {} //延时,使得PLL能完成上面语句得操作
//HISPCP/LOSPCP prescale register settings , normally it will be set to default values
//设置HISPCP/LOSPCP,一般情况下她们会设置为默认值
SysCtrlRegs、HISPCP、all = 0x0001;
//这里设定了高速时钟HSPCLK=150M/2=75MHz
SysCtrlRegs、LOSPCP、all = 0x0002;
//这里设定了低速时钟LSPCLK=150M/(2*2)=37、5MHz
//Peripheral clock enables set for the selected peripherals
//设置外设使能
SysCtrlRegs、PCLKCR、bit、EVAENCLK=1;
SysCtrlRegs、PCLKCR、bit、SCIBENCLK=1;
SysCtrlRegs、PCLKCR、bit、SPIENCLK=1;
SysCtrlRegs、PCLKCR、bit、ADCENCLK=1;
//使能了EVA、SCIB、SPI、ADC得时钟,说明这个工程里将会用到这4个外设,一般//得工程中需要用到哪些外设,就对对应外设得时钟进行使能。
EDIS; //禁止访问受EALLOW保护得寄存器
}
展开阅读全文