1.DSP-时钟初始化

4 篇文章 0 订阅
2 篇文章 0 订阅

目录

1.主函数

2、InitSysCtrl();初始化

 (1)DisableDog();关闭看门狗

(2) InitPll(DSP28_PLLCR,DSP28_DIVSEL);

锁相环状态寄存器(PLLSTS)

 锁相环控制寄存器(PLLCR):设置倍频数​编辑

(3) InitPeripheralClocks(); 

 高低速时钟设置

外部存储器时钟 

使能外部引脚

3、LED_Init();


使用普中教程提供的代码之点亮LED;

1.主函数


#include "DSP2833x_Device.h"     // DSP2833x Headerfile Include File
#include "DSP2833x_Examples.h"   // DSP2833x Examples Include File

#include "leds.h"

/*******************************************************************************
* 函 数 名         : delay
* 函数功能		   : 延时函数,通过循环占用CPU,达到延时功能
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/
void delay(void)
{
    Uint16 		i;
	Uint32      j;
	for(i=0;i<32;i++)
		for (j = 0; j < 100000; j++);
}
/*******************************************************************************
* 函 数 名         : main
* 函数功能		   : 主函数
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/
void main()
{
	InitSysCtrl();

	LED_Init();

	while(1)
	{
		LED1_TOGGLE;
		delay();
	}
}

2、InitSysCtrl();初始化

该部分主要包括了,禁止看门狗电路DisableDog(); ,给 PLLCR 寄存器赋值以获得想要的系统时钟频率InitPll(DSP28_PLLCR,DSP28_DIVSEL)给高、低速外设时钟预定标寄存器赋值以获得想要的高、低速外设时钟频率InitPeripheralClocks();。按住ctrl进入函数内部。

void InitSysCtrl(void)
{

   // Disable the watchdog
   DisableDog();

   // Initialize the PLL control: PLLCR and DIVSEL
   // DSP28_PLLCR and DSP28_DIVSEL are defined in DSP2833x_Examples.h
   InitPll(DSP28_PLLCR,DSP28_DIVSEL);

   // Initialize the peripheral clocks
   InitPeripheralClocks();
}

 (1)DisableDog();关闭看门狗


void DisableDog(void)
{
    EALLOW;
    SysCtrlRegs.WDCR= 0x0068;
    EDIS;
}

 

 SysCtrlRegs.WDCR= 0x0068;

0068=0000 0000 0110 1000:对应WDCR中的第3,4,5位,开启写功能。第6位置1关闭看门狗。

(2) InitPll(DSP28_PLLCR,DSP28_DIVSEL);

初始化锁相环,PLLCR 寄存器赋值以获得想要的倍频,PLLSTS系统时钟分频。

 通过将外部晶振频率倍频与分频达到系统的主频要求。DSP28_PLLCR,DSP28_DIVSEL分别为倍频与分频系数。锁相环控制器包括:锁相环状态寄存器(PLLSTS)、锁相环控制寄存器(PLLCR)。

锁相环状态寄存器(PLLSTS)

 锁相环控制寄存器(PLLCR):设置倍频数

void InitPll(Uint16 val, Uint16 divsel)
{

   // Make sure the PLL is not running in limp mode
   if (SysCtrlRegs.PLLSTS.bit.MCLKSTS != 0)
   {
      // Missing external clock has been detected
      // Replace this line with a call to an appropriate
      // SystemShutdown(); function.
      asm("        ESTOP0");
   }

   // PLLCR从0x0000改变前,PLLSTS[DIVSEL]必须为0

   // 外部RST复位信号会使PLLSTS[DIVSEL]复位

   // 此时分频为1/4
   if (SysCtrlRegs.PLLSTS.bit.DIVSEL != 0)
   {
       EALLOW;
       SysCtrlRegs.PLLSTS.bit.DIVSEL = 0;
       EDIS;
   }

   // Change the PLLCR
   if (SysCtrlRegs.PLLCR.bit.DIV != val)
   {

      EALLOW;
      // 在设置PLLCR[DIV]前,要禁用主振荡器检测逻辑
      SysCtrlRegs.PLLSTS.bit.MCLKOFF = 1;
      SysCtrlRegs.PLLCR.bit.DIV = val;
      EDIS;

      //等待PLL稳定且处于锁定状态,即PLLSTS[LOCKS]置位

      //等待稳定的时间可能略长,需要禁用看门狗或者循环喂狗 
      // Optional: Wait for PLL to lock.
      // During this time the CPU will switch to OSCCLK/2 until
      // the PLL is stable.  Once the PLL is stable the CPU will
      // switch to the new PLL value.
      //
      // This time-to-lock is monitored by a PLL lock counter.
      //
      // Code is not required to sit and wait for the PLL to lock.
      // However, if the code does anything that is timing critical,
      // and requires the correct clock be locked, then it is best to
      // wait until this switching has completed.

      // Wait for the PLL lock bit to be set.

      // The watchdog should be disabled before this loop, or fed within
      // the loop via ServiceDog().

	  // Uncomment to disable the watchdog
      DisableDog();

      while(SysCtrlRegs.PLLSTS.bit.PLLLOCKS != 1)
      {
	      // Uncomment to service the watchdog
          // ServiceDog();
      }

      EALLOW;
      SysCtrlRegs.PLLSTS.bit.MCLKOFF = 0;
      EDIS;
    }

    // If switching to 1/2
	if((divsel == 1)||(divsel == 2))
	{
		EALLOW;
	    SysCtrlRegs.PLLSTS.bit.DIVSEL = divsel;
	    EDIS;
	}


    //注意:下面代码只有在PLL是旁路或者关闭模式时,才可被执行,其他模式禁止。

    //倍频时一定要分频,不倍频时才允许不分频

    //如果需要切换分频到1/1

    // * 首先从默认1/4分频切换到1/2分频,让电源稳定

    //   稳定所需要的时间依赖于系统运行速度,此处延时50us只是作为一个特例

    // * 稳定后,再切换到1/1
	if(divsel == 3)
	{
		EALLOW;
	    SysCtrlRegs.PLLSTS.bit.DIVSEL = 2;
	    DELAY_US(50L);
	    SysCtrlRegs.PLLSTS.bit.DIVSEL = 3;
	    EDIS;
    }
}

(3) InitPeripheralClocks(); 
 

 高低速时钟设置:

这个部分主要是对高低速时钟进行设置,外设时钟的使能。如图所示,外设时钟包括系统时钟15mhz,低速时钟,高速时钟。除了SPI、SCI、McBSP模块使用低速时钟,ADC使用高速时钟外,其他外设模块都是采用SYSCLKOUT时钟 

// HISPCP/LOSPCP prescale register settings, normally it will be set to default values
   SysCtrlRegs.HISPCP.all = 0x0001;//高速时钟2分频:150MHZ/2=75mHZ
   SysCtrlRegs.LOSPCP.all = 0x0002;//低速时钟4分频Lowspeedclock=SYSCLKOUT/4=150/4=37.5MHZ;

外部存储器时钟: 

        F28335 DSP 采用增强的哈佛总线接口,能够并行访问程序和数据存储空间。 内部集成了大量的 SRAM、ROM 以及 FLASH 等存储器,并且采用统一寻址方式(程 序、数据和 IO 统一寻址),从而提高了存储空间的利用率,XINTF 接口分别映射到了 3 个固定的存储器映 射区域,如下所示。

 XINTF 模块使用两路时钟信号,XTIMCLK 和 XCLOUT,下图给出了这两路时钟 信号与系统时钟信号 SYSCLKOUT 的关系,XINTF 区域的所有访问操作都是基于 XTIMCLK 时钟为基准的,因此配置 XINTF 时,需要配置 XTIMCLK 与系统时钟 SYSCLKOUT 的关系。通过 XINTFCN2 寄存器中 的 XTIMCLK 控制位可将 XTIMCLK 时钟频率设定为与 SYSCLKOUT 时钟频率相同或为 其一半,默认为其一半

 

XintfRegs.XINTCNF2.bit.XTIMCLK = 1;//设置时钟分频系数为2
   // XCLKOUT = XTIMCLK/2
   XintfRegs.XINTCNF2.bit.CLKMODE = 1;//设置时钟频率控制
   // Enable XCLKOUT
   XintfRegs.XINTCNF2.bit.CLKOFF = 0;//使能XCLKOUT



// 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;


使能外部引脚

外设时钟控制寄存器 PCLKCR0/1/3 控制片上各种外设时钟的工作状态,使能 或者禁止。

 PCLKCR0

外设时钟控制寄存器  PCLKCR0 各位定义

外设时钟控制寄存器  PCLKCR1 各位定义

外设时钟控制寄存器  PCLKCR3 各位定义

void InitPeripheralClocks(void)
{
   EALLOW;

// HISPCP/LOSPCP prescale register settings, normally it will be set to default values
   SysCtrlRegs.HISPCP.all = 0x0001;//高速时钟2分频:150MHZ/2=75mHZ
   SysCtrlRegs.LOSPCP.all = 0x0002;//低速时钟4分频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;

// Peripheral clock enables set for the selected peripherals.
// If you are not using a peripheral leave the clock off
// to save on power.
//
// Note: not all peripherals are available on all 2833x derivates.
// Refer to the datasheet for your particular device.
//
// This function is not written to be an example of efficient code.

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

   // *IMPORTANT*
   // The ADC_cal function, which  copies the ADC calibration values from TI reserved
   // OTP into the ADCREFSEL and ADCOFFTRIM registers, occurs automatically in the
   // Boot ROM. If the boot ROM code is bypassed during the debug process, the
   // following function MUST be called for the ADC to function according
   // to specification. The clocks to the ADC MUST be enabled before calling this
   // function.
   // See the device data manual and/or the ADC Reference
   // Manual for more information.

   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;
}

3、LED_Init();

GPIO管脚

电源引脚、晶振引脚、复位引脚、下载引脚、BOOT 引脚、GPIO 引脚。

GPIO 引脚中0-31属于A组,32-63属于B组,64-87属于C组。

void LED_Init(void)
{
	EALLOW;
	SysCtrlRegs.PCLKCR3.bit.GPIOINENCLK = 1;// 开启GPIO时钟

	//LED1端口配置
	GpioCtrlRegs.GPCMUX1.bit.GPIO68=0;//设置为通用GPIO功能
	GpioCtrlRegs.GPCDIR.bit.GPIO68=1;//设置GPIO方向为输出
	GpioCtrlRegs.GPCPUD.bit.GPIO68=0;//使能GPIO上拉电阻

	//LED2端口配置
	GpioCtrlRegs.GPCMUX1.bit.GPIO67=0;
	GpioCtrlRegs.GPCDIR.bit.GPIO67=1;
	GpioCtrlRegs.GPCPUD.bit.GPIO67=0;

	//LED3端口配置
	GpioCtrlRegs.GPCMUX1.bit.GPIO66=0;
	GpioCtrlRegs.GPCDIR.bit.GPIO66=1;
	GpioCtrlRegs.GPCPUD.bit.GPIO66=0;

	//LED4端口配置
	GpioCtrlRegs.GPCMUX1.bit.GPIO65=0;
	GpioCtrlRegs.GPCDIR.bit.GPIO65=1;
	GpioCtrlRegs.GPCPUD.bit.GPIO65=0;

	//LED5端口配置
	GpioCtrlRegs.GPCMUX1.bit.GPIO64=0;
	GpioCtrlRegs.GPCDIR.bit.GPIO64=1;
	GpioCtrlRegs.GPCPUD.bit.GPIO64=0;

	//LED6端口配置
	GpioCtrlRegs.GPAMUX1.bit.GPIO10=0;
	GpioCtrlRegs.GPADIR.bit.GPIO10=1;
	GpioCtrlRegs.GPAPUD.bit.GPIO10=0;

	//LED7端口配置
	GpioCtrlRegs.GPAMUX1.bit.GPIO11=0;
	GpioCtrlRegs.GPADIR.bit.GPIO11=1;
	GpioCtrlRegs.GPAPUD.bit.GPIO11=0;



	GpioDataRegs.GPCSET.bit.GPIO68=1;
	GpioDataRegs.GPCSET.bit.GPIO67=1;
	GpioDataRegs.GPCSET.bit.GPIO66=1;
	GpioDataRegs.GPCSET.bit.GPIO65=1;
	GpioDataRegs.GPCSET.bit.GPIO64=1;
	GpioDataRegs.GPASET.bit.GPIO10=1;
	GpioDataRegs.GPASET.bit.GPIO11=1;

	EDIS;
}

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值