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.
工具/软件:Code Composer Studio
大家好,
我使用的 是LAUNCHTXL-2.8377万S开发板。 我所面临的问题是,在创建了我的项目并链接了来自控制套件的所有支持文件之后。 项目中没有错误,我可以启动 代码,但它没有出现
while (ClkCfgRegs.SYSPLLSTS.bit.locks!= 1)
在下述方案中
void InitSysPll (UINT16 Clock_source,UINT16 imult,UINT16 fmult,UINT16 divsel)
{
UINT16 SCSR,WDCR,WDWCR,intStatus;
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:
SysIntOscar 1Sel();
中断;
案例INT_OSC2:
SysIntOscar 2Sel();
中断;
案例XTAL_OSC:
SysXtalssiosel ();
中断;
}
}
EALLOW;
IF(imult != ClkCfgRegs.SYSPLLMULT.bit.IMULT ||
fmult != ClkCfgRegs.SYSPLLMULT.bit.FMULT)
{
UINT16 I;
//
//此位只能由POR重置
//
IF (DevCfgRegs.SYSDBGCTL.bit.bit_0 == 1)
{
//
//用户可以选择在此处插入处理程序代码。 这只会
//如果在系统发生故障后进行了看门狗重置,则执行该操作
// PLL初始化。 有关详细信息,请参阅设备用户指南
//信息。
//
//如果应用程序具有看门狗复位处理程序,则该位应该
//检查以确定是否因为以下原因而重置了看门狗
//。
//
//此处的任何操作都不会继续正常重试PLL。
//
}
//
//绕过PLL并将分禾器设置为/1
//
ClkCfgRegs.SYSPLLCTL1.bit.PLLCLKEN = 0;
ASM (" RPT #20 || NOP");
ClkCfgRegs.SYSCLKDIVSEL.bit.PLLSYSCLKDIV = 0;
//
//锁定PLL五次。 这有助于确保成功启动。
// 5是建议的最小值。 用户可以增加此设置
//数字取决于分配的系统初始化时间。
//
(i = 0;i < 5;I++)
{
//
//关闭PLL
//
ClkCfgRegs.SYSPLLCTL1.bit.PLLEN = 0;
ASM (" RPT #20 || NOP");
//
//写入倍频,自动打开PLL
//
ClkCfgRegs.SYSPLLMULT.ALL =((fmult << 8U)| imult);
//
//等待SYSPLL锁定计数器
//
while (ClkCfgRegs.SYSPLLSTS.bit.locks!= 1)
{
//
//取消注释以服务监视程序
//
// ServiceDog ();
}
}
}
//
//设置分频器以产生较慢的输出频率,从而限制电流增加
//
IF (divsel!= PLLCLK_BY_126)
{
ClkCfgRegs.SYSCLKDIVSEL.bit.PLLSYSCLKDIV = DIVsel + 1;
其他
{
ClkCfgRegs.SYSCLKDIVSEL.bit.PLLSYSCLKDIV = DIVsel;
}
//
//*注意*
//建议使用以下看门狗代码来监控PLL
//启动顺序。 如果您的应用程序已清除监视程序
// SCRS[WDOVERRIDE]位无法完成此操作。 建议不要清除
//此位直到启动PLL之后。
//
//
//备份用户监视器
//
SCSR = WdRegs.SCSR.ALL;
wdcr = WdRegs.wdccr.all;
WDWCR = WdRegs.WDWCR.ALL;
//
//禁用窗口功能,重置计数器
//
EALLOW;
WdRegs.WDWCR.ALL = 0x0;
WdRegs.WDKEY.bit.WDKEY = 0x55;
WdRegs.WDKEY.bit.WDKEY = 0xAA;
//
//禁用全局中断
//
intStatus =__disable_interrupts();
//
//配置看门狗重置并以最大频率运行
//
WdRegs.SCSR.ALL = 0x0;
WdRegs.wdccr.all = 0x28;
//
//此位只能通过加电重置(POR)进行重置,不会被清除
//通过WD重置
//
DevCfgRegs.SYSDBGCTL.bit.bit_0 = 1;
//
//从系统PLL时钟输入启用PLLSYSCLK
//
ClkCfgRegs.SYSPLLCTL1.bit.PLLCLKEN = 1;
//
//延迟以确保系统在清除状态位之前从PLL计时
//
ASM (" RPT #20 || NOP");
//
//清除位
//
DevCfgRegs.SYSDBGCTL.bit.bit_0 = 0;
//
//恢复用户看门狗,首先重置计数器
//
WdRegs.WDKEY.bit.WDKEY = 0x55;
WdRegs.WDKEY.bit.WDKEY = 0xAA;
WDCR || 0x28;//设置WD键位始终为0
WdRegs.wdccr.all = wdcr;
WdRegs.WDWCR.ALL = WDWCR;
WdRegs.SCSR.ALL = SCSR & 0xFFFE;//掩码写入位0 (W1toClr)
//
//恢复ST1[INTM]的状态。 这是由__disable_interrupts()设置的。
//原型。
//
IF (!(intStatus和0x1))
{
EINT;
}
//
//恢复ST1[DBGM]的状态。 这是由__disable_interrupts()设置的。
//原型。
//
IF (!(intStatus和0x2))
{
ASM (" CLRC DBGm");
}
//
// 200 PLLSYSCLK延迟,使电压调节器能够在之前稳定下来
//增加整个系统时钟频率。
//
ASM (" RPT #200 || NOP");
//
//将分隔符设置为用户值
//
ClkCfgRegs.SYSCLKDIVSEL.bit.PLLSYSCLKDIV = DIVsel;
EDIS;
}