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.

[参考译文] CCS/MSP432P401R:切换到48MHz HFXT问题

Guru**** 2587345 points
Other Parts Discussed in Thread: ENERGIA

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/618298/ccs-msp432p401r-switching-to-48mhz-hfxt-issues

部件号: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))

至。

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

    //您的问题似乎很复杂,这就是我在触摸屏演示中要做的所有事情:
    //我也看不到RAM的任何等待状态。

    void clockInit (void) { /* 2个闪存等待状态,VCORE =1,正在关闭直流-直流,48 MHz */ Flashctl_setWaitState( FLASH_BANK0, 2); Flashctl_setWaitState( FLASH_Bank1,2); PCM_setPowerState( PCM_AM_DCDC_VCORE1 ); cs_setDCOCenteredFrequency( CS_DCO_Frequency_48 ); cs_setDCOFrequency(4800万); cs_initClockSignal (CS_MCLK,CS_DCOCLK_SELECT,1); cs_initClockSignal (CS_SMCLK,CS_DCOCLK_SELECT,1); cs_initClockSignal (CS_HSMCLK,CS_DCOCLK_SELECT,1); 返回; }

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    感谢您回复Keith,我有几个问题。
    1.我想通过48MHz晶体而不是内部DCO来运行时钟。
    2.上述代码是否在Energia中? 如果是,则正常的嵌入式C中是否也有一个?
    3.我没有得到触摸屏演示所代表的内容。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    这是driverlib代码,而不是Energia。 它已被SimpleLink取代,后者应提供相同的功能。

    我从触摸屏BoosterPack的grlib democode中提取了以下代码:
    www.ti.com/.../BOOSTXL-K350QVG-S1

    下面是Driverlib手册中的一些代码,它们可能会执行您需要的操作:
    /*配置用于外围设备/晶体使用的引脚和用于输出的LED */
    MAP_GPIO设置外围模块功能输出引脚(GPIO_PORT_PJ,
    GPIO _PIN3 | GPIO _PIN4,GPIO主要模块功能);
    MAP_GPIO_setAsOutputPin (GPIO端口P1,GPIO _PIN0);
    /*设置外部时钟频率。 此API是可选的,但将会
    *如果用户想使用getMCLK/getACLK/et
    *功能
    */
    cs_setExternalClockSourceFrequency(3.2万, 4800万);
    /*在无超时的非旁路模式下启动HFXT。 开始之前
    *我们必须将VCORE更改为1才能支持48MHz频率*/
    MAP_PCM_setCoreVoltageLevel (PCM_VCORE1);
    MAP_FlashCTL_setWaitState(FLASH_BANK0, 2);
    MAP_FlashCTL_setWaitState(FLASH_Bank1,2);
    cs_startHFXT (FALSE);
    /*初始化MCLK到HFXT (有效值为48MHz)*/
    MAP_CS_initClockSignal (CS_MCLK,CS_HFXTCLK_SELECT,CS_CLock_diver_1);
    星期五
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    只是想确认基斯已经指出的关于等待状态的内容。  此外,使用C版芯片,在48Mhz操作时(24-48Mhz范围)等待状态可以减少到1。  

    DriverLib示例可在此处找到:  

    谢谢,此致,

    Chris