请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
部件号:MSP432P401R 主题中讨论的其他部件: Energia
工具/软件:Code Composer Studio
我目前正在使用MSP432P401R (Rev C -红色版本)。 目前,它设置为一些随机频率,在MCLK上显示5MHz。 我尝试运行一个代码(Jonathan Valvano)从48MHz晶体中获取HFXT。
它涉及使用PCM (电源控制管理)在模式之间切换。
问题:
当我运行代码以切换到48MHz时,调试程序交替地指出这一点:“重置-运行”。 我在MCLK引脚上没有获得所需的48MHz。 我宁愿得到随机变化的数值。
您能告诉我该问题的解决方案吗?
我要附上我提到的代码
#1040UMSP.h"
#define CSCKEY (*(((volatile UINT32_t*)0x4001.04万)#define
CSCTL0 (*(((volatile UINT32_t*)0x400CMC4001.0404万))
#define CSCTLL1 (*(((((#volatile UINT32_INT32_)(#volatile
U))484)0
// Clock_Init48MHz()调用和PCM空闲(预期0)
UINT32_t CPMwait = 0之间的循环; //电源活动模式请求与当前电源模式匹配请求模式(预期为小)
UINT32_t Postwait = 0之间的循环; //当前电源模式匹配请求的模式和PCM模块空闲(预期约为0)
UINT32_t IFlags = 0之间的循环; //如果过渡无效
,则为非零UINT32_t晶体= 0; //在晶体稳定(预期为小)
之前循环void Clock_Init48MHz(void){//
等待Power Control Manager空闲
时(PCMCTL1&0x0000010000){
Prewait = Prewait + 1;
IF (Prewait >= 10万){
返回; //超时错误
}
}//
请求电源活动模式LDO VCORE1以支持48 MHz频率
的PCMCTL0 =(PCMCTL0&~0xFFFF000F)| //清除PCMKEY位字段和AMR位字段
0x695A0000 | //写入正确的PCM密钥以解锁写入访问
0x0.0001万; //请求电源活动模式LDO VCORE1
//检查转换是否无效(参见数据表p344上的图7-3)
IF (PCMIFG&0x0.0004万){
IFlags = PCMIFG; //在活动模式转换上设置的位2无效;位1-0表示与LPM相关的错误;位6表示与DC-DC相关的错误
PCMCLRIFG = 0x0.0004万; //清除过渡无效标志
//要做的事:查看PCMCTL0中的CPM位字段,找出您所处的模式,并逐步浏览图表以过渡到所需的模式
//或懒惰而不执行任何操作;至少在复位后,这应该起作用,但如果调用了Clock_Int32kHz()或Clock_InitLowPower(),它将不起作用
return;
}//
等待CPM (当前电源模式)位字段反映对活动模式LDO VCORE1
的更改,同时((PCMCTL0&0x0.0003万F00)!= 0x0.01万){
CPMwait = CPMwait + 1;
IF (CPMwait >= 50万){
返回; //超时错误
}
}//
等待PCMCIA TL0和时钟系统可写入,方法是等待Power Control Manager空闲
时间(PCMCTL1&0x0.01万){
Postwait = Postwait +1;
IF (Postwait >= 10万){
返回; //超时错误
}
}
//初始化PJ.3和PJ.2并使其成为HFXT (PJ.3内置48 MHz晶振输出;PJ.2内置48 MHz晶振输入)
PJSEL0 |= 0x0C;
PJSEL1 &=~0x0C; //为HFXT操作配置内置48 MHz晶体
// PJDIR |=0x08; // Make PJ.3 HFXTOUT (不必要)
// PJDIR &=~0x04; // Make PJ.2 HFXTIN (不必要)
CSAKEY = 0x695A; //解锁CS模块以进行寄存器访问
CSCTL2 =(CSCTL2 &~0x70万)| //清除HFXTFREQ位字段
0x60万 | //配置为48 MHz外部晶体
0x1万 | // HFXT振荡器驱动选择,用于大于4 MHz的晶体
0x100万; //启用HFXT
CSCTL2 &=~0x200万; //禁用高频晶体旁路
//等待HfXT时钟稳定
(CIFG&0x0.0002万){
CSCLRIFG = 0x0.0002万; //清除HFXT振荡器中断标志
结晶=结晶+ 1;
IF (晶体> 10万){
返回; //超时错误
}
}
CSCTL1 = 0x2000万| //为SMCLK分配器/4配置
0x10万 | //配置HSMCLK分配器/2
0x0.02万 | //配置来自REFOCLK的ACLK
0x0.005万| //配置来自HFXTCLK的SMCLK和HSMCLK
0x0.0005万; //配置来自HFXTCLK
CSKEY = 0的MCLK; //从意外访问锁定CS模块
}
void main(void)
{
WDT_A->CTL = WDT_A_CTL_PW | WDT_A_CTL_HOLD; //停止看门狗计时器
Clock_Init48MHz();
P4SEL0 |= 0x08;
P4SEL1 &=~0x08;
P4DIR |= 0x08;
while }(1))
至。
