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.

[参考译文] MSP430F67771A:PMM 模块配置、逐步提高 VCORE 电平、并将频率与 Vcore 串联增加至24MHz

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/757926/msp430f67771a-pmm-module-configuration-raising-vcore-level-in-steps-and-increasing-the-frequency-in-tandem-with-the-vcore-to-24mhz

器件型号:MSP430F67771A
主题中讨论的其他器件:MSPDRIVERLIB

大家好!  

我需要有关配置 PMM 模块以在最高 VCORE  电压下运行的帮助、以便在24MHz 下运行器件。  

如用户手册的相关章节所述、 VCORE 电压需要以单个增量步长增加、而不是以一个大步长增加到最终电平、如下所示:


此外、用户手册 SLAU208Q 在第108页中概述了以下步骤:


在另一个参考中、数据表提到频率也应逐步增加、以达到最终目标工作频率。  

将这两者结合起来、我使用 for 循环来将 Vcore 电平增加一步、频率串联起来也是如此。

我的第一个问题是-这是否正常? 或者、我是否应该让 Vcore 电压达到其所需的电平、然后单独增加频率?  

我的第二个问题:执行会卡在 SET_Vcore 函数内的第一个 while 循环中,如下所示。

我的代码如下所示。  


void set_vcore (unsigned int level)
{
level &= 0x0007;//限制电平获取非法值
PMMCTL0_H = PMMPW_H;//在

(!(PMMIFG & SVSMHDLYIFG))时打开 PMM 寄存器进行写入访问;//代码卡在此处!! 永远不会把 SVSMHDLYIFG 的标志拉高!!!
while (!(PMMIFG & SVSMLDLYIFG));

SVSMHCTL = SVSHE + SVSHRVL0 *电平+ SVMHE \
+(SVSMHRRL0 *(电平+ 1));//将 SVS/SVM 高侧设置为新电平
SVSMLCTL = SVSMLE + SVMLE + SVSMLRL0 *(电平)
;//将 SVSMLPMSMLPM0设置为新电平!//等待 SVM 稳定
PMMIFG &=~(SVMLVLRIFG + SVMLIFG);//清除已设置的标志
PMMCTL0_L =(电平& 0x03);//如果
((PMMIFG & SVMLIFG))将 VCORE 设置为新电平
//等待直到达到新电平(!(PMMIFG & SVMLIFG);
SVSMLCTL = SVSLE + SVSLRVL0 *电平+ SVMLE \
+(SVSMLRRL0 *(电平+ 1));//将 SVS/SVM 低侧设置为新电平
PMMCTL0_H = 0x00;//锁定 PMM 寄存器以进行写入访问
} 

此函数从 main 中调用、如下所示:

