请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
器件型号:TMS320F28069M 主题中讨论的其他器件:TMS320F28069
您好!
我将 Tapas 板与 TMS320F28069搭配使用、并尝试使用 code composer studio 在 EPWM5上生成具有固定占空比和死区的互补 PWM。 我的大多数代码都是从示例复制的、并进行了一些调整。 遗憾的是、只要我使用 SysCtrlRegs.PCLKCR1.bit.EPWM5ENCLK = 1、微控制器就会卡住;-如果该行被注释掉、它就会运行无问题。 奇怪的是,它在这条指令之前就被卡住了,并不总是在同一个地方。 我无法确切地知道它在做什么、它似乎在三条指令之间跳跃。
这是我的代码:
/**
* main.c
*/
#include "DSP28x_Project.h"
extern void InitPll (uint16 val、uint16 divsel);
int main (void)
{
EALLOW;
SysCtrlRegs.WDCR= 0x0068;
SysCtrlRegs.CLKCTL.bit.INTOSC1OFF = 0;
SysCtrlRegs.CLKCTL.bit.OSCCLKSRCSEL=0;// Clk src = INTOSC1
SysCtrlRegs.CLKCTL.bit.XCLKINOFF=1; //关闭 XCLKIN
SysCtrlRegs.CLKCTL.bit.XTALOSCOFF=1;//关闭 XTALOSC
SysCtrlRegs.CLKCTL.bit.INTOSC2OFF=1;//关闭 INTOSC2
EDIS;
InitPll (DSP28_PLLCR、DSP28_DIVSEL);
EALLOW;
SysCtrlRegs.LOSPCP。all = 0x0002;
SysCtrlRegs.XCLK.bit.XCLKOUTDIV=2;
SysCtrlRegs.PCLKCR1.bit.EPWM5ENCLK = 1;// ePWM5
SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC=1; //在 ePWM 内启用 TBCLK
EDIS;
EALLOW;
//
//为所选输出引脚禁用内部上拉以降低功耗
//消耗。 用户可启用或禁用上拉电阻。
//这将启用指定引脚的上拉电阻。
//注释掉其他不需要的行。
//
GpioCtrlRegs.GPAPUD.bit.GPIO8 = 1;//禁用 GPIO8上的上拉电阻(EPWM5A)
GpioCtrlRegs.GPAPUD.bit.GPIO9=1;//禁用 GPIO9上的上拉电阻(EPWM5B)
//
//使用 GPIO 寄存器配置 EPWM-5引脚
//这指定哪个可能的 GPIO 引脚将是 EPWM5功能
//引脚。
//注释掉其他不需要的行。
//
GpioCtrlRegs.GPAMUX1.bit.GPIO8=1;//将 GPIO8配置为 EPWM5A
GpioCtrlRegs.GPAMUX1.bit.GPIO9=1;//将 GPIO9配置为 EPWM5B
EDIS;
EALLOW;
SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC=0;
EDIS;
EPwm5Regs.TBPRD = 375;
EPwm5Regs.TBPHS.Half.TBPHS = 0;
EPwm5Regs.TBCTR = 0x0000;
EPwm5Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN;
EPwm5Regs.TBCTL.bit.PHSEN = TB_DISABLE;
EPwm5Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1;
EPwm5Regs.TBCTL.bit.CLKDIV = TB_DIV1;
EPwm5Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW;
EPwm5Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO;//零负载
EPwm5Regs.CMPA.half.CMPA = 200;
EPwm5Regs.AQCTLA.bit.CAU = AQ_SET;
EPwm5Regs.AQCTLA.bit.CAD = AQ_CLEAR;
EPwm5Regs.AQCTLB.bit.CAU = AQ_CLEAR;
EPwm5Regs.AQCTLB.bit.CAD = AQ_SET;
EPwm5Regs.DBCTL.bit.OUT_MODE = DB_FUL_ENABLE;
EPwm5Regs.DBCTL.bit.POLSEL = DB_ACTV_LO;
EPwm5Regs.DBCTL.bit.IN_MODE = DBA_ALL;
EPwm5Regs.DBRED = 20;
EPwm5Regs.DBFED = 20;
EALLOW;
SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC=1;
EDIS;
int test = 0;
while (1)
{
test++;
}
void InitPll (uint16 val、uint16 divsel)
{
易失性 uint16 iVol;
//确保 PLL 没有在跛形模式下运行
if (SysCtrlRegs.PLLSTS.bit.MCLKSTS!= 0)
{
EALLOW;
//检测到 OSCCLKSRC1故障。 PLL 以跛形模式运行。
//重新启用缺少的时钟逻辑。
SysCtrlRegs.PLLSTS.bit.MCLKCLR = 1;
EDIS;
//将此行替换为对相应行的调用
// SystemShutdown();函数。
_asm (" ESTOP0"); //出于调试目的取消注释
}
// DIVSEL 必须为0才能将 PLLCR 从更改为
// 0x0000。 通过外部复位 XRSn 将其设置为0
//这使我们进入1/4
if (SysCtrlRegs.PLLSTS.bit.DIVSEL!= 0)
{
EALLOW;
SysCtrlRegs.PLLSTS.bit.DIVSEL = 0;
EDIS;
}
//
//更改 PLLCR
//
if (SysCtrlRegs.PLLCR.bit.DIV!= val)
{
EALLOW;
//
//在设置 PLLCR 之前关闭缺少的时钟检测逻辑
//
SysCtrlRegs.PLLSTS.bit.MCLKOFF = 1;
SysCtrlRegs.PLLCR.bit.DIV = val;
EDIS;
//
//可选:等待 PLL 锁定。
//在此期间,CPU 将切换到 OSCCLK/2,直到
// PLL 是稳定的。 一旦 PLL 稳定、CPU 将会执行该操作
//切换到新的 PLL 值。
//
//此锁定时间由 PLL 锁定计数器监控。
//
//无需代码来等待 PLL 锁定。
//但是,如果代码执行任何对计时至关重要的操作,
//并要求锁定正确的时钟,则最好锁定
//等待此切换完成。
//
//
//等待 PLL 锁定位被置位。
//
//
//应在该循环之前禁用看门狗,或在其中馈送看门狗
//通过 ServiceDoG()的循环。
//
//
//取消注释以禁用看门狗
//
while (SysCtrlRegs.PLLSTS.bit.PLLLOCKS!= 1)
{
//
//取消注释以处理看门狗
//
//ServiceDoG();
}
EALLOW;
SysCtrlRegs.PLLSTS.bit.MCLKOFF = 0;
EDIS;
}
//
//如果切换到1/2
//
if (((divsel ==1)||(divsel ==2))
{
EALLOW;
SysCtrlRegs.PLLSTS.bit.DIVSEL = DIVsel;
EDIS;
}
//
//如果切换到1/1
//*首先转到1/2并让功率稳定下来
//所需的时间取决于系统,这只是一个示例
//*然后切换到1/1
//
if (divsel == 3)
{
EALLOW;
SysCtrlRegs.PLLSTS.bit.DIVSEL = 2;
DELAY_US (50L);
SysCtrlRegs.PLLSTS.bit.DIVSEL = 3;
EDIS;
}
}