为何28027能在ram中正确运行但是换成在flash中就为什么不能运行呢
/*
// 系统时钟采用外部晶体振荡器 24MHZ 使能锁相环 60MHZ = (24*5)/2 WDTCLK = 24MHZ
//SYSCLKOUT = CLKIN =60MHZ
//
*/
#include "DSP28x_Project.h"
//#include "f2802x_common/include/SFO_V6.h"
#include "pid.h"
#include"board_CONFIG.h"
#pragma CODE_SECTION(Timer0_isr, "ramfuncs");
#pragma CODE_SECTION(SCIA_RxFifoIsr, "ramfuncs");
Uint16 Rdata[4] ;
Uint16 SendData[4] ={0};
extern Uint16 FhaseError;
extern Uint16 period ;
void InitTimer0(void);
void Process(void);
// 这里已经制定的参数都是我们默认相对不能设置的 我们需要用户去设置
PID pid;
volatile FLAG flag ;
void PID_Set(void )
{
//PID pid;
pid.outMax = 3333 ; //设定最低频率18K
pid.outMin = 1500 ; //设定最高频率
pid.InAuto= 1 ;//自动模式
pid.SampleTime = 4; //默认采样时间4ms
pid.ControllerDirection = 1;//设定控制器的方向
PID_SetTunings(&pid,2, 1, 1);//PID参数
//lastTime = millis()-SampleTime;//上一次采样时间
}
void main(void)
{
Uint16 T_counter ;
InitSysCtrl();
InitGpio();
DINT;//全局中断关闭 INTM
InitPieCtrl();
IER = 0x0000;
IFR = 0x0000;
InitPieVectTable();
EALLOW;
//GPIO19为演示用
GpioCtrlRegs.GPAMUX2.bit.GPIO19 = 0; //选择GPIO1 为普通IO 口模式
GpioCtrlRegs.GPADIR.bit.GPIO19 = 1; //方向输出
GpioCtrlRegs.GPAPUD.bit.GPIO19 = 0; //关闭上拉
EDIS;
/**/
//使能EPWM1 使能TZ3
InitEPwm();
InitECap();
InitSci();//通过测试
InitAdc();
InitTimer0();
extern Uint16 RamfuncsLoadStart;
extern Uint16 RamfuncsLoadSize;
extern Uint16 RamfuncsRunStart;
memcpy(&RamfuncsRunStart, &RamfuncsLoadStart, (size_t)&RamfuncsLoadSize);
InitFlash();
EnableInterrupts();
PID_Set();
for (;;)
{
//pid->Setpoint = 30 ;
//pid->Input = 20;
// PID_Compute(&pid);
if( flag.Rec_Ok )
{
Process();
flag.Rec_Ok = 0 ;
}
if(flag.Cycle)//
{
flag.Cycle = 0;
if(++T_counter>124){ GpioDataRegs.GPATOGGLE.bit.GPIO19 = 1 ;//翻转
T_counter = 0;
}
}
DELAY_US(2000);
flag.Cycle = 1;
}
}
interrupt void Timer0_isr(void)
{
PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;//清除中断响应位避免阻止其他中断受影响
flag.Cycle =1;
}
void InitTimer0(void)
{
/****************设置定时器,用以触发ADC*****************/
CpuTimer0Regs.TPR.bit.TDDR = 59;
CpuTimer0Regs.TPRH.bit.TDDRH = 0; //对输入时钟60分频,60M/60=1M
CpuTimer0Regs.PRD.all = 4000;//定时4ms定时时间长度4ms
CpuTimer0Regs.TCR.bit.TRB = 1; //reload
CpuTimer0Regs.TCR.bit.TIE = 1; //使能中断
CpuTimer0Regs.TCR.bit.TSS = 0; //开始计数
EALLOW;
PieVectTable.TINT0 = &Timer0_isr;
PieCtrlRegs.PIECTRL.bit.ENPIE = 1; //使能PIE
PieCtrlRegs.PIEIER1.bit.INTx7 = 1; //使能int1.7
IER |=M_INT1;//使能GROUP1
EDIS;
}
//Rdata[4] 数据包含 命令+数据(2 byte)
// 'S'+频率数值
extern void SCIA_RxFifoSend(Uint16 * Src) ;
void Process(void)
{
if(Rdata[0]=='S') {
period = ((Rdata[1]<<8)|Rdata[2]);
EPwm1Regs.TBPRD = period-1; // PWM frequency = 1 / period
EPwm1Regs.CMPA.half.CMPA = period/2; // Set duty as 50%
SendData[0] = 'S';
SendData[1] = Rdata[1];
SendData[2] = Rdata[2];
}
else if(Rdata[0]=='R')
{
SendData[0] = 'R';
SendData[2] = FhaseError%255;
SendData[1] = FhaseError>>8;
}
else if(Rdata[0]=='C')
{
if(Rdata[1]==0) EPwm4Regs.AQCSFRC.bit.CSFA = 1;//软件强制0输出
else if(Rdata[1]==0xff) EPwm4Regs.AQCSFRC.bit.CSFA = 3;//软件强制无效
SendData[0] = 'C';
SendData[1] = Rdata[1];
SendData[2] = Rdata[2];
}
SCIA_RxFifoSend(SendData);
}
interrupt void SCIA_RxFifoIsr(void)
{
uint16_t i;
for(i=0;i<3;i++)
{
// Read data
Rdata[i] = SciaRegs.SCIRXBUF.bit.RXDT ;
}
SciaRegs.SCIFFRX.bit.RXFFINTCLR = 1;//// Clear Interrupt flag
PieCtrlRegs.PIEACK.all = PIEACK_GROUP9;//避免影响其他中断的发生
//rest
flag.Rec_Ok = 1 ;//设定 接收完成标志
}
