目录
(2) InitPll(DSP28_PLLCR,DSP28_DIVSEL);
使用普中教程提供的代码之点亮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;
}