一、时钟配置
时钟配置基于与TI提供的F2806x_SsysCtrl文件中的InitSysCtrl()函数类似,本文配置如下
- 采用外部晶振30M
- 系统时钟配置为90M
- 所有外设时钟禁用,为方便阅读或移植,在Asan_Cfg.h文件中采用宏定义的方式进行使能相应时钟
整体初始化过程如下:
除InitPeripheralClocks()函数外,其它可直接调用TI提供的InitSysCtrl()函数,配置为90M的系统时钟,宏定义变量如下
InitPeripheralClocks()函数采用如下形式
void InitPeripheralClocks(void)
{
EALLOW;
// LOSPCP prescale register settings, normally it will be set to default values
SysCtrlRegs.LOSPCP.all = 0x0001; //Lowspeed CLK 45M
// XCLKOUT to SYSCLKOUT ratio. By default XCLKOUT = SYSCLKOUT
//SysCtrlRegs.XCLK.bit.XCLKOUTDIV=2;
// 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 2803x derivates.
// Refer to the datasheet for your particular device.
//
// This function is not written to be an example of efficient code.
#if (DSP_SUPPORT_ePWM1 == 1)
SysCtrlRegs.PCLKCR1.bit.EPWM1ENCLK = 1; // ePWM1
#endif
#if (DSP_SUPPORT_ePWM2 == 1)
SysCtrlRegs.PCLKCR1.bit.EPWM2ENCLK = 1; // ePWM2
#endif
#if (DSP_SUPPORT_ePWM3 == 1)
SysCtrlRegs.PCLKCR1.bit.EPWM3ENCLK = 1; // ePWM3
#endif
#if (DSP_SUPPORT_ePWM4 == 1)
SysCtrlRegs.PCLKCR1.bit.EPWM4ENCLK = 1; // ePWM4
#endif
#if (DSP_SUPPORT_ePWM5 == 1)
SysCtrlRegs.PCLKCR1.bit.EPWM5ENCLK = 1; // ePWM5
#endif
#if (DSP_SUPPORT_ePWM6 == 1)
SysCtrlRegs.PCLKCR1.bit.EPWM6ENCLK = 1; // ePWM6
#endif
#if (DSP_SUPPORT_ePWM7 == 1)
SysCtrlRegs.PCLKCR1.bit.EPWM7ENCLK = 1; // ePWM7
#endif
#if (DSP_SUPPORT_ePWM8 == 1)
SysCtrlRegs.PCLKCR1.bit.EPWM8ENCLK = 1; // ePWM8
#endif
#if (DSP_SUPPORT_HRPWM == 1)
SysCtrlRegs.PCLKCR0.bit.HRPWMENCLK = 1; // HRPWM
#endif
#if (DSP_SUPPORT_eQEP1 == 1)
SysCtrlRegs.PCLKCR1.bit.EQEP1ENCLK = 1; // eQEP1
#endif
#if (DSP_SUPPORT_eQEP2 == 1)
SysCtrlRegs.PCLKCR1.bit.EQEP2ENCLK = 1; // eQEP2
#endif
#if (DSP_SUPPORT_eCAP1 == 1)
SysCtrlRegs.PCLKCR1.bit.ECAP1ENCLK = 1; // eCAP1
#endif
#if (DSP_SUPPORT_eCAP2 == 1)
SysCtrlRegs.PCLKCR1.bit.ECAP2ENCLK = 1; // eCAP2
#endif
#if (DSP_SUPPORT_eCAP3 == 1)
SysCtrlRegs.PCLKCR1.bit.ECAP3ENCLK = 1; // eCAP3
#endif
#if (DSP_SUPPORT_HRCAP1 == 1)
SysCtrlRegs.PCLKCR2.bit.HRCAP1ENCLK = 1; // HRCAP1
#endif
#if (DSP_SUPPORT_HRCAP2 == 1)
SysCtrlRegs.PCLKCR2.bit.HRCAP2ENCLK = 1; // HRCAP2
#endif
#if (DSP_SUPPORT_HRCAP3 == 1)
SysCtrlRegs.PCLKCR2.bit.HRCAP3ENCLK = 1; // HRCAP3
#endif
#if (DSP_SUPPORT_HRCAP4 == 1)
SysCtrlRegs.PCLKCR2.bit.HRCAP4ENCLK = 1; // HRCAP4
#endif
#if (DSP_SUPPORT_ADC == 1)
SysCtrlRegs.PCLKCR0.bit.ADCENCLK = 1; // ADC
#endif
#if (DSP_SUPPORT_COMP1 == 1)
SysCtrlRegs.PCLKCR3.bit.COMP1ENCLK = 1; // COMP1
#endif
#if (DSP_SUPPORT_COMP2 == 1)
SysCtrlRegs.PCLKCR3.bit.COMP2ENCLK = 1; // COMP2
#endif
#if (DSP_SUPPORT_COMP3 == 1)
SysCtrlRegs.PCLKCR3.bit.COMP3ENCLK = 1; // COMP3
#endif
#if (DSP_SUPPORT_TIMER0 == 1)
SysCtrlRegs.PCLKCR3.bit.CPUTIMER0ENCLK = 1; // CPU Timer 0
#endif
#if (DSP_SUPPORT_TIMER1 == 1)
SysCtrlRegs.PCLKCR3.bit.CPUTIMER1ENCLK = 1; // CPU Timer 1
#endif
#if (DSP_SUPPORT_TIMER2 == 1)
SysCtrlRegs.PCLKCR3.bit.CPUTIMER2ENCLK = 1; // CPU Timer 2
#endif
#if (DSP_SUPPORT_DMA == 1)
SysCtrlRegs.PCLKCR3.bit.DMAENCLK = 1; // DMA
#endif
#if (DSP_SUPPORT_CLA1 == 1)
SysCtrlRegs.PCLKCR3.bit.CLA1ENCLK = 1; // CLA1
#endif
#if (DSP_SUPPORT_USB0 == 1)
SysCtrlRegs.PCLKCR3.bit.USB0ENCLK = 1; // USB0
#endif
#if (DSP_SUPPORT_I2CA == 1)
SysCtrlRegs.PCLKCR0.bit.I2CAENCLK = 1; // I2C-A
#endif
#if (DSP_SUPPORT_SPIA == 1)
SysCtrlRegs.PCLKCR0.bit.SPIAENCLK = 1; // SPI-A
#endif
#if (DSP_SUPPORT_SPIB == 1)
SysCtrlRegs.PCLKCR0.bit.SPIBENCLK = 1; // SPI-B
#endif
#if (DSP_SUPPORT_SCIA == 1)
SysCtrlRegs.PCLKCR0.bit.SCIAENCLK = 1; // SCI-A
#endif
#if (DSP_SUPPORT_SCIB == 1)
SysCtrlRegs.PCLKCR0.bit.SCIBENCLK = 1; // SCI-B
#endif
#if (DSP_SUPPORT_MCBSPA == 1)
SysCtrlRegs.PCLKCR0.bit.MCBSPAENCLK = 1; // McBSP-A
#endif
#if (DSP_SUPPORT_ECAN == 1)
SysCtrlRegs.PCLKCR0.bit.ECANAENCLK=1; // eCAN-A
#endif
#if (DSP_SUPPORT_TBCLK == 1)
SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 1; // Enable TBCLK within the ePWM
#endif
EDIS;
}
默认外设时钟暂时关闭,后面使用到时需要在配置头文件中置1
二、初始化PIE寄存以及其它寄存器清0
直接调用TI提供的InitPieCtrl()函数 ;
函数末尾增加如下语句
IER = 0x0000; //清中断使能位
IFR = 0x0000; //清中断标志位
三、初始化PIE向量
- 复制TI提供F2806x_DefaultISR.h和F2806x_DefaultISR.c文件,添加置工程
直接调用TI提供的InitPieVectTable()函数 ;
四、将FLASH拷贝至ARM运行
增加MemCopy()函数
/*************************************************************************/
/* Name : MemCopy */
/* */
/* Copy the execution code from Flash to Ram for execution */
/* */
/* In : Flash starting address */
/* Out : Flash ending address */
/* Return: RAM address */
/*************************************************************************/
void MemCopy(Uint16 *SourceAddr, Uint16* SourceEndAddr, Uint16* DestAddr)
{
while(SourceAddr < SourceEndAddr)
{
*DestAddr++ = *SourceAddr++;
}
return;
}
五、初始化FLASH
直接调用TI提供的InitFlash()函数;
初始化配置已完成如上工作,编译已通过