int main (void)
{
///----------------------------------------------------------
//开始初始化序列
///----------------------------------------------------------
WDTCTL = WDTPW | WDTHOLD;//停止看门狗计时器
__ bis_SR_register (SCG0);//禁用 FLL 控制环路
UCSCTL6 |= XT1BYPASS;//旁路振荡器、简化驱动
UCSCTL1 = DCORSEL_2;//选择最低 DCO 范围
UCSCTL3 = SELREF_0;//设置 DCO FLL 基准= XT1CLK/1
UCSCTL4 = SELA_REFOCLK \
+ SELM_REFOCLK;//设置 ACLK = REFO for WD (独立)
UCSCTL0 = DCO2 + MOD2;//设置中等 DCOx、MODx
UCSCTL2 = FLLD_0;//将 DCO 乘法器设置为最低频率
//(N + 1)* FLLRef = Fdco
//(487 + 1)* 32768 = 16MHz
__DELAY_CYCLS (10000);//振荡器稳定

FLL_Step_Incrmt 的稳定延迟();//在步骤
__DELAY_CYCLLES (1000)中将时钟设为目标频率;//振荡器稳定
__BIC_SR_register (SCG0)的稳定延迟;//启用 FLL 控制环路

// DCO 范围位已
更改 n x 32 x 32 x f_MCLL_f 参考时最坏情况下的稳定时间。
有关优化、请参阅5xx // UG 中的 UCS 一章。
// 32 x 32 x 16 MHz / 32、768Hz = 500000 = MCLK 周期、DCO 稳定

//循环、直到 XT1、XT2和 DCO 故障标志被清除
DO
{
UCSCTL7 &&=~(XT2OFFG + XT1LFOFFG + DCOFFG);//清除 XT2、XT1、DIFG、DIFG 和
= RFIFG;//清除 XT2 FAULT1 =~ //清除故障标志
} while (SFRIFG1 & OFIFG);

其中 FLL_StepIncrement 如下所示:

void FLL_Step_Incrmt (void)

unsigned int i;
unsigned int dcorval = 0x0020;

for (i=1;i<4;i++)

SET_Vcore (I);
UCSCTL1 = dcorval + 0x0010;
_DELAY_CYCLES (256);//

代码在第一个 while 循环中停留在设置 Vcore 函数的循环中。 我缺少什么吗? 我是否需要启用延迟中断标志?  

如果有任何帮助,将不胜感激。 谢谢  

此致

Aniruddha  

 

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    为了确保所有细节都正确无误,请将代码以 PMM_setVCore() driverlib 函数为基础(或只调用此函数)。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    大家好、Clemens、
    感谢您的回答。 我从何处获取此驱动程序库函数? 请听我说。
    我已使用用户手册 SLAU208Q 第108页概述的步骤来写入 SET_VCORE 函数。 实际上、它是同一页上提供的示例代码。 第108页上的示例代码和驱动程序库代码有何区别?
    此致
    Aniruddha
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    MSPDRIVERLIB 单独下载。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    大家好、Clemens、

    大家好、我是 Merry Christmas。  

    我已经下载了该库、并且还成功地将其添加到我的项目中。  

    我正在调用函数来增加库中的 Vcore 电压。  

    现在我发现 UCS 初始化不正确。 基本上、XT1LFOFFG 标志从 POR 保持置1直到无穷大。 即使在我复位 UCSCTL7中的所有故障标志后也是如此。

    这是我的修改后的代码。  

    int main (void)
    {
    ///----------------------------------------------------------
    //开始初始化序列
    ///----------------------------------------------------------
    WDTCTL = WDTPW | WDTHOLD;//停止看门狗计时器
    
    _bis_SR_register (SCG0);//禁用 FLL 控制循环
    __BIC_SR_register (CPUOFF);//启用 CPU 函数
    
    UCSCTL6 &&~(XT1OFF);// XT1打开
    UCSCTL6 |= XT1BYPASS;//旁路振荡器、简化驱动
    UCSCTL1 = DCORSEL_2;//选择最低 DCO 范围
    UCSCTL3 = SELREF_0;//设置 DCO FLL 基准= XT1CLK/1
    UCSCTL4 = SELA_REFOCLK \
    + SELM_REFOCLK;//设置 ACLK = REFO for WD (独立)
    UCSCTL0 = DCO2 + MOD2; //设置中等 DCOx、MODx
    UCSCTL2 = FLLD_0;//将 DCO 乘法器设置为最低频率
    UCSCTL7 &= 0xFFF0;//清除所有振荡器故障标志
    //(N + 1)* FLLRef = Fdco
    //(487 + 1)* 32768 = 16MHz
    _ delay_cycles (10000);//振荡器稳定
    P1DIR 的稳定延迟= 0x08;
    P1SEL0 = 0x08;//在 P1.4
    P1SEL1上输出 MCLK = 0x00;
    
    PMM_enableSvsH ();
    PMM_enableSvsL ();
    PMM_enableSvmH ();
    PMM_enableSvmL ();
    
    FLL_Step_Incrmt ();//在步骤
    __DELAY_CYCLLES (10000)中将时钟设置为目标频率;//振荡器稳定
    
    __BIC_SR_register (SCG0)的稳定延迟;//启用 FLL 控制环路
    // DCO 范围位已
    更改时最坏情况下的稳定时间//为 n x 32 x 32 x f_MCLK /f_FLL_reference。
    有关优化、请参阅5xx // UG 中的 UCS 一章。
    // 32 x 32 x 16 MHz / 32、768 Hz = 500000 = MCLK 周期、DCO 用于使
    
    UCSCTL4 = SELA_REFOCLK \
    + SELM_DCOCLK;//设置 MCLK = DCO 时钟
    
    //循环、直到 XT1、XT2和 DCO 故障标志被清除
    DO
    {
    CSC7 &&~μ F + UCLG + TFFG + TCLG (TCLG) //清除 XT2、XT1、DCO 故障标志
    SFRIFG1 &=~OFIFG; //清除故障标志
    } while (SFRIFG1 & OFIFG);
    .
    。
    。
    //转到 while 循环 

    我使用外部谐振器作为时钟源。 因此绕过了 XT1。 那么发生什么事了? 有什么建议吗?

    此致

    Aniruddha

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您只能将旁路模式与振荡器一起使用、即一个单独生成时钟信号的器件。 (对于两个电源引脚和一个 OUT引 脚、必须至少有 THRE 引脚。)

    一个普通谐振器(带有两个引脚)的运行方式与一个晶振相似、并且必须以同样的方式驱动。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我已经验证了我们确实在使用振荡器、而不是谐振器、正如我在上一篇文章中错误地提到的。 很抱歉造成混淆。  

    但我仍然无法将 VCORE 电平提升到更高的水平。 我从 PMMCOREVx = 0开始、并以单个增量步骤将其提升至 PMMCOREVx = 3、每个步骤之间的延迟可实现内核电压的稳定。 但是、在 PMMCOREVx = 2的第二步之后、延迟标志 SVSLDLY 永远不会被置位。 前两个步骤执行正常。 当尝试达到 PMMCOREVx = 2的电压时、程序会卡住。

    这是否是因为频率增加得太快?  或者它是否可以是其他的东西?  

    以下是我的最新代码:

    int main (void)
    {/-------------------------------------------------------
    
    //开始初始化序列
    ///----------------------------------------------------------
    WDTCTL = WDTPW | WDTHOLD;//停止看门狗计时器
    __bis_SR_register (SCG0); //禁用 FLL 控制环路
    __BIC_SR_register (CPUOFF);//启用 CPU 功能
    
    UCSCTL3 |= SELREF__REFOCLK; //设置 DCO FLL 基准= REFO
    UCSCTL4 |= SELA_REFOCLK; //设置 ACLK = REFO
    UCSCTL4 |= SELM_XT1CLK; //设置 MCLK = DCO 时钟= 16MHz
    UCSCTL4 |= SELs__DCOCLKDIV; //设置 SMCLK = DCOCLK/1
    
    UCSCTL0 = DCO3 + Mod3;//设置中等 DCOx、MODx
    UCSCTL1 = DCORSEL_2 + DISMOD; //为8MHz 运行选择 DCO 范围
    UCSCTL2 = FLLD_0 + 63;//将 DCO 乘法器设置为最低频率
    UCSCTL7 &= 0xFFF0;//清除所有振荡器故障标志
    // D *(N + 1)* FLLRef = Fdco
    // 1 *(63 + 1)* 32768 = 2.097152 MHz
    
    // DCO 范围位已
    更改时 DCO 的最坏情况稳定时间//为 n x 32 x 32 x f_MCLK / f_FLL_reference。
    // 32 x 32 x 16 MHz / 32、768 Hz = 500000 = MCLK 周期、以便 DCO 稳定
    __DELAY_CYCLS (50000);//
    循环、直到 XT1、XT2和 DCO 故障标志被清除
    
    DO
    {
    UCSCTL7 &&=~
    ~(XT2OFFG + XT1LFOFFG + DCOFFG);XSFT1、XIFG 和 XSFG = FAULT 标志;//清除 //清除故障标志
    } while (SFRIFG1&OFIFG);
    

    在执行一些更多的初始化代码后、如下所示:

    PMM_enableSvsH ();//启用高侧监控
    器 PMM_enableSvmH ();//启用高侧监控
    器 PMM_enableSvsL ();//启用低侧监控
    器 PMM_enableSvmL ();//启用低侧监控
    
    器 FLL_Step_Incrmt ();//采取步骤
    使振荡器 PMM_enableSvmL ()稳定;//将目标频率设置为10000个周期;//
    
    将目标振荡器延迟设置为_ SC_CL_CL_CL_CL_CL_CL_CL_000/(0_CL_CL_CL_CL_CL_ENCH)//启用 FLL 控制环路
    
    DO
    {//循环直到 XT1、XT2和 DCO 故障标志被清零
    UCSCTL7 &&~(XT2OFFG + XT1LFOFFG + DCOFFG);//清除 XT2、XT1、DCO 故障标志
    SFRIFG1 &=~OFIFG; //清除故障标志
    } while (SFRIFG1 & OFIFG);
    

    其中函数 FLL_Step_Incrmnt()具有以下代码。  

    void FLL_Step_Incrmt (void)
    {
    unsigned int i;
    unsigned int dcorval = 0x0010;
    unsigned int fll_n = FLL_BASE;
    
    for (i=0;i<4;i++)
    {
    //set_vcore (i);
    if (pMM_setVCoreUp (i))
    )}{
    _ delay_delay_t_dSCl
    = 0x10000;t1 + d1 (tcr + 1)+ 1 (在
    TSCval 后)+ 1 (Ucr + 1 + 1)增量
    );if (t1 + 1)//将 DCO 乘法器设置为下一个更高频率
    __delay_cycles (10000);// Vcore 增加
    fll_n += FLL_step 之后的额外延迟;
    }
    否则
    {
    i--;
    fll_n =192;
    dcorval =0x0010;
    }
    //
    检查 PMM 内核电压是否设置正确。
    UCSCTL2 = 733;//将 DCO 乘法器设置为最高频率24MHz。
    __DELAY_CYCLES (256);//使最终输出稳定的延迟
    } 

    代码卡在 SET_CoreV (I)函数调用内部。  

    如果有任何帮助,将不胜感激。

    此致

    Aniruddha

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

    您好、Aniruddha、

    我没有用于 F67771A 进行任何测试的板。 请尝试使用 SLAU208Q P108上提供的 C 代码。 但在将 MCLK 配置为更高的频率之前、请确保增加 Vcore。