This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
我正在使用 TMS320F28377S 并配置 全局 PWM 负载功能。
我对该函数有一些疑问。
1:
我使用 GLDCNT 更新寄存器(CMPA、CMPB 等) 正时调整。
我通过类似的方式检查了 ePWM1处的 GLDCNT 值
(GCNT1 = EPwm2Regs.GLDCTL.bit.GLDCNT;)
然后、我注意到 GLDCNT 值在 A 点为0、在 B 点为1 (请参阅以下代码)
--------------------------------------------------
EALLOW;
EPwm2Regs.GLDCTL.ALL = 0x0183U;
EPwm2Regs.GLDCFG.ALL = 0x0002U;
EDIS;
EPwm2Regs.TBCTL.ALL = 0x8003U;
EPwm2Regs.TBPRD = 999;
(A 点)
EPwm2Regs.TBCTL.bit.CTRMODE = 0U;
CpuSysRegs.PCLKCR0.bit.TBCLKSYNC = 0x1U;
(B 点)
------------------------------
因此、我将初始 GLDCNT 值解释为1、因为 当 TBCLKSYNC=1U 时、该值会变为0至1;
这种解释是否正确?
2:
配置为 以下时
EALLOW;
EPwm3Regs.GLDCTL.ALL = 0x0181U;//当 TBCTR = 0U 且 GLDPRD = 3U 时加载寄存器*/
EPwm3Regs.GLDCFG.ALL = 0x0002U;
EDIS;
EPwm3Regs.TBPRD = 999;
EPwm3Regs.TBCTL.bit.CTRMODE = 0U;
GLDCNT 值会发生类似的变化
0→1 (当 TBCLK = 1U 时)→2 (10us 后)
TBCTR 会发生类似的变化
0→0 (当 TBCLK = 1U 时,TBCTR 开始递增计数(C 点))→999 (达到 TBPRD 值)→0 (分频器10us,GLDCNT 值将1更改为2)
这是否意味着第一个 TBCTR = 0U (C 点)不被视为 TBCTR = 事件?
3:配置如下 EPWM 时
#include
#include
#include
#pragma CODE_SECTION (InitFlash_BANK0、"ramfuncs");
#pragma CODE_SECTION (InitFlash_BANK1、"ramfuncs");
#define IMULT_12 12.
#define IMULT_20 20
#define IMULT_40 40
#define FMULT_0
#define PLLCLK_by_2 1.
#define INT_OSC2 0
#define XTAL_OSC 1
#define INT_OSC1 2.
#define AUXCLKIN 4
#define PLLCLK_BY_126 63
静态空 InitFlash_BANK0 (空);
静态空 InitFlash_BANK1 (空);
静态空 InitSysPll (uint16 clock_source、uint16 imult、uint16 fmult、uint16 divsel);
静态空 SysIntOsc1Sel (空);
静态空 SysIntOsc2Sel(void);
静态空 SysX 振荡器(空);
静态空 InitPeripheralClocks();
静态空 InitGpio();
静态空 InitPieCtrl (void);
静态空 InitPieVectTable (void);
静态空 DisableDog (空);
静态空 ISR_ILLEGID (空);
静态空 Memcopy (uint16* DestAddr、uint16* SourceAddr、uint32 size);
extern UINT16 RamfuncsRunStart;
extern UINT16 RamfuncsLoadStart;
extern uint32 RamfuncsLoadSize;
void InitSystem (void);
UINT16 InitPWM (UINT16 CarrierFrequency、float32 DeadtimePonRaw、float32 DeadtimeNonRaw、
UINT16 InitPinP、UINT16 InitPinN、UINT16偏移);
uint16 SetPhase_Duty_PWM (float32 Duty_P、float32 Duty_S);
void F28x_usDelay (uint32);
uint16 CNT1 = 0U;
uint16 CNT2 = 0U;
uint16 CNT3 = 0U;
uint16 CNT4 = 0U;
uint16 CNT5 = 0U;
uint16 CNT6 = 0U;
uint16 CNT7 = 0U;
uint16 CNT8 = 0U;
uint16 CNT9 = 0U;
uint16 CNT10 = 0U;
uint16 CNT11 = 0U;
uint16 CNT12 = 0U;
uint16 CNT13 = 0U;
uint16 CNT14 = 0U;
uint16 CNT15 = 0U;
uint16 CNT16 = 0U;
uint16 CNT17 = 0U;
uint16 CNT18 = 0U;
uint16 CNT19 = 0U;
uint16 CNT20 = 0U;
uint16 CNT21 = 0U;
uint16 CNT22 = 0U;
uint16 CNT23 = 0U;
uint16 CNT24 = 0U;
uint16 CNT25 = 0U;
uint16 CNT26 = 0U;
uint16 CNT27 = 0U;
uint16 CNT28 = 0U;
uint16 CNT29 = 0U;
uint16 CNT30 = 0U;
uint16 CNT31 = 0U;
uint16 CNT32 = 0U;
uint16 CNT33 = 0U;
uint16 CNT34 = 0U;
uint16 CNT35 = 0U;
uint16 CNT36 = 0U;
UINT16 GCNT0 = 0U;
UINT16 GCNT1 = 0U;
uint16 GCNT2 = 0U;
uint16 GCNT3 = 0U;
uint16 GCNT4 = 0U;
UINT16 GCNT5 = 0U;
UINT16 GCNT6 = 0U;
UINT16 GCNT7 = 0U;
UINT16 GCNT8 = 0U;
UINT16 GCNT9 = 0U;
UINT16 GCNT10 = 0U;
UINT16 GCNT11 = 0U;
UINT16 GCNT12 = 0U;
UINT16 GCNT13 = 0U;
UINT16 GCNT14 = 0U;
UINT16 GCNT15 = 0U;
UINT16 GCNT16 = 0U;
UINT16 GCNT17 = 0U;
UINT16 GCNT18 = 0U;
UINT16 GCNT19 = 0U;
uint16 GCNT20 = 0U;
UINT16 GCNT21 = 0U;
UINT16 GCNT22 = 0U;
UINT16 GCNT23 = 0U;
UINT16 GCNT24 = 0U;
UINT16 GCNT25 = 0U;
UINT16 GCNT26 = 0U;
UINT16 GCNT27 = 0U;
UINT16 GCNT28 = 0U;
UINT16 GCNT41 = 0U;
UINT16 GCNT42 = 0U;
UINT16 GCNT43 = 0U;
UINT16 GCNT44 = 0U;
UINT16 GCNT45 = 0U;
UINT16 GCNT46 = 0U;
UINT16 GCNT47 = 0U;
UINT16 GCNT48 = 0U;
uint16 ICNT1 = 0U;
uint16 ICNT2=0U ;
uint16 ICNT3 = 0U;
uint16 ICNT4 = 0U;
uint16 ICNT5=0U ;
uint16 ICNT6 = 0U;
float32 u = 0.9F;
float32 v = 0.9F;
float32 w = 0.0F;
uint16 cnt_int = 0U;
uint16 debugswitch = 4U;
#pragma 中断(Phase_Duty)
void Phase_Duty (void)
{
PieCtrlRegs.PIEACX.ALL = 0xFFFFFFU;
{
if (cnt_int == 0U)
{
SetPhase_Duty_PWM (0.9、0.9);
CNT_int = 1U;
}
否则、如果(cnt_int == 1U)
{
SetPhase_Duty_PWM (-0.9、-0.9);
CNT_int = 0U;
}
}
EPwm1Regs.ETCLR.ALL = 0x1U;
}
int main (空)
{
_disable_interrupts ();
InitSystem();
InitPWM (100、10、10、1、1、0);
__ENABLE_INTERRUPTS ();
EALLOW;
F28x_usDelay ((uint32)(5 * 40L)- 2);
GpioCtrlRegs.GPADIR.bit.GPIO10 = 1U;
CNT1 = EPwm1Regs.TBCTR;
GCNT1 = EPwm2Regs.GLDCTL.bit.GLDCNT;
GpioDataRegs.GPASET.bit.GPIO10 = 1UL;
CNT2 = EPwm2Regs.TBCTR;
GCNT2 = EPwm3Regs.GLDCTL.bit.GLDCNT;
CNT3 = EPwm3Regs.TBCTR;
GpioDataRegs.GPACLEAR.bit.GPIO10 = 1UL;
GCNT41 = EPwm4Regs.GLDCTL.bit.GLDCNT;
CNT4 = EPwm4Regs.TBCTR;
GCNT3 = EPwm5Regs.GLDCTL.bit.GLDCNT;
CNT5 = EPwm5Regs.TBCTR;
GCNT4 = EPwm6Regs.GLDCTL.bit.GLDCNT;
CNT6 = EPwm6Regs.TBCTR;
ICNT1 = EPwm3Regs.ETPS.bit.INTCNT;
EDIS;
F28x_usDelay ((uint32)(5 * 40L)- 2);
EALLOW;
GpioDataRegs.GPASET.bit.GPIO10 = 1UL;
GCNT5 = EPwm2Regs.GLDCTL.bit.GLDCNT;
GCNT6 = EPwm3Regs.GLDCTL.bit.GLDCNT;
GpioDataRegs.GPACLEAR.bit.GPIO10 = 1UL;
GCNT7 = EPwm5Regs.GLDCTL.bit.GLDCNT;
GCNT8 = EPwm6Regs.GLDCTL.bit.GLDCNT;
ICNT2 = EPwm3Regs.ETPS.bit.INTCNT;
EDIS;
CNT7 = EPwm1Regs.TBCTR;
CNT8 = EPwm2Regs.TBCTR;
CNT9 = EPwm3Regs.TBCTR;
CNT10 = EPwm4Regs.TBCTR;
GCNT42 = EPwm4Regs.GLDCTL.bit.GLDCNT;
CNT11 = EPwm5Regs.TBCTR;
CNT12 = EPwm6Regs.TBCTR;
F28x_usDelay ((uint32)(5 * 40L)- 2);
EALLOW;
GpioDataRegs.GPASET.bit.GPIO10 = 1UL;
GCNT9 = EPwm2Regs.GLDCTL.bit.GLDCNT;
GCNT10 = EPwm3Regs.GLDCTL.bit.GLDCNT;
GpioDataRegs.GPACLEAR.bit.GPIO10 = 1UL;
GCNT11 = EPwm5Regs.GLDCTL.bit.GLDCNT;
GCNT12 = EPwm6Regs.GLDCTL.bit.GLDCNT;
ICNT3 = EPwm3Regs.ETPS.bit.INTCNT;
EDIS;
CNT13 = EPwm1Regs.TBCTR;
CNT14 = EPwm2Regs.TBCTR;
CNT15 = EPwm3Regs.TBCTR;
CNT16 = EPwm4Regs.TBCTR;
GCNT43 = EPwm4Regs.GLDCTL.bit.GLDCNT;
CNT17 = EPwm5Regs.TBCTR;
CNT18 = EPwm6Regs.TBCTR;
F28x_usDelay ((uint32)(5 * 40L)- 2);
EALLOW;
GpioDataRegs.GPASET.bit.GPIO10 = 1UL;
GCNT13 = EPwm2Regs.GLDCTL.bit.GLDCNT;
GCNT14 = EPwm3Regs.GLDCTL.bit.GLDCNT;
GpioDataRegs.GPACLEAR.bit.GPIO10 = 1UL;
GCNT15 = EPwm5Regs.GLDCTL.bit.GLDCNT;
GCNT16 = EPwm6Regs.GLDCTL.bit.GLDCNT;
ICNT4 = EPwm3Regs.ETPS.bit.INTCNT;
EDIS;
CNT19 = EPwm1Regs.TBCTR;
CNT20 = EPwm2Regs.TBCTR;
CNT21 = EPwm3Regs.TBCTR;
CNT22 = EPwm4Regs.TBCTR;
GCNT44 = EPwm4Regs.GLDCTL.bit.GLDCNT;
CNT23 = EPwm5Regs.TBCTR;
CNT24 = EPwm6Regs.TBCTR;
F28x_usDelay ((uint32)(5 * 40L)- 2);
EALLOW;
GpioDataRegs.GPASET.bit.GPIO10 = 1UL;
GCNT17 = EPwm2Regs.GLDCTL.bit.GLDCNT;
GCNT18 = EPwm3Regs.GLDCTL.bit.GLDCNT;
GpioDataRegs.GPACLEAR.bit.GPIO10 = 1UL;
GCNT19 = EPwm5Regs.GLDCTL.bit.GLDCNT;
CNT29 = EPwm5Regs.TBCTR;
GCNT20 = EPwm6Regs.GLDCTL.bit.GLDCNT;
ICNT5 = EPwm3Regs.ETPS.bit.INTCNT;
CNT25 = EPwm1Regs.TBCTR;
CNT26 = EPwm2Regs.TBCTR;
CNT27 = EPwm3Regs.TBCTR;
CNT28 = EPwm4Regs.TBCTR;
GCNT45 = EPwm4Regs.GLDCTL.bit.GLDCNT;
CNT30 = EPwm6Regs.TBCTR;
EDIS;
F28x_usDelay ((uint32)(5 * 40L)- 2);
EALLOW;
GpioDataRegs.GPASET.bit.GPIO10 = 1UL;
GCNT21 = EPwm2Regs.GLDCTL.bit.GLDCNT;
GCNT22 = EPwm3Regs.GLDCTL.bit.GLDCNT;
GpioDataRegs.GPACLEAR.bit.GPIO10 = 1UL;
GCNT23 = EPwm5Regs.GLDCTL.bit.GLDCNT;
CNT31 = EPwm5Regs.TBCTR;
CNT33 = EPwm4Regs.TBCTR;
GCNT46 = EPwm4Regs.GLDCTL.bit.GLDCNT;
CNT35 = EPwm1Regs.TBCTR;
GCNT24 = EPwm6Regs.GLDCTL.bit.GLDCNT;
ICNT6 = EPwm3Regs.ETPS.bit.INTCNT;
EDIS;
F28x_usDelay ((uint32)(5 * 40L)- 2);
EALLOW;
GpioDataRegs.GPASET.bit.GPIO10 = 1UL;
GCNT25 = EPwm2Regs.GLDCTL.bit.GLDCNT;
GCNT26 = EPwm3Regs.GLDCTL.bit.GLDCNT;
GpioDataRegs.GPACLEAR.bit.GPIO10 = 1UL;
GCNT27 = EPwm5Regs.GLDCTL.bit.GLDCNT;
CNT32 = EPwm5Regs.TBCTR;
CNT34 = EPwm4Regs.TBCTR;
GCNT47 = EPwm4Regs.GLDCTL.bit.GLDCNT;
CNT36 = EPwm1Regs.TBCTR;
GCNT28 = EPwm6Regs.GLDCTL.bit.GLDCNT;
EDIS;
while (1)
{}
返回0;
}
UINT16 SetPhase_Duty_PWM (float32 Duty_P、float32 Duty_S)
{
uint16 ret = 0U;
if (Duty_P > 1 || Duty_P <-1 || Duty_S > 1 || Duty_S <-1)
{ret = 1U;}
其他
{
uint32 峰值= 0UL;
uint16 DutyIntPP = 0U;
峰 值=(EPwm1Regs.TBPRD + 1UL);
DutyIntPP =(uint16)((Duty_P + 1.0F)* Peak * 0.5 - 1U);
EPwm3Regs.CMPA.bit.CMPA = DutyIntPP;
EPwm2Regs.CMPA.bit.CMPA = DutyIntPP;
RET = 0U;
}
回程;
}
UINT16 InitPWM (UINT16 CarrierFrequency、float32 DeadtimePonRaw、float32 DeadtimeNonRaw、
UINT16 InitPinP、UINT16 InitPinN、UINT16偏移)
{
UINT16 IntDBRED = 0U;
UINT16 IntDBFED = 0U;
uint16 ret = 0U;
IntDBRED=(UINT16)(2*DeadtimePonRaw);
IntDBFED =(UINT16)(2*DeadtimeNonRaw);
IF (IntDBFED < 3U || IntDBRED < 3U)
{ret = 1U;}
其他
{
EALLOW;
CpuSysRegs.PCLKCR0.bit.HRPWM = 0x1U;
CpuSysRegs.PCLKCR2.bit.EPWM1 = 0x1U;
CpuSysRegs.PCLKCR2.bit.EPWM2 = 0x1U;
CpuSysRegs.PCLKCR2.bit.EPWM3 = 0x1U;
CpuSysRegs.PCLKCR2.bit.EPWM4 = 0x1U;
CpuSysRegs.PCLKCR2.bit.EPWM5= 0x1U;
CpuSysRegs.PCLKCR2.bit.EPWM6= 0x0U;
EDIS;
EPwm1Regs.ETSEL.ALL = 0x1101U;
EPwm1Regs.ETCLR.ALL = 0x000DU;
EPwm1Regs.ETPS.all = 0x1101U;
EPwm2Regs.ETSEL.ALL = 0x1101U;
EPwm2Regs.ETCLR.ALL = 0x000DU;
EPwm2Regs.ETPS.ALL = 0x1101U;
EPwm3Regs.ETSEL.ALL = 0x1101U;
EPwm3Regs.ETCLR.ALL = 0x000DU;
EPwm3Regs.ETPS.ALL = 0x1101U;
EPwm4Regs.ETSEL.ALL = 0x1101U;
EPwm4Regs.ETCLR.ALL = 0x000DU;
EPwm4Regs.ETPS.ALL = 0x1101U;
EPwm5Regs.ETSEL.ALL = 0x1101U;
EPwm5Regs.ETCLR.ALL = 0x000DU;
EPwm6Regs.ETPS.ALL = 0x1101U;
EPwm6Regs.ETCLR.ALL = 0x000DU;
EPwm6Regs.ETPS.ALL = 0x1101U;
EALLOW;
GpioCtrlRegs.GPAMUX1.bit.GPIO8=0U ;
GpioCtrlRegs.GPAGMUX1.bit.GPIO8=0U ;
GpioCtrlRegs.GPADIR.bit.GPIO8 = 0U;
GpioCtrlRegs.GPAMUX1.bit.GPIO9=0U ;
GpioCtrlRegs.GPAGMUX1.bit.GPIO9 = 0U;
GpioCtrlRegs.GPADIR.bit.GPIO9 = 0U;
GpioCtrlRegs.GPAMUX1.bit.GPIO2 = 0U;
GpioCtrlRegs.GPAGMUX1.bit.GPIO2 = 0U;
GpioCtrlRegs.GPADIR.bit.GPIO2 = 0U;
GpioCtrlRegs.GPAMUX1.bit.GPIO3 = 0U;
GpioCtrlRegs.GPAGMUX1.bit.GPIO3 = 0U;
GpioCtrlRegs.GPADIR.bit.GPIO3 = 0U;
GpioCtrlRegs.GPAMUX1.bit.GPIO4 = 0U;
GpioCtrlRegs.GPAGMUX1.bit.GPIO4 = 0U;
GpioCtrlRegs.GPADIR.bit.GPIO4 = 0U;
GpioCtrlRegs.GPAMUX1.bit.GPIO5=0U ;
GpioCtrlRegs.GPAGMUX1.bit.GPIO5 = 0U;
GpioCtrlRegs.GPADIR.bit.GPIO5 = 0U;
GpioCtrlRegs.GPAMUX1.bit.GPIO10 = 0U;
GpioCtrlRegs.GPAGMUX1.bit.GPIO10 = 0U;
GpioCtrlRegs.GPADIR.bit.GPIO10 = 0U;
GpioCtrlRegs.GPAMUX1.bit.GPIO11 = 0U;
GpioCtrlRegs.GPAGMUX1.bit.GPIO11 = 0U;
GpioCtrlRegs.GPADIR.bit.GPIO11 = 0U;
EPwm1Regs.GLDCTL.ALL = 0x0183U;
EPwm2Regs.GLDCTL.ALL = 0x0183U;
EPwm3Regs.GLDCTL.ALL = 0x0181U;
EPwm4Regs.GLDCTL.ALL = 0x0187U;
EPwm5Regs.GLDCTL.ALL = 0x0187U;
EPwm6Regs.GLDCTL.ALL = 0x0187U;
EPwm1Regs.GLDCFG.ALL = 0x0000U;
EPwm2Regs.GLDCFG.ALL = 0x0002U;
EPwm3Regs.GLDCFG.ALL = 0x0002U;
EPwm4Regs.GLDCFG.ALL = 0x0004U;
EPwm5Regs.GLDCFG.ALL = 0x0002U;
EPwm6Regs.GLDCFG.ALL = 0x0002U;
EDIS;
EPwm1Regs.TBCTL.ALL = 0x8003U;
EPwm1Regs.PCCTL.ALL = 0x0U;
EPwm1Regs.TBPRD =(uint32)(100000 /(CarrierFrequency))-1;
EPwm2Regs.TBCTL.ALL = 0x8003U;
EPwm2Regs.PCCTL.ALL = 0x0U;
EPwm2Regs.TBPRD =(uint32)(100000 /(CarrierFrequency))-1;
EPwm3Regs.TBCTL.ALL = 0x8003U;
EPwm3Regs.PCCTL.ALL = 0x0U;
EPwm3Regs.TBPRD =(uint32)(100000 /(CarrierFrequency))-1;
EPwm4Regs.TBCTL.ALL = 0x8003U;
EPwm4Regs.PCCTL.ALL = 0x0U;
EPwm4Regs.TBPRD =(uint32)(100000 /(CarrierFrequency))-1;
EPwm5Regs.TBCTL.ALL = 0x8003U;
EPwm5Regs.PCCTL.ALL = 0x0U;
EPwm5Regs.TBPRD =(uint32)(100000 /(CarrierFrequency))-1;
EPwm6Regs.TBCTL.ALL = 0x8003U;
EPwm6Regs.PCCTL.ALL = 0x0U;
EPwm6Regs.TBPRD =(uint32)(100000 /(CarrierFrequency))-1;
EPwm1Regs.AQCTLA.ALL = 0x0012U;
EPwm2Regs.AQCTLA.ALL = 0x0012U;
EPwm3Regs.AQCTLA.ALL = 0x0012U;
EPwm4Regs.AQCTLA.ALL = 0x0012U;
EPwm5Regs.AQCTLA.ALL = 0x0012U;
EPwm6Regs.AQCTLA.ALL = 0x0012U;
EPwm1Regs.AQSFRC.ALL = 0U;
EPwm1Regs.AQCSFRC.ALL = 0U;
EPwm2Regs.AQSFRC.ALL = 0U;
EPwm2Regs.AQCSFRC.ALL = 0U;
EPwm3Regs.AQSFRC.ALL = 0U;
EPwm3Regs.AQCSFRC.ALL = 0U;
EPwm4Regs.AQSFRC.ALL = 0U;
EPwm4Regs.AQCSFRC.ALL = 0U;
EPwm5Regs.AQSFRC.ALL = 0U;
EPwm5Regs.AQCSFRC.ALL = 0U;
EPwm6Regs.AQSFRC.ALL = 0U;
EPwm6Regs.AQCSFRC.ALL = 0U;
EPwm1Regs.TBCTL.bit.SYNCOSEL = 2U;
EPwm1Regs.CMPA.bit.CMPA =(uint32)(50000 /(CarrierFrequency))- 1UL;
EPwm1Regs.CMPB.bit.CMPB = 1UL;
EPwm1Regs.CMPC = 750U;
EPwm1Regs.CMPD =(uint32)(50000 /(CarrierFrequency))- 1UL;
EPwm1Regs.CMPCTL.bit.SHDWAMODE = 0U; /* CMPAShadow */
EPwm1Regs.CMPCTL.bit.SHDWBMODE = 0U; /* CMPBShadow *
EPwm1Regs.CMPCTL2.bit.SHDWCMODE = 0U; /* CMPCShadow */
EPwm1Regs.CMPCTL2.bit.SHDWDMODE = 0U; /* CMPDShadow */
EPwm1Regs.TBCTL.bit.PRDLD = 0U; // TBPRDShadow *
EPwm1Regs.DBCTL.bit.SHDWDBFEDMODE = 1U; /* DBFEDShadow */
EPwm1Regs.DBCTL.bit.SHDWDBREDMODE = 1U; /* DBREDShadow */
EPwm1Regs.DBCTL.bit.HALFCYCLE = 1U;
EPwm1Regs.DBCTL.bit.IN_MODE = 0U;
EPwm1Regs.DBCTL.bit.OUT_MODE = 3U;
EPwm1Regs.DBCTL.bit.POLSEL = 2U;
EPwm1Regs.DBCTL.bit.DEDB_MODE = 0U;
EPwm1Regs.DBCTL.bit.OUTSWAP = 0U;
EPwm1Regs.TBCTL.bit.PHSEN = 0U;
EPwm1Regs.TBCTL.bit.PHSDIR = 1U;
EPwm2Regs.TBCTL.bit.SYNCOSEL = 0U;
EPwm2Regs.CMPA.bit.CMPA =(uint32)(50000 /(CarrierFrequency))- 1UL;
EPwm2Regs.CMPB.bit.CMPB =(uint32)(50000 /(CarrierFrequency))- 1UL;
EPwm2Regs.CMPC =(uint32)(75000 /(CarrierFrequency))+ 10UL;
EPwm2Regs.CMPD =(uint32)(30000 /(CarrierFrequency))- 1UL;
EPwm2Regs.TBPHS.bit.TBPHS =(uint32)(50000 /(CarrierFrequency))- 1UL;
EPwm2Regs.CMPCTL.bit.SHDWAMODE = 0U; /* CMPAShadow */
EPwm2Regs.CMPCTL.bit.SHDWBMODE = 0U; /* CMPBShadow *
EPwm2Regs.CMPCTL2.bit.SHDWCMODE = 0U; /* CMPCShadow */
EPwm2Regs.CMPCTL2.bit.SHDWDMODE = 0U; /* CMPDShadow */
EPwm2Regs.TBCTL.bit.PRDLD = 0U; // TBPRDShadow *
EPwm2Regs.DBCTL.bit.SHDWDBFEDMODE = 1U; /* DBFEDShadow */
EPwm2Regs.DBCTL.bit.SHDWDBREDMODE = 1U; /* DBREDShadow */
EPwm2Regs.DBCTL.bit.HALFCYCLE = 1U;
EPwm2Regs.DBCTL.bit.IN_MODE = 0U;
EPwm2Regs.DBCTL.bit.OUT_MODE = 3U;
EPwm2Regs.DBCTL.bit.POLSEL = 2U;
EPwm2Regs.DBCTL.bit.DEDB_MODE = 0U;
EPwm2Regs.DBCTL.bit.OUTSWAP = 0U;
EPwm2Regs.TBCTL.bit.PHSEN = 0U;
EPwm2Regs.TBCTL.bit.PHSDIR = 1U;
EPwm3Regs.TBCTL.bit.SYNCOSEL = 0U;
EPwm3Regs.TBPHS.bit.TBPHS = 0U;
EPwm3Regs.CMPA.bit.CMPA =(uint32)(50000 /(CarrierFrequency))- 1UL;
EPwm3Regs.CMPB.bit.CMPB =(uint32)(50000 /(CarrierFrequency))- 1UL;
EPwm3Regs.CMPC = 1UL;
EPwm3Regs.CMPD =(uint32)(30000 /(CarrierFrequency))- 1UL;
EPwm3Regs.CMPCTL.bit.SHDWAMODE = 0U; /* CMPAShadow */
EPwm3Regs.CMPCTL.bit.SHDWBMODE = 0U; /* CMPBShadow *
EPwm3Regs.CMPCTL2.bit.SHDWCMODE = 0U; /* CMPCShadow */
EPwm3Regs.CMPCTL2.bit.SHDWDMODE = 0U; /* CMPDShadow */
EPwm3Regs.TBCTL.bit.PRDLD = 0U; // TBPRDShadow *
EPwm3Regs.DBCTL.bit.SHDWDBFEDMODE = 1U; /* DBFEDShadow */
EPwm3Regs.DBCTL.bit.SHDWDBREDMODE = 1U; /* DBREDShadow */
EPwm3Regs.DBCTL.bit.HALFCYCLE = 1U;
EPwm3Regs.DBCTL.bit.IN_MODE = 0U;
EPwm3Regs.DBCTL.bit.OUT_MODE = 3U;
EPwm3Regs.DBCTL.bit.POLSEL = 2U;
EPwm3Regs.DBCTL.bit.DEDB_MODE = 0U;
EPwm3Regs.DBCTL.bit.OUTSWAP = 0U;
EPwm3Regs.TBCTL.bit.PHSEN = 0U;
EPwm3Regs.TBCTL.bit.PHSDIR = 1U;
EPwm4Regs.TBCTL.bit.SYNCOSEL = 2U;
EPwm4Regs.TBPHS.bit.TBPHS =偏移;
EPwm4Regs.CMPA.bit.CMPA =(uint32)(50000 /(CarrierFrequency))- 1UL;
EPwm4Regs.CMPB.bit.CMPB =(uint32)(50000 /(CarrierFrequency))- 1UL;
EPwm4Regs.CMPC = 1U;
EPwm4Regs.CMPD =(uint32)(50000 /(CarrierFrequency))- 1UL;
EPwm4Regs.CMPCTL.bit.SHDWAMODE = 0U; /* CMPAShadow */
EPwm4Regs.CMPCTL.bit.SHDWBMODE = 0U; /* CMPBShadow *
EPwm4Regs.CMPCTL2.bit.SHDWCMODE = 0U; /* CMPCShadow */
EPwm4Regs.CMPCTL2.bit.SHDWDMODE = 0U; /* CMPDShadow */
EPwm4Regs.TBCTL.bit.PRDLD = 0U; // TBPRDShadow *
EPwm4Regs.DBCTL.bit.SHDWDBFEDMODE = 1U; /* DBFEDShadow */
EPwm4Regs.DBCTL.bit.SHDWDBREDMODE = 1U; /* DBREDShadow */
EPwm4Regs.DBCTL.bit.HALFCYCLE = 1U;
EPwm4Regs.DBCTL.bit.IN_MODE = 0U;
EPwm4Regs.DBCTL.bit.OUT_MODE = 3U;
EPwm4Regs.DBCTL.bit.POLSEL = 2U;
EPwm4Regs.DBCTL.bit.DEDB_MODE = 0U;
EPwm4Regs.DBCTL.bit.OUTSWAP = 0U;
EPwm4Regs.TBCTL.bit.PHSEN = 0U;
EPwm4Regs.TBCTL.bit.PHSDIR = 1U;
EPwm5Regs.TBCTL.bit.SYNCOSEL = 2U;
EPwm5Regs.TBPHS.bit.TBPHS = 0U;
EPwm5Regs.CMPA.bit.CMPA =(uint32)(50000 /(CarrierFrequency))- 1UL;
EPwm5Regs.CMPB.bit.CMPB =(uint32)(50000 /(CarrierFrequency))- 1UL;
EPwm5Regs.CMPC = 1U;
EPwm5Regs.CMPD =(uint32)(50000 /(CarrierFrequency))- 1UL;
EPwm5Regs.CMPCTL.bit.SHDWAMODE = 0U; /* CMPAShadow *
EPwm5Regs.CMPCTL.bit.SHDWBMODE = 0U; /* CMPBShadow *
EPwm5Regs.CMPCTL2.bit.SHDWCMODE = 0U; /* CMPCShadow */
EPwm5Regs.CMPCTL2.bit.SHDWDMODE = 0U; /* CMPDShadow */
EPwm5Regs.TBCTL.bit.PRDLD = 0U; // TBPRDShadow *
EPwm5Regs.DBCTL.bit.SHDWDBFEDMODE = 1U; /* DBFEDShadow */
EPwm5Regs.DBCTL.bit.SHDWDBREDMODE = 1U; /* DBREDShadow */
EPwm5Regs.DBCTL.bit.HALFCYCLE = 1U;
EPwm5Regs.DBCTL.bit.IN_MODE = 0U;
EPwm5Regs.DBCTL.bit.OUT_MODE = 3U;
EPwm5Regs.DBCTL.bit.POLSEL = 2U;
EPwm5Regs.DBCTL.bit.DEDB_MODE = 0U;
EPwm5Regs.DBCTL.bit.OUTSWAP = 0U;
EPwm5Regs.TBCTL.bit.PHSEN = 0U;
EPwm5Regs.TBCTL.bit.PHSDIR = 1U;
EPwm6Regs.TBCTL.bit.SYNCOSEL = 3U;
EPwm6Regs.TBCTL2.bit.SYNCOSELX = 0U;
EPwm6Regs.TBPHS.bit.TBPHS = 0U;
EPwm6Regs.CMPA.bit.CMPA =(UINT32)(50000 /(CarrierFrequency))-1UL;
EPwm6Regs.CMPB.bit.CMPB =(uint32)(50000 /(CarrierFrequency))- 1UL;
EPwm6Regs.CMPC = 1U;
EPwm6Regs.CMPD =(uint32)(50000 /(CarrierFrequency))- 1UL;
EPwm6Regs.CMPCTL.bit.SHDWAMODE = 0U; /* CMPAShadow */
EPwm6Regs.CMPCTL.bit.SHDWBMODE = 0U; /* CMPBShadow *
EPwm6Regs.CMPCTL2.bit.SHDWCMODE = 0U; /* CMPCShadow */
EPwm6Regs.CMPCTL2.bit.SHDWDMODE = 0U; /* CMPDShadow */
EPwm6Regs.TBCTL.bit.PRDLD = 0U; // TBPRDShadow *
EPwm6Regs.DBCTL.bit.SHDWDBFEDMODE = 1U; /* DBFEDShadow */
EPwm6Regs.DBCTL.bit.SHDWDBREDMODE = 1U; /* DBREDShadow */
EPwm6Regs.DBCTL.bit.HALFCYCLE = 1U;
EPwm6Regs.DBCTL.bit.IN_MODE = 0U;
EPwm6Regs.DBCTL.bit.OUT_MODE = 3U;
EPwm6Regs.DBCTL.bit.POLSEL = 2U;
EPwm6Regs.DBCTL.bit.DEDB_MODE = 0U;
EPwm6Regs.DBCTL.bit.OUTSWAP = 0U;
EPwm6Regs.TBCTL.bit.PHSEN = 0U;
EPwm6Regs.TBCTL.bit.PHSDIR = 1U;
EPwm2Regs.DBRED.bit.DBRED = IntDBRED;
EPwm2Regs.DBFED.bit.DBFED = IntDBFED;
EPwm3Regs.DBRED.bit.DBRED = IntDBRED;
EPwm3Regs.DBFED.bit.DBFED = IntDBFED;
EPwm4Regs.DBRED.bit.DBRED = IntDBRED;
EPwm4Regs.DBFED.bit.DBFED = IntDBFED;
EPwm5Regs.DBRED.bit.DBRED = IntDBRED;
EPwm5Regs.DBFED.bit.DBFED = IntDBFED;
EPwm6Regs.DBRED.bit.DBRED = IntDBRED;
EPwm6Regs.DBFED.bit.DBFED = IntDBFED;
{
EALLOW;
EPwm2Regs.HRMSTEP.bit.HRMSTEP = 66;
EPwm2Regs.HRCNFG.bit.CTLMODEb = 0U;
EPwm2Regs.HRCNFG.bit.EDGMODEB = 1U;
EPwm2Regs.HRCNFG.bit.SWAPAB = 0U;
EPwm2Regs.HRCNFG.bit.AUTOCONV = 0U;
EPwm2Regs.HRCNFG.bit.SELOUTB = 0U;
EPwm2Regs.HRCNFG.bit.CTLMODE = 0U;
EPwm2Regs.HRCNFG.bit.EDGMODE = 2U;
EPwm2Regs.HRCNFG2.bit.CTLMODEDFED = 0U;
EPwm2Regs.HRCNFG2.bit.CTLMODEDBRED = 0U;
EPwm2Regs.HRCNFG2.bit.EDGMODEDB= 3U;
EPwm2Regs.HRPWR.bit.CALPWRON = 1U;
EPwm3Regs.HRMSTEP.bit.HRMSTEP = 66;
EPwm3Regs.HRCNFG.bit.CTLMODEb = 0U;
EPwm3Regs.HRCNFG.bit.EDGMODEB = 1U;
EPwm3Regs.HRCNFG.bit.SWAPAB = 0U;
EPwm3Regs.HRCNFG.bit.AUTOCONV = 0U;
EPwm3Regs.HRCNFG.bit.SELOUTB = 0U;
EPwm3Regs.HRCNFG.bit.CTLMODE = 0U;
EPwm3Regs.HRCNFG.bit.EDGMODE = 2U;
EPwm3Regs.HRCNFG2.bit.CTLMODEDFED = 0U;
EPwm3Regs.HRCNFG2.bit.CTLMODEDBRED = 0U;
EPwm3Regs.HRCNFG2.bit.EDGMODEDB= 3U;
EPwm3Regs.HRPWR.bit.CALPWRON = 1U;
EPwm4Regs.HRMSTEP.bit.HRMSTEP = 66;
EPwm4Regs.HRCNFG.bit.CTLMODEb = 0U;
EPwm4Regs.HRCNFG.bit.EDGMODEB = 1U;
EPwm4Regs.HRCNFG.bit.SWAPAB = 0U;
EPwm4Regs.HRCNFG.bit.AUTOCONV = 0U;
EPwm4Regs.HRCNFG.bit.SELOUTB = 0U;
EPwm4Regs.HRCNFG.bit.CTLMODE = 0U;
EPwm4Regs.HRCNFG.bit.EDGMODE = 2U;
EPwm4Regs.HRCNFG2.bit.CTLMODEDFED = 0U;
EPwm4Regs.HRCNFG2.bit.CTLMODEDBRED = 0U;
EPwm4Regs.HRCNFG2.bit.EDGMODEDB= 3U;
EPwm4Regs.HRPWR.bit.CALPWRON = 1U;
EPwm5Regs.HRMSTEP.bit.HRMSTEP = 66;
EPwm5Regs.HRCNFG.bit.CTLMODEB = 1U;
EPwm5Regs.HRCNFG.bit.EDGMODEB = 3U;
EPwm5Regs.HRCNFG.bit.SWAPAB = 0U;
EPwm5Regs.HRCNFG.bit.AUTOCONV = 0U;
EPwm5Regs.HRCNFG.bit.SELOUTB = 0U;
EPwm5Regs.HRCNFG.bit.CTLMODE = 1U;
EPwm5Regs.HRCNFG.bit.EDGMODE = 3U;
EPwm5Regs.HRCNFG2.bit.CTLMODEDFED = 0U;
EPwm5Regs.HRCNFG2.bit.CTLMODEDBRED = 0U;
EPwm5Regs.HRCNFG2.bit.EDGMODEDB= 3U;
EPwm5Regs.HRPWR.bit.CALPWRON = 1U;
EPwm6Regs.HRMSTEP.bit.HRMSTEP = 66;
EPwm6Regs.HRCNFG.bit.CTLMODEB = 1U;
EPwm6Regs.HRCNFG.bit.EDGMODEB = 3U;
EPwm6Regs.HRCNFG.bit.SWAPAB = 0U;
EPwm6Regs.HRCNFG.bit.AUTOCONV = 0U;
EPwm6Regs.HRCNFG.bit.SELOUTB = 0U;
EPwm6Regs.HRCNFG.bit.CTLMODE = 1U;
EPwm6Regs.HRCNFG.bit.EDGMODE = 3U;
EPwm6Regs.HRCNFG2.bit.CTLMODEDFED = 0U;
EPwm6Regs.HRCNFG2.bit.CTLMODEDBRED = 0U;
EPwm6Regs.HRCNFG2.bit.EDGMODEDB= 3U;
EPwm6Regs.HRPWR.bit.CALPWRON = 1U;
EDIS;
}
{
EALLOW;
EPwm1Regs.TZSEL.ALL = 0x0000U;
EPwm1Regs.TZEINT.ALL = 0x0000U;
EPwm1Regs.TZCLR.ALL = 0x007fU;
EPwm1Regs.TZCTL.ALL = 0x0ff0U;
EPwm1Regs.TZCTL2.ALL = 0x0000U;
EPwm2Regs.TZSEL.ALL = 0x0000U;
EPwm2Regs.TZEINT.ALL = 0x0000U;
EPwm2Regs.TZCLR.ALL = 0x007fU;
EPwm2Regs.TZCTL.ALL = 0x0ff0U;
EPwm2Regs.TZCTL2.ALL = 0x0000U;
EPwm3Regs.TZSEL.ALL = 0x0000U;
EPwm3Regs.TZEINT.ALL = 0x0000U;
EPwm3Regs.TZCLR.ALL = 0x007fU;
EPwm3Regs.TZCTL.ALL = 0x0ff0U;
EPwm3Regs.TZCTL2.ALL = 0x0000U;
EPwm4Regs.TZSEL.ALL = 0x0000U;
EPwm4Regs.TZEINT.ALL = 0x0000U;
EPwm4Regs.TZCLR.ALL = 0x007fU;
EPwm4Regs.TZCTL.ALL = 0x0ff0U;
EPwm4Regs.TZCTL2.ALL = 0x0000U;
EPwm5Regs.TZSEL.ALL = 0x0000U;
EPwm5Regs.TZEINT.ALL = 0x0000U;
EPwm5Regs.TZCLR.ALL = 0x007fU;
EPwm5Regs.TZCTL.ALL = 0x0ff0U;
EPwm5Regs.TZCTL2.ALL = 0x0000U;
EPwm6Regs.TZSEL.ALL = 0x0000U;
EPwm6Regs.TZEINT.ALL = 0x0000U;
EPwm6Regs.TZCLR.ALL = 0x007fU;
EPwm6Regs.TZCTL.ALL = 0x0ff0U;
EPwm6Regs.TZCTL2.ALL = 0x0000U;
EDIS;
}
EPwm1Regs.ETSEL.bit.INTSEL = 4U;
EPwm1Regs.ETSEL.bit.INTSELCMP = 1U;
EPwm1Regs.ETPS.BIT.INTPSSEL = 0U;
EPwm1Regs.ETPS.bit.INTPRD = 3U;
EALLOW;
PieVectTable.EPWM1_INT = Phase_Duty;
EDIS;
EPwm1Regs.ETSEL.bit.INTEN = 1U;
PieCtrlRegs.PIEIER3.ALL |=(1U);
IER |= 0x0004U;
EALLOW;
GpioCtrlRegs.GPAMUX1.bit.GPIO0 = 1U;
GpioCtrlRegs.GPAGMUX1.bit.GPIO0 = 0U;
GpioCtrlRegs.GPADIR.bit.GPIO0 = 1U;
GpioCtrlRegs.GPAMUX1.bit.GPIO8=1U ;
GpioCtrlRegs.GPAGMUX1.bit.GPIO8=0U ;
GpioCtrlRegs.GPADIR.bit.GPIO8 = 1U;
GpioCtrlRegs.GPAMUX1.bit.GPIO9=1U ;
GpioCtrlRegs.GPAGMUX1.bit.GPIO9 = 0U;
GpioCtrlRegs.GPADIR.bit.GPIO9 = 1U;
GpioCtrlRegs.GPAMUX1.bit.GPIO2 = 1U;
GpioCtrlRegs.GPAGMUX1.bit.GPIO2 = 0U;
GpioCtrlRegs.GPADIR.bit.GPIO2 = 1U;
GpioCtrlRegs.GPAMUX1.bit.GPIO3 = 1U;
GpioCtrlRegs.GPAGMUX1.bit.GPIO3 = 0U;
GpioCtrlRegs.GPADIR.bit.GPIO3 = 1U;
GpioCtrlRegs.GPAMUX1.bit.GPIO4 = 1U;
GpioCtrlRegs.GPAGMUX1.bit.GPIO4 = 0U;
GpioCtrlRegs.GPADIR.bit.GPIO4 = 1U;
GpioCtrlRegs.GPAMUX1.bit.GPIO5 = 1U;
GpioCtrlRegs.GPAGMUX1.bit.GPIO5 = 0U;
GpioCtrlRegs.GPADIR.bit.GPIO5 = 1U;
GCNT0 = EPwm2Regs.GLDCTL.bit.GLDCNT;
EPwm1Regs.TBCTL.bit.CTRMODE = 0U;
EPwm2Regs.TBCTL.bit.CTRMODE = 0U;
EPwm3Regs.TBCTL.bit.CTRMODE = 0U;
EPwm4Regs.TBCTL.bit.CTRMODE = 0U;
EPwm5Regs.TBCTL.bit.CTRMODE = 0U;
EPwm6Regs.TBCTL.bit.CTRMODE = 0U;
CpuSysRegs.PCLKCR0.bit.TBCLKSYNC = 0x1U;
EDIS;
RET = 0U;
}
回程;
}
空 InitSystem (空)
{
DisableDog ();
Memcopy (&RamfuncsRunStart、&RamfuncsLoadStart、(uint32)&RamfuncsLoadSize);//
InitFlash_BANK0 ();
InitFlash_BANK1 ();
//*重要*
// Device_cal 函数、复制 ADC 和振荡器校准值
//从 TI 保留的 OTP 到适当的调整寄存器中,自动发生
//在引导 ROM 中。 如果在调试过程中绕过引导 ROM 代码
//要使 ADC 和振荡器正常工作、必须调用以下函数
//符合规格。 在调用 ADC 前、必须启用 ADC 的时钟
//函数。
//请参阅器件数据手册和/或 ADC 参考
//手册以了解更多信息。
EALLOW;
//尽快在未绑定的 IO 上启用上拉电阻以降低功耗。
// GPIO_EnableUnbondedIOPullups();
CpuSysRegs.PCLKCR13.bit.ADC_A = 1;
CpuSysRegs.PCLKCR13.bit.ADC_B = 1;
CpuSysRegs.PCLKCR13.bit.ADC_C = 1;
CpuSysRegs.PCLKCR13.bit.ADC_D = 1;
//检查器件是否已修整
if (*((UINT16 *) 0x5D1B6)== 0x0000){
//器件未修整、应用静态校准值
AnalogSubsysRegs.ANAREFTRIMA.ALL = 31709;
AnalogSubsysRegs.ANAREFTRIMB.all = 31709;
AnalogSubsysRegs.ANAREFTRIMC.ALL = 31709;
AnalogSubsysRegs.ANAREFTRIMD.ALL = 31709;
}
CpuSysRegs.PCLKCR13.bit.ADC_A = 0;
CpuSysRegs.PCLKCR13.bit.ADC_B = 0;
CpuSysRegs.PCLKCR13.bit.ADC_C = 0;
CpuSysRegs.PCLKCR13.bit.ADC_D = 0;
ClkCfgRegs.LOSPP.bit.LSPCLKDIV = 2; /* 1/4 = 50MHz *
InitSysPll (XTAL_OSC、IMULT_20、FULT_0、PLLCLK_By_2); //PLLSYSCLK =(XTAL_OSC)*(IMULT + FULT)/(PLLSYSCLKDIV)
EDIS;
//打开所有外设
InitPeripheralClocks();
ClkCfgRegs.PERCLKDIVSEL.ALL = 0x00000051; // EMIF1、EMIF2、ePWM:1/2 = 100MHz */
ClkCfgRegs.CLKSRCCTL3.bit.XCLKOUTSEL = 2; // XCLKOUT 的源= CPU1.SYSCLK *
ClkCfgRegs.XCLKOUTDIVSEL.bit.XCLKOUTDIV = 2;
EALLOW;
//
//初始化并等待 CLA1ToCPUMsgRAM
//
MemCfgRegs.MSGxINIT.bit.init_CLA1TOCPU = 1;
while (MemCfgRegs.MSGxINITDONE.bit.INITDONE_CLA1TOCPU!= 1){};
//
//初始化并等待 CPUToCLA1MsgRAM
//
MemCfgRegs.MSGxINIT.bit.init_CPUTOCLA1 = 1;
while (MemCfgRegs.MSGxINITDONE.bit.INITDONE_CPUTOCLA1!= 1){};
EDIS;
//步骤2. 初始化 GPIO:
//此示例函数位于 F2837xS_GPIO.c 文件和中
//说明了如何将 GPIO 设置为其默认状态。
InitGpio();
//步骤3. 清除所有中断并初始化 PIE 矢量表:
//禁用 CPU 中断
Dint;
//将 PIE 控制寄存器初始化为默认状态。
//默认状态为禁用所有 PIE 中断和标志
//被清除。
//此函数位于 F2837xS_PIECTRL.c 文件中。
InitPieCtrl();
//禁用 CPU 中断并清除所有 CPU 中断标志:
IER = 0x0000;
IFR = 0x0000;
//使用指向 shell 中断的指针初始化 PIE 矢量表
//服务例程(ISR)。
//这将填充整个表,即使是中断也是如此
//在本例中未使用。 这对于调试很有用。
//可以在 F2837xS_DefaultIsr.c 中找到 shell ISR 例程
//此函数可在 F2837xS_PieVect.c 中找到
InitPieVectTable();
//启用全局中断和更高优先级的实时调试事件:
EINT; //启用全局中断 INTM
ERTM; //启用全局实时中断 DBGM
// GPIOInit();
}
#pragma 中断(ISR_INAILLED)
静态空 ISR_ILLEGID (空)
{
IER = 0x0000; //禁用 CPU 中断
IFR = 0x0000; //清除所有 CPU 中断标志
InitGpio();
InitPieCtrl();
InitPieVectTable();
InitPeripheralClocks();
__ENABLE_INTERRUPTS ();
for (;;){}
//在此处插入 ISR 代码
//接下来的两行仅用于调试,以在此处停止处理器
//插入 ISR 代码后删除
// asm (" ESTOP0");
// for (;;);
}
///-------------------------------------------------------
//示例:InitFlash_BANK1
///-------------------------------------------------------
//此函数初始化组1的闪存控制寄存器
静态空 InitFlash_BANK0 (空)
{
EALLOW;
//将 VREADST 设置为的正确值
//闪存组以正确加电
//这设置组加电延迟
Flash0CtrlRegs.FBAC.bit.VREADST = 0x14;
//复位组和泵处于睡眠状态
//A 闪存访问将自动为存储块和泵加电
//闪存访问后、组和泵进入低功耗模式(可在 FBFALBACK/FPAC1寄存器中配置)-
//如果没有进一步的闪存访问
//加电闪存组和泵,这也将闪存和泵的回退模式设置为激活
Flash0CtrlRegs.FPAC1.bit.PMPPWR = 0x1;
Flash0CtrlRegs.FBFALBACk.bit.BNKPWR0 = 0x3;
//在更改等待状态之前禁用缓存和预取机制
Flash0CtrlRegs.FRD_INTF_CTRL.bit.data_cache_EN = 0;
Flash0CtrlRegs.FRD_INTF_CTRL.bit.prefet_EN = 0;
//根据频率设置等待状态
// 注意
//闪存操作所需的最小等待状态
//在给定的 CPU 速率下、必须由 TI 表征。
//有关最新信息,请参阅数据表。
// #if CPU_FRQ_200MHz
// Flash0CtrlRegs.FRDCNTL.bit.RWAIT = 0x3;
// #endif
//
// #if CPU_FRQ_150MHz
// Flash0CtrlRegs.FRDCNTL.bit.RWAIT = 0x2;
// #endif
//
// #if CPU_FRQ_120MHz
// Flash0CtrlRegs.FRDCNTL.bit.RWAIT = 0x2;
// #endif
Flash0CtrlRegs.FRDCNTL.bit.RWAIT = 0x3;
//启用缓存和预取机制以提高性能
/从闪存执行的代码。
Flash0CtrlRegs.FRD_INTF_CTRL.bit.data_cache_EN = 1;
Flash0CtrlRegs.FRD_INTF_CTRL.bit.prefet_EN = 1;
//复位时启用 ECC
//如果应用软件禁用了 ECC,并且应用程序再次希望启用 ECC
Flash0EccRegs.ecc_enable.bit.enable = 0xA;
EDIS;
//强制流水线清空以确保写入
//返回前发生最后配置的寄存器。
_asm (" RPT #7 || NOP");
}
///-------------------------------------------------------
//示例:InitFlash_BANK1
///-------------------------------------------------------
//此函数初始化组1的闪存控制寄存器
静态空 InitFlash_BANK1 (空)
{
EALLOW;
//将 VREADST 设置为的正确值
//闪存组以正确加电
//这设置组加电延迟
Flash1CtrlRegs.FBAC.bit.VREADST = 0x14;
//复位组和泵处于睡眠状态
//A 闪存访问将自动为存储块和泵加电
//闪存访问后、组和泵进入低功耗模式(可在 FBFALBACK/FPAC1寄存器中配置)-
//如果没有进一步的闪存访问
//加电闪存组和泵,这也将闪存和泵的回退模式设置为激活
Flash1CtrlRegs.FPAC1.bit.PMPPWR = 0x1;
Flash1CtrlRegs.FBFALBACk.bit.BNKPWR0 = 0x3;
//在更改等待状态之前禁用缓存和预取机制
Flash1CtrlRegs.FRD_INTF_CTRL.bit.data_cache_EN = 0;
Flash1CtrlRegs.FRD_INTF_CTRL.bit.prefet_EN = 0;
//根据频率设置等待状态
// 注意
//闪存操作所需的最小等待状态
//在给定的 CPU 速率下、必须由 TI 表征。
//有关最新信息,请参阅数据表。
// #if CPU_FRQ_200MHz
Flash1CtrlRegs.FRDCNTL.bit.RWAIT = 0x3;
// #endif
// #if CPU_FRQ_150MHz
// Flash1CtrlRegs.FRDCNTL.bit.RWAIT = 0x2;
// #endif
// #if CPU_FRQ_120MHz
// Flash1CtrlRegs.FRDCNTL.bit.RWAIT = 0x2;
// #endif
//启用缓存和预取机制以提高性能
/从闪存执行的代码。
Flash1CtrlRegs.FRD_INTF_CTRL.bit.data_cache_EN = 1;
Flash1CtrlRegs.FRD_INTF_CTRL.bit.prefet_EN = 1;
//复位时启用 ECC
//如果应用软件禁用了 ECC,并且应用程序再次希望启用 ECC
Flash1EccRegs.ecc_enable.bit.enable = 0xA;
EDIS;
//强制流水线清空以确保写入
//返回前发生最后配置的寄存器。
_asm (" RPT #7 || NOP");
}
///-------------------------------------------------------
//示例:InitPll:
///-------------------------------------------------------
//此函数用于初始化 PLL 寄存器。
//
//注意:如果是、内部振荡器不能用作 PLL 源
// PLLSYSCLK 配置为高于194MHz 的频率。
静态空 InitSysPll (uint16 clock_source、uint16 imult、uint16 fmult、uint16 divsel)
{
if ((clock_source =ClkCfgRegs.CLKSRCCTL1.bit.OSCCLKSRCSEL) &&
(imult =ClkCfgRegs.SYSPLLMULT.bit.IMULT) &&
(fmult =ClkCfgRegs.SYSPLLMULT.bit.FMULT) &&
(divsel =ClkCfgRegs.SYSCLKDIVSEL.bit.PLLSYSCLKDIV)
{
//所有内容均按要求设置,因此只需返回即可
返回;
}
if (clock_source!= ClkCfgRegs.CLKSRCCTL1.bit.OSCCLKSRCSEL)
{
开关(时钟源)
{
案例 INT_OSC1:
SysIntOsc1Sel();
中断;
案例 INT_OSC2:
SysIntOsc2Sel();
中断;
XTAL_OSC 案例:
SysXTalOscSel();
中断;
}
}
EALLOW;
//首先修改 PLL 乘法器
if (imult!= ClkCfgRegs.SYSPLLMULT.bit.IMULT || fmult!= ClkCfgRegs.SYSPLLMULT.bit.FULT)
{
//绕过 PLL 并将分频器设置为/1
ClkCfgRegs.SYSPLLCTL1.bit.PLLCLKEN = 0;
ClkCfgRegs.SYSCLKDIVSEL.bit.PLLSYSCLKDIV = 0;
//对 PLL 乘法器进行编程
uint32 temp_syspllmult = ClkCfgRegs.SYSPLLULT.ALL;
ClkCfgRegs.SYSPLLMULT.ALL =(temp_syspllmull &~(0x37FU))|
((fmult <<8U)| imult);
ClkCfgRegs.SYSPLLCTL1.bit.PLLEN = 1; //启用 SYSPLL
//等待 SYSPLL 锁定
while (ClkCfgRegs.SYSPLLSTS.bit.lock!= 1)
{
//取消注释以处理看门狗
// ServiceDoG();
}
//再次写入乘法器以确保正确的 PLL 初始化
//这将强制 PLL 再次锁定
ClkCfgRegs.SYSPLLMULT.bit.IMULT = imult; //设置整数乘法器
//等待 SYSPLL 重新锁定
while (ClkCfgRegs.SYSPLLSTS.bit.lock!= 1)
{
//取消注释以处理看门狗
// ServiceDoG();
}
}
//设置分频器以产生较慢的输出频率以限制电流增加
if (divsel!= PLLCLK_by_126)
{
ClkCfgRegs.SYSCLKDIVSEL.bit.PLLSYSCLKDIV = DIDSEL + 1;
}否则
{
ClkCfgRegs.SYSCLKDIVSEL.bit.PLLSYSCLKDIV = DIFFEL;
}
//使能 PLLSYSCLK 由系统 PLL 时钟馈送
ClkCfgRegs.SYSPLLCTL1.bit.PLLCLKEN = 1;
//小的100周期延迟
asm (" RPT #100 || NOP");
//将分频器设置为用户值
ClkCfgRegs.SYSCLKDIVSEL.bit.PLLSYSCLKDIV = DIFFEL;
EDIS;
}
///-------------------------------------------------------
//示例:SysIntOsc1Sel:
///-------------------------------------------------------
//此函数切换到内部振荡器1并关闭所有其他时钟
//源以最大程度地降低功耗
静态空 SysIntOsc1Sel (空){
EALLOW;
ClkCfgRegs.CLKSRCCTL1.bit.OSCCLKSRCSEL = 2;// Clk src = INTOSC1
EDIS;
}
///-------------------------------------------------------
//示例:SysIntOsc2Sel:
///-------------------------------------------------------
//此函数从外部振荡器切换到内部振荡器2
//并关闭所有其他时钟源以最大限度地降低功耗
//注意:如果没有外部时钟连接,则在切换时使用
// 必须先关闭 INTOSC1到 INTOSC2、EXTOSC 和 XLCKIN
// 切换到内部振荡器1
静态空 SysIntOsc2Sel (空){
EALLOW;
ClkCfgRegs.CLKSRCCTL1.bit.INTOSC2OFF=0; //打开 INTOSC2
ClkCfgRegs.CLKSRCCTL1.bit.OSCCLKSRCSEL = 0;// Clk src = INTOSC2
EDIS;
}
///-------------------------------------------------------
//示例:SysX 振荡器:
///-------------------------------------------------------
//此函数切换到外部晶体振荡器并关闭所有其他时钟
//源以最大程度地降低功耗。 此选项可能并非全部可用
//器件封装
静态空 SysXTalOscSel (空) {
EALLOW;
ClkCfgRegs.CLKSRCCTL1.bit.XTALOFF=0; //打开 XTALOSC
ClkCfgRegs.CLKSRCCTL1.bit.OSCCLKSRCSEL = 1;// Clk src = XTAL
EDIS;
}
///-------------------------------------------------------
// InitPeripheralClocks
///-------------------------------------------------------
//此函数初始化外设的时钟。
//
//注意:为了降低功耗,请关闭到任何的时钟
//未为您的器件型号指定或未在中使用的外设
//应用
静态空 InitPeripheralClocks()
{
EALLOW;
CpuSysRegs.PCLKCR0.bit.CLA1 = 1;
CpuSysRegs.PCLKCR0.bit.DMA = 1;
CpuSysRegs.PCLKCR0.bit.CPUTIME0 = 1;
CpuSysRegs.PCLKCR0.bit.CPUTIME1 = 1;
CpuSysRegs.PCLKCR0.bit.CPUTIME2 = 1;
CpuSysRegs.PCLKCR0.bit.HRPWM = 0;
CpuSysRegs.PCLKCR0.bit.TBCLKSYNC=0;
CpuSysRegs.PCLKCR1.bit.EMIF1 = 0;
CpuSysRegs.PCLKCR1.bit.EMIF2=0;
CpuSysRegs.PCLKCR2.bit.EPWM1 = 0;
CpuSysRegs.PCLKCR2.bit.EPWM2 = 0;
CpuSysRegs.PCLKCR2.bit.EPWM3 = 0;
CpuSysRegs.PCLKCR2.bit.EPWM4=0;
CpuSysRegs.PCLKCR2.bit.EPWM5=0;
CpuSysRegs.PCLKCR2.bit.EPWM6=0;
CpuSysRegs.PCLKCR2.bit.EPWM7=0;
CpuSysRegs.PCLKCR2.bit.EPWM8=0;
CpuSysRegs.PCLKCR2.bit.EPWM9=0;
CpuSysRegs.PCLKCR2.bit.EPWM10=0;
CpuSysRegs.PCLKCR2.bit.EPWM11 = 0;
CpuSysRegs.PCLKCR2.bit.EPWM12 = 0;
CpuSysRegs.PCLKCR3.bit.ECAP1 = 0;
CpuSysRegs.PCLKCR3.bit.ECAP2 = 0;
CpuSysRegs.PCLKCR3.bit.ECAP3 = 0;
CpuSysRegs.PCLKCR3.bit.ECAP4 = 0;
CpuSysRegs.PCLKCR3.bit.ECAP5 = 0;
CpuSysRegs.PCLKCR3.bit.ECAP6 = 0;
CpuSysRegs.PCLKCR4.bit.EQEP1 = 0;
CpuSysRegs.PCLKCR4.bit.EQEP2 = 0;
CpuSysRegs.PCLKCR4.bit.EQEP3 = 0;
CpuSysRegs.PCLKCR6.bit.SD1 = 0;
CpuSysRegs.PCLKCR6.bit.SD2 = 0;
CpuSysRegs.PCLKCR7.bit.SCI_A = 1;
CpuSysRegs.PCLKCR7.bit.SCI_B = 0;
CpuSysRegs.PCLKCR7.bit.SCI_C = 0;
CpuSysRegs.PCLKCR7.bit.SCI_D = 0;
CpuSysRegs.PCLKCR8.bit.SPI_A = 0;
CpuSysRegs.PCLKCR8.bit.SPI_B = 0;
CpuSysRegs.PCLKCR8.bit.SPI_C = 0;
CpuSysRegs.PCLKCR9.bit.I2C_A = 0;
CpuSysRegs.PCLKCR9.bit.I2C_B = 0;
CpuSysRegs.PCLKCR10.bit.CAN_A = 0;
CpuSysRegs.PCLKCR10.bit.CAN_B = 0;
CpuSysRegs.PCLKCR11.bit.McBSP_A = 0;
CpuSysRegs.PCLKCR11.bit.McBSP_B = 0;
CpuSysRegs.PCLKCR11.bit.USB_A = 0;
CpuSysRegs.PCLKCR12.bit.uPP_A = 0;
CpuSysRegs.PCLKCR13.bit.ADC_A = 0;
CpuSysRegs.PCLKCR13.bit.ADC_B = 0;
CpuSysRegs.PCLKCR13.bit.ADC_C = 0;
CpuSysRegs.PCLKCR13.bit.ADC_D = 0;
CpuSysRegs.PCLKCR14.bit.CMPSS1 = 0;
CpuSysRegs.PCLKCR14.bit.CMPSS2 = 0;
CpuSysRegs.PCLKCR14.bit.CMPSS3 = 0;
CpuSysRegs.PCLKCR14.bit.CMPSS4 = 0;
CpuSysRegs.PCLKCR14.bit.CMPSS5 = 0;
CpuSysRegs.PCLKCR14.bit.CMPSS6 = 0;
CpuSysRegs.PCLKCR14.bit.CMPSS7 = 0;
CpuSysRegs.PCLKCR14.bit.CMPSS8 = 0;
CpuSysRegs.PCLKCR16.bit.DAC_A = 0;
CpuSysRegs.PCLKCR16.bit.DAC_B = 0;
CpuSysRegs.PCLKCR16.bit.DAC_C = 0;
EDIS;
}
//用于 GPIO 配置的低级函数
//将所有引脚在输入模式中复用为 GPIO 且启用上拉电阻。
//还禁用漏极开路和极性反转并设置限定条件
//同步。 同时解锁所有 GPIO
静态空 InitGpio()
{
易失性 uint32 *gpioBaseAddr;
uint16 regOffset;
//禁用引脚锁定
EALLOW;
GpioCtrlRegs.GPALOCK.ALL = 0x00000000;
GpioCtrlRegs.GPBLOCK.ALL = 0x00000000;
GpioCtrlRegs.GPCLOCK.ALL = 0x00000000;
GpioCtrlRegs.GPDLOCK.ALL = 0x00000000;
GpioCtrlRegs.GPELOCK.ALL = 0x00000000;
GpioCtrlRegs.GPFLOCK.ALL = 0x00000000;
//用零填充所有寄存器。 分别写入每个寄存器
//对于六个 GPIO 模块,此函数*非常*长。 幸运的是、
//我们无论如何都要用零来写它们,这样可以节省很多空间。//あとで
gpioBaseAddr =(uint32 *) GpioCtrlRegs;
对于(regOffset = 0;regOffset < sizeof (GpioCtrlRegs)/2;regOffset++)
{
//Hack、以避免在所有引脚上启用上拉。 GPyPUD 偏移量
//0x0C 位于每个0x40字的寄存器组中。 因为这是 A
//32位指针、地址必须除以2。
if (regOffset %(0x40/2)!=(0x0C/2))
gpioBaseAddr[regOffset]= 0x00000000;
}
gpioBaseAddr =(uint32 *) GpioDataRegs;
对于(regOffset = 0;regOffset < sizeof (GpioDataRegs)/2;regOffset++)
{
gpioBaseAddr[regOffset]= 0x00000000;
}
EDIS;
}
///-------------------------------------------------------
// InitPieCtrl:
///-------------------------------------------------------
//此函数将 PIE 控制寄存器初始化为已知状态。
//
静态空 InitPieCtrl (空)
{
//在 CPU 级别禁用中断:
Dint;
//禁用 PIE
PieCtrlRegs.PIECTRL.bit.ENPIE = 0;
//清除所有 PIEIER 寄存器:
PieCtrlRegs.PIEIER1.ALL = 0;
PieCtrlRegs.PIEIER2.ALL = 0;
PieCtrlRegs.PIEIER3.ALL = 0;
PieCtrlRegs.PIEIER4.ALL = 0;
PieCtrlRegs.PIEIER5.ALL = 0;
PieCtrlRegs.PIEIER6.ALL = 0;
PieCtrlRegs.PIEIER7.ALL = 0;
PieCtrlRegs.PIEIER8.ALL = 0;
PieCtrlRegs.PIEIER9.ALL = 0;
PieCtrlRegs.PIEIER10.ALL = 0;
PieCtrlRegs.PIEIER11.all = 0;
PieCtrlRegs.PIEIER12.ALL = 0;
//清除所有 PIEIFR 寄存器:
PieCtrlRegs.PIEIFR1.ALL = 0;
PieCtrlRegs.PIEIFR2.ALL = 0;
PieCtrlRegs.PIEIFR3.ALL = 0;
PieCtrlRegs.PIEIFR4.ALL = 0;
PieCtrlRegs.PIEIFR5.ALL = 0;
PieCtrlRegs.PIEIFR6.ALL = 0;
PieCtrlRegs.PIEIFR7.ALL = 0;
PieCtrlRegs.PIEIFR8.ALL = 0;
PieCtrlRegs.PIEIFR9.ALL = 0;
PieCtrlRegs.PIEIFR10.ALL = 0;
PieCtrlRegs.PIEIFR11.all = 0;
PieCtrlRegs.PIEIFR12.ALL = 0;
}
静态空 InitPieVectTable (空)
{
Int16 I;
uint32源=(uint32) isr_illegal;
uint32 * dest =(void *) PieVectTable (PieVectTable);
EALLOW;
对于(i=0;i < 224;i++)
*Dest++=源;
EDIS;
//启用 PIE 矢量表
PieCtrlRegs.PIECTRL.bit.ENPIE = 1;
}
///-------------------------------------------------------
//示例:DisableDog:
///-------------------------------------------------------
//此函数禁用看门狗计时器。
静态空 DisableDog (空)
{
易失性 uint16温度;
EALLOW;
//获取时钟配置,以便我们不会对其进行锁定
temp = WdRegs.WDCR.ALL & 0x0007;
WdRegs.WDCR.ALL = 0x0068 | temp;
EDIS;
}
//此函数将从复制指定的存储器内容
//一个位置到另一个位置。
//
// uint16 *SourceAddr 指向要移动的第一个字的指针
// SourceAddr < SourceEndAddr
// uint16* SourceEndAddr 指向要移动的最后一个字的指针
// uint16* DestAddr 指向第一个目标字的指针
//
//不会对无效的内存位置或进行检查
//结束地址为>,然后是第一个起始地址。
静态空 Memcopy (uint16* DestAddr、uint16* SourceAddr、uint32 size)
{
while (size!= 0)
{
*DestAddr++=*SourceAddr++;
大小--;
}
返回;
}
//============================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================
//文件结束。
//============================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================
然后、ePWM2的 GLDCNT 和 ePWM3的 GLDCNT 以相同的方式变化。
当 GLDCNT 从 2变为0时、EPWM2始终重新加载寄存器。
但是、当 GLDCNT 2首次变为0、GLDCNT 在第二次及后续操作中变为1至2时、EPWM3会重新加载寄存器
当 ePWM1的第一个脉冲发生时捕获此图像。
请告诉我、感谢您对我的英语不好的耐心倾听。
Kengo、
感谢您的示例。 我已经离开办公室、正在努力让这项工作现在开始。
我假设您将所有变量全局初始化为0?
此致、
Kris
您好 Kengo、
您能告诉我您引用的 InitSystem 函数来自哪里吗? 这是您编写的函数还是来自 TI 示例的函数? 我再次检查了 controlSUITE、找不到它。
此致、
Kris