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.

[参考译文] ePWM 全局加载功能(TMS320F28377D)

Guru**** 2020320 points
Other Parts Discussed in Thread: TMS320F28377S, CONTROLSUITE
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/569119/epwm-global-load-function-tms320f28377d

Thread 中讨论的其他器件:TMS320F28377ScontrolSUITE

我正在使用 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、

    我现在正在调查您的问题、今天稍后将为您提供答复。

    谢谢、
    Kris
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的 Kris Parrent
    感谢您的回复和调查。
    这个问题是什么? 如果良好、请告诉我。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Kengo、

    很抱歉耽误你的时间。 我正在浏览您发布的所有代码、以查看问题所在。

    需要说明的是、在初始启用 TBCLKSYNC 后、该操作是否按预期工作? TBCLKSYNC 将时钟门控到 TBCTR、因此我怀疑在您的配置中、GLDCNT 在 TBCTR = 0时增加、您实际上可能会在该时钟最初启动时收到 TBCTR = 0事件。 我仍在调查您帖子的其他部分。

    此致、
    Kris
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的 Kris Parrent:
    在 TBCLKSYNC 初始启用后、该操作按我的预期工作。
    如果您先解压{F28x_usDelay (((UINT32)(5 * 40L)- 2);}、则可以在初始启用 TBCLKSYNC 后看到 PWM2、3的 GLDCNT 的变化

    InitSystem();
    InitPWM (100、10、10、1、1、0);
    __ENABLE_INTERRUPTS ();
    EALLOW;
    F28x_usDelay ((uint32)(5 * 40L)- 2);←此

    当时钟最初启动时、EPWM2的 GLDCNT 等于 EPWM3的 GLDCNT、因此我认为我的配置在 TBCTR = 0时 GLDCNT 增加不会产生 TBCTR = 0事件。

    感谢您的调查和回复。

    此致、
    Kengo
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Kengo、

    我无法复制此行为。 您能否尝试创建一个显示此行为的小示例? 我认为发布的大多数代码不适用于此问题、这使得问题难以解决。

    谢谢、
    Kris
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的 Kris Parrent:
    感谢您的调查。我将尝试创建一个小示例。
    您会告诉我该代码在您的计算机上的行为是怎样的?
    此致、
    Kengo
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的 Kris Parrent:
    很抱歉耽误你的回答。
    下面是一个小示例。

    #pragma中断(Phase_Duty)

    void Phase_Duty (void)/* InterruptFunction (PWM2)更改 PWM2的占空比*/

    PieCtrlRegs.PIEACX.ALL = 0xFFFFFFU;

    if (cnt_int == 0U)

    SetPhase_Duty_PWM (0.9);
    CNT_int = 1U;

    否则、如果(cnt_int == 1U)

    SetPhase_Duty_PWM (-0.9);
    CNT_int = 0U;



    EPwm2Regs.ETCLR.ALL=0x1U;


    UINT16 SetPhase_Duty_PWM (float32 Duty_P)

    uint16 ret = 0U;
    if (Duty_P > 1 || Duty_P <-1)
    {ret = 1U;}
    其他

    uint32峰值= 0UL;
    uint16 DutyIntPP = 0U;
    峰值=(EPwm1Regs.TBPRD + 1UL);
    DutyIntPP =(uint16)((Duty_P + 1.0F)* Peak * 0.5 - 1U);
    EPwm2Regs.CMPA.bit.CMPA = DutyIntPP;
    RET = 0U;

    回程;


    int main (空)

    _disable_interrupts ();
    InitSystem();//////////////////////////////////////////////////////////////////////////////////////////////////////// *此函数没有变化*//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    InitPWM ();////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// *变得简单*//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    __ENABLE_INTERRUPTS ();
    EALLOW;
    GpioCtrlRegs.GPADIR.bit.GPIO10= 1U;
    GpioDataRegs.GPASET.bit.GPIO10 = 1UL;
    CNT1 = EPwm1Regs.TBCTR;
    GCNT1 = EPwm2Regs.GLDCTL.bit.GLDCNT;
    GpioDataRegs.GPACLEAR.bit.GPIO10 = 1UL;

    EDIS;

    F28x_usDelay ((uint32)(5 * 40L)- 2);

    EALLOW;
    GpioDataRegs.GPASET.bit.GPIO10 = 1UL;
    CNT2 = EPwm2Regs.TBCTR;
    GCNT2 = EPwm2Regs.GLDCTL.bit.GLDCNT;
    GpioDataRegs.GPACLEAR.bit.GPIO10 = 1UL;
    EDIS;
    F28x_usDelay ((uint32)(5 * 40L)- 2);
    EALLOW;
    GpioDataRegs.GPASET.bit.GPIO10 = 1UL;
    CNT3 = EPwm2Regs.TBCTR;
    GCNT3 = EPwm2Regs.GLDCTL.bit.GLDCNT;
    GpioDataRegs.GPACLEAR.bit.GPIO10 = 1UL;
    EDIS;
    F28x_usDelay ((uint32)(5 * 40L)- 2);
    EALLOW;
    GpioDataRegs.GPASET.bit.GPIO10 = 1UL;
    CNT4 = EPwm2Regs.TBCTR;
    GCNT4 = EPwm2Regs.GLDCTL.bit.GLDCNT;
    GpioDataRegs.GPACLEAR.bit.GPIO10 = 1UL;
    EDIS;
    F28x_usDelay ((uint32)(5 * 40L)- 2);
    EALLOW;
    GpioDataRegs.GPASET.bit.GPIO10 = 1UL;
    CNT5 = EPwm2Regs.TBCTR;
    GCNT5 = EPwm2Regs.GLDCTL.bit.GLDCNT;
    GpioDataRegs.GPACLEAR.bit.GPIO10 = 1UL;
    EDIS;
    F28x_usDelay ((uint32)(5 * 40L)- 2);
    EALLOW;
    GpioDataRegs.GPASET.bit.GPIO10 = 1UL;
    CNT6 = EPwm2Regs.TBCTR;
    GCNT6 = EPwm2Regs.GLDCTL.bit.GLDCNT;
    GpioDataRegs.GPACLEAR.bit.GPIO10 = 1UL;
    EDIS;
    F28x_usDelay ((uint32)(5 * 40L)- 2);
    EALLOW;
    GpioDataRegs.GPASET.bit.GPIO10 = 1UL;
    CNT7 = EPwm2Regs.TBCTR;
    GCNT7 = EPwm2Regs.GLDCTL.bit.GLDCNT;
    GpioDataRegs.GPACLEAR.bit.GPIO10 = 1UL;
    EDIS;
    F28x_usDelay ((uint32)(5 * 40L)- 2);
    EALLOW;
    GpioDataRegs.GPASET.bit.GPIO10 = 1UL;
    CNT8 = EPwm2Regs.TBCTR;
    GCNT8 = EPwm2Regs.GLDCTL.bit.GLDCNT;
    GpioDataRegs.GPACLEAR.bit.GPIO10 = 1UL;
    EDIS;
    F28x_usDelay ((uint32)(5 * 40L)- 2);
    EALLOW;
    GpioDataRegs.GPASET.bit.GPIO10 = 1UL;
    CNT9 = EPwm2Regs.TBCTR;
    GCNT9 = EPwm2Regs.GLDCTL.bit.GLDCNT;
    GpioDataRegs.GPACLEAR.bit.GPIO10 = 1UL;
    EDIS;
    F28x_usDelay ((uint32)(5 * 40L)- 2);
    EALLOW;
    GpioDataRegs.GPASET.bit.GPIO10 = 1UL;
    CNT10 = EPwm2Regs.TBCTR;
    GCNT10 = EPwm2Regs.GLDCTL.bit.GLDCNT;
    GpioDataRegs.GPACLEAR.bit.GPIO10 = 1UL;
    EDIS;
    F28x_usDelay ((uint32)(5 * 40L)- 2);
    EALLOW;
    GpioDataRegs.GPASET.bit.GPIO10 = 1UL;
    CNT11 = EPwm2Regs.TBCTR;
    GCNT11 = EPwm2Regs.GLDCTL.bit.GLDCNT;
    GpioDataRegs.GPACLEAR.bit.GPIO10 = 1UL;
    EDIS;
    F28x_usDelay ((uint32)(5 * 40L)- 2);
    EALLOW;
    GpioDataRegs.GPASET.bit.GPIO10 = 1UL;
    CNT12 = EPwm2Regs.TBCTR;
    GCNT12 = EPwm2Regs.GLDCTL.bit.GLDCNT;
    GpioDataRegs.GPACLEAR.bit.GPIO10 = 1UL;
    EDIS;
    F28x_usDelay ((uint32)(5 * 40L)- 2);
    EALLOW;
    GpioDataRegs.GPASET.bit.GPIO10 = 1UL;
    CNT13 = EPwm2Regs.TBCTR;
    GCNT13 = EPwm2Regs.GLDCTL.bit.GLDCNT;
    GpioDataRegs.GPACLEAR.bit.GPIO10 = 1UL;
    EDIS;

    while (1)
    {}
    返回0;



    空InitPWM (空)


    /*时钟打开*/
    EALLOW;
    CpuSysRegs.PCLKCR2.bit.EPWM1= 0x1U;
    CpuSysRegs.PCLKCR2.bit.EPWM2= 0x1U;
    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;
    EALLOW;
    /*初始化 GPIO */
    GpioCtrlRegs.GPAMUX1.bit.GPIO0= 0U;
    GpioCtrlRegs.GPAGMUX1.bit.GPIO0 = 0U;
    GpioCtrlRegs.GPADIR.bit.GPIO0= 0U;
    GpioCtrlRegs.GPAMUX1.bit.GPIO1= 0U;
    GpioCtrlRegs.GPAGMUX1.bit.GPIO1 = 0U;
    GpioCtrlRegs.GPADIR.bit.GPIO1= 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.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.GPIO0= 1U;
    GpioCtrlRegs.GPAGMUX1.bit.GPIO0 = 0U;
    GpioCtrlRegs.GPADIR.bit.GPIO0= 1U;
    GpioCtrlRegs.GPAMUX1.bit.GPIO1= 1U;
    GpioCtrlRegs.GPAGMUX1.bit.GPIO1 = 0U;
    GpioCtrlRegs.GPADIR.bit.GPIO1= 1U;
    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /*配置全局加载功能*/
    EPwm2Regs.GLDCTL.ALL = 0x0181U;
    EPwm2Regs.GLDCFG.ALL = 0x0002U;
    EPwm1Regs.GLDCTL.ALL = 0x0183U;
    EPwm1Regs.GLDCFG.ALL = 0x0000U;
    EDIS;
    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /*配置 PWM2 */
    EPwm2Regs.TBCTL.ALL= 0x8003U;
    EPwm2Regs.PCCTL.ALL= 0x0U;
    EPwm2Regs.TBPRD= 999UL;
    EPwm2Regs.AQCTLA.ALL= 0x0012U;
    EPwm2Regs.AQSFRC.ALL= 0U;
    EPwm2Regs.AQCSFRC.ALL= 0U;
    EPwm2Regs.CMPA.bit.CMPA= 499UL;
    EPwm2Regs.CMPB.bit.CMPB= 1UL;
    EPwm2Regs.CMPC = 750U;
    EPwm2Regs.CMPD = 499UL;
    EPwm2Regs.CMPCTL.bit.SHDWAMODE= 0U;/* CMPAShadow*/
    EPwm2Regs.CMPCTL.bit.SHDWBMODE= 0U;/* CMPBShading*/
    EPwm2Regs.CMPCTL2.bit.SHDWCMODE= 0U;/* CMPCShading*/
    EPwm2Regs.CMPCTL2.bit.SHDWDMODE= 0U;/* CMPDShading*/
    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;
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /*配置 PWM1 */
    EPwm1Regs.TBCTL.ALL= 0x8003U;
    EPwm1Regs.PCCTL.ALL= 0x0U;
    EPwm1Regs.TBPRD= 999UL;
    EPwm1Regs.AQCTLA.ALL= 0x0012U;
    EPwm1Regs.AQSFRC.ALL= 0U;
    EPwm1Regs.AQCSFRC.ALL= 0U;
    EPwm1Regs.CMPA.bit.CMPA= 499UL;
    EPwm1Regs.CMPCTL.bit.SHDWAMODE= 0U;/* CMPAShading*/
    EPwm1Regs.CMPCTL.bit.SHDWBMODE= 0U;/* CMPBShading*/
    EPwm1Regs.CMPCTL2.bit.SHDWCMODE= 0U;/* CMPCShading*/
    EPwm1Regs.CMPCTL2.bit.SHDWDMODE= 0U;/* CMPDShading*/
    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;
    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////


    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;
    EDIS;

    /*中断处理(PWM2)的设置*/
    EPwm2Regs.ETSEL.bit.INTSEL= 4U;
    EPwm2Regs.ETSEL.bit.INTSELCMP = 1U;
    EPwm2Regs.ETPS.BIT.INTPSSEL= 0U;
    EPwm2Regs.ETPS.bit.INTPRD= 3U;
    EALLOW;
    PieVectTable.EPWM2_INT=Phase_Duty;
    EDIS;
    EPwm2Regs.ETSEL.bit.INTEN=1U;
    PieCtrlRegs.PIEIER3.ALL |=(2U);
    IER|=0x0004U;
    EALLOW;

    GCNT0 = EPwm2Regs.GLDCTL.bit.GLDCNT;
    EPwm1Regs.TBCTL.bit.CTRMODE= 0U;
    EPwm2Regs.TBCTL.bit.CTRMODE= 0U;
    CpuSysRegs.PCLKCR0.bit.TBCLKSYNC= 0x1U;//开始时基计数器*/
    EDIS;


    CNT0 = EPwm2Regs.TBCTR;



    当 PWM2'GLDCNT 从2变为0时、PWM2的波形首先出现。
    但当 PWM2'GLDCNT 从1变为2时、PWM2的占空比从50%变为95%。(通过检查 GCNT8和 GCNT9可以看到这种现象)

    此致、
    Kengo
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Kengo、

    感谢您的示例。 我已经离开办公室、正在努力让这项工作现在开始。

    我假设您将所有变量全局初始化为0?

    此致、
    Kris

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Kengo、

    您能告诉我您引用的 InitSystem 函数来自哪里吗? 这是您编写的函数还是来自 TI 示例的函数? 我再次检查了 controlSUITE、找不到它。

    此致、
    Kris

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的 Kris:

    1 "我假设您正在将所有变量全局初始化为0?" 是的,这是对的。 很抱歉、我的描述很笨拙。

    2 "您能告诉我您引用的 InitSystem 函数来自哪里吗?"

    请查看以下代码。 这是我从 TI 示例中编写的代码。

    ----------------------------------------------------------------------
    空 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)&&
    (多 =ClkCfgRegs.SYSPLLMULT.bit.IMULT) &&
    (多尔 =ClkCfgRegs.SYSPLLMULT.bit.FMULT) &&
    (DIMSEL =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; //打开 XTALSC
    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++;
    大小--;

    返回;