在使用一款新的MCU时,首先要做的事情就是要配置好芯片的系统时钟及中断向量,这样才能让MCU的基本内核跑起来,看了DSC28034PNT的官方例程,DSP2803x_SysCtrl.c文件中基本已经将各种系统时钟模式配置的很全面详细了,通过调用配置好的函数,就可以完成自己想要的系统时钟模式配置,由于官方例程是将片上内部12Mhz时钟通过PLL倍频10倍成120Mhz作为系统时钟,现在我们将其改为使用外部10Mhz晶振通过PLL倍频12倍成120Mhz作为系统时钟,具体配置代码如下:
/**** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **
*函数名:void SystemInit(void)
* 参 数 :无
*返回值:无
* 作 用 :初始化DSP片上外设
** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** /
void SystemInit(void)
{
DisableDog(); // Disable the watchdog
(*Device_cal)(); // Oscillator calibration values
XtalOscSel(); // SelectExternal CRYSTAL oscillator as Clock Source
InitPll(DSP28_PLLCR, DSP28_DIVSEL); // Initialize the PLL control
InitPeripheralClocks(); // Initialize the peripheral clocks
InitFlash(); // Initializes the Flash Control registers
InitPieCtrl(); // Initializes the PIE control registers
IER = 0x0000; // Disable CPU Interrupt and Flag
IFR = 0x0000;
InitPieVectTable(); // Initializes the PIE vector table
InitCpuTimer(); // Initializes the Timer
}
首先关闭看门狗,防止在喂狗之前系统复位,然后打开并选择外部10M晶振作为系统PLL的输入时钟,通过修改宏定义设置DSP28_PLLCR为12,DSP28_DIVSEL为3,PLL将10M晶振时钟倍频10倍分频1倍成120Mhz作为系统时钟,然后再打开各种用到的外设的时钟,并根据不同的系统时钟频率初始化Flash访问等待时间,然后再关闭PIE中断和系统总中断,并清除所有中断的中断标志位,上面所有配置函数除了InitCpuTimer()为自己配置的,其他均为调用官方驱动库。
InitCpuTimer()为初始化一个定时器,计数器每1us减1,计数周期为1s中,后序将利用这个定时器测量一些函数或算法的执行时间,以评估DSC28034PNT的运算性能,InitCpuTimer()的初始化代码如下:
/**** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **
*函数名:void InitCpuTimer(void)
*参 数 :无
*返回值:无
*作 用 :初始化定时器
******************************************************************/
void InitCpuTimer(void)
{
//==========CPU Timer 0=========================//
CpuTimer0Regs.PRD.all = 1000000; // Initialize timer period to 1s:
CpuTimer0Regs.TPR.bit.PSC = 120; // Initialize pre-scale counter to divide by 1 (SYSCLKOUT):
CpuTimer0Regs.TPR.bit.TDDR = 120;
CpuTimer0Regs.TCR.bit.TSS = 1; // Make sure timer is stopped:
CpuTimer0Regs.TCR.bit.TRB = 1; // Reload all counter register with period value:
CpuTimer0Regs.TCR.bit.TIE = 0; // 0 = Disable/ 1 = Enable Timer Interrupt
CpuTimer0Regs.TCR.bit.TSS = 0; // Start CpuTimer0
}
不知道写啥,暂时先写这么多