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.

[参考译文] CC5137 MCU 在调整系统频率时挂起

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/566845/cc5137-mcu-hangs-up-when-adjusting-the-system-frequency

主题中讨论的其他器件:CC430F5137

大家好、我正在使用 CC430f5137、发现了一个问题:

当 cc5137将发送射频信号时、它会增加系统时钟(f_DCO = 20Mhz、MCLK = 20Mhz、SMCLK = 10MHz)、完成后、它会降低系统时钟(f_DCO = 10MHz、MCLK = 5MHz、SMCLK = 10MHz)。 我们一次更改一个 Vcore。 现在对我们来说还可以。

但最近、有一批 CC5137、 当系统时钟增加时、它会挂起、调整频率的代码为:

//打开 PMM 寄存器进行写入
PMMCTL0_H = PMMPW_H;
//将 SVS/SVM 高电平设置为新的电平
SVSMHCTL = SVSHE + SVSHRVL0 *电平+ SVMHE + SVSMHRRL0 *电平;
//将 SVM 低电平设置为新的电平
SVSMLCTL = SVSLE + SVMLE + SVSMLRRL0 *电平;
//等待 SVM 稳定
while ((PMMIFG & SVSMLDLYIFG)=0);
//清除已设置的标志
PMMIFG &=~(SVMLVLRIFG + SVMLIFG);
//将 VCORE 设置为新的电平
PMMCTL0_L = PMMCOREV0 *电平;
//等待达到新级别
IF (((PMMIFG 和 SVMLIFG))
while ((PMMIFG & SVMLVLRIFG)=0);
//将 SVS/SVM 低电平侧设定为新的电平
SVSMLCTL = SVSLE + SVSLRVL0 *电平+ SVMLE + SVSMLRRL0 *电平;
//锁定 PMM 寄存器以进行写访问
PMMCTL0_H = 0x00;

我找到了 TI 的一个示例代码、它被命名为 hal_pMM.c、频率代码增加为:

unsigned int SetVCoreUp (unsigned char 级别)


unsigned int PMMRIE_backup、SVSMHCTL_backup;

//打开 PMM 寄存器进行写访问
PMMCTL0_H = 0xA5;

//禁用专用中断以防止清除所需的标志
PMMRIE_BACKUP = PMMRIE;
PMMRIE &=~(SVSMHDLYIE | SVSMLDLYIE | SVMLVLRIE | SVMHVLRIE | SVMHVLRPE);
//将 SVM 高侧设置为新的电平,并检查是否可以增加 VCORE
SVSMHCTL_BACKUP = SVSMHCTL;
PMMIFG &=~(SVMHIFG | SVSMHDLYIFG);
SVSMHCTL = SVMHE | SVMHFP |(SVSMHRRL0 *电平);
//等待 SVM 高侧稳定
while ((PMMIFG & SVSMHDLYIFG)=0);
//禁用全性能模式以节省能源
SVSMHCTL &=~ HAL_PMM_SVSFP;
//检查是否可以增加 VCORE
如果((PMMIFG & SVMHIFG)=SVMHIFG){//->Vcc 对于 Vcore 增加为低电平
//恢复以前的设置
PMMIFG &=~SVSMHDLYIFG;
SVSMHCTL = SVSMHCTL_BACKUP;
//等待 SVM 高侧稳定
while ((PMMIFG & SVSMHDLYIFG)=0);
//清除所有标志
PMMIFG &=~(SVMHVLRIFG | SVMHIFG | SVSMHDLYIFG | SVMLVLRIFG | SVMLIFG | SVSMLDLYIFG);
//备份 PMM 中断寄存器
PMMRIE = PMMRIE_BACKUP;

//锁定 PMM 寄存器以进行写访问
PMMCTL0_H = 0x00;
返回 PMM_STATUS_ERROR;//返回:电压未设置

//还将 SVS 高侧设置为新的电平//->Vcc 足够高、足以增大 Vcore
SVSMHCTL |= SVSHE |(SVSHRVL0 *电平);
//将 SVM 低电平设置为新的电平
SVSMLCTL = SVMLE | SVMLFP |(SVSMLRRL0 *电平);
//等待 SVM 低电平端稳定
while ((PMMIFG & SVSMLDLYIFG)=0);
//清除已设置的标志
PMMIFG &=~(SVMLVLRIFG | SVMLIFG);
//将 VCORE 设置为新的电平
PMMCTL0_L = PMMCOREV0 *电平;
//等待,直到达到新的级别
中频(PMMIFG 和 SVMLIFG)
while ((PMMIFG & SVMLVLRIFG)=0);
//还将 SVS/SVM 低电平侧设置为新的电平
PMMIFG &=~SVSMLDLYIFG;
SVSMLCTL |= SVSLE |(SVSLRVL0 *级别);
//等待低侧延迟标志
while ((PMMIFG & SVSMLDLYIFG)=0);

//禁用 SVS/SVM 低电平
//禁用全性能模式以节省能源
SVSMLCTL &=~(_HAL_PMM_DISABLE_SVSL_++_HAL_PMM_DISABLE_SVML++_HAL_PMM_SVSFP);

//清除所有标志
PMMIFG &=~(SVMHVLRIFG | SVMHIFG | SVSMHDLYIFG | SVMLVLRIFG | SVMLIFG | SVSMLDLYIFG);
//备份 PMM 中断寄存器
PMMRIE = PMMRIE_BACKUP;

//锁定 PMM 寄存器以进行写访问
PMMCTL0_H = 0x00;
返回 PMM_STATUS_OK;//返回:OK
#endif
#if 0
//打开 PMM 寄存器进行写入
PMMCTL0_H = PMMPW_H;
//将 SVS/SVM 高电平设置为新的电平
SVSMHCTL = SVSHE + SVSHRVL0 *电平+ SVMHE + SVSMHRRL0 *电平;
//将 SVM 低电平设置为新的电平
SVSMLCTL = SVSLE + SVMLE + SVSMLRRL0 *电平;
//等待 SVM 稳定
while ((PMMIFG & SVSMLDLYIFG)=0);
//清除已设置的标志
PMMIFG &=~(SVMLVLRIFG + SVMLIFG);
//将 VCORE 设置为新的电平
PMMCTL0_L = PMMCOREV0 *电平;
//等待达到新级别
IF (((PMMIFG 和 SVMLIFG))
while ((PMMIFG & SVMLVLRIFG)=0);
//将 SVS/SVM 低电平侧设定为新的电平
SVSMLCTL = SVSLE + SVSLRVL0 *电平+ SVMLE + SVSMLRRL0 *电平;
//锁定 PMM 寄存器以进行写访问
PMMCTL0_H = 0x00;

当我使用此段替换旧段时、可以增加进程、但减小进程不起作用、减小的代码为:

unsigned int SetVCoreDown (unsigned char 级别)

unsigned int PMMRIE_BACKUP;

//打开 PMM 寄存器进行写访问
PMMCTL0_H = 0xA5;

//禁用专用中断以防止清除所需的标志
PMMRIE_BACKUP = PMMRIE;
PMMRIE &=~(SVSMHDLYIE | SVSMLDLYIE | SVMLVLRIE | SVMHVLRIE | SVMHVLRPE);

//将 SVM 高电平侧和 SVM 低电平侧设置为新的电平
PMMIFG &=~(SVMHIFG | SVSMHDLYIFG | SVMLIFG | SVSMLDLYIFG);
SVSMHCTL = SVMHE | SVMHFP |(SVSMHRRL0 *电平);
SVSMLCTL = SVMLE | SVMLFP |(SVSMLRRL0 *电平);
//等待 SVM 高电平侧和 SVM 低电平侧稳定
while ((PMMIFG & SVSMHDLYIFG)==0 ||(PMMIFG & SVSMLDLYIFG)==0);

//将 VCORE 设置为新的电平
PMMCTL0_L = PMMCOREV0 *电平;

//还将 SVS 高侧和 SVS 低侧设置为新的电平
PMMIFG &=~(SVSHIFG | SVSMHDLYIFG | SVSLIFG | SVSMLDLYIFG);
SVSMHCTL |= SVSHE | SVSHFP |(SVSHRVL0 *电平);
SVSMLCTL |= SVSLE | SVSLFP |(SVSLRVL0 *电平);
//等待 SVS 高电平侧和 SVS 低电平侧稳定
while ((PMMIFG & SVSMHDLYIFG)==0 ||(PMMIFG & SVSMLDLYIFG)==0);
//禁用全性能模式以节省能源
SVSMHCTL &=~ HAL_PMM_SVSFP;
//禁用 SVS/SVM 低电平
//禁用全性能模式以节省能源
SVSMLCTL &=~(_HAL_PMM_DISABLE_SVSL_++_HAL_PMM_DISABLE_SVML++_HAL_PMM_SVSFP);

//清除所有标志
PMMIFG &=~(SVMHVLRIFG | SVMHIFG | SVSMHDLYIFG | SVMLVLRIFG | SVMLIFG | SVSMLDLYIFG);
//备份 PMM 中断寄存器
PMMRIE = PMMRIE_BACKUP;
//锁定 PMM 寄存器以进行写访问
PMMCTL0_H = 0x00;

if ((PMMIFG & SVMHIFG)== SVMHIFG)
返回 PMM_STATUS_ERROR;//对于调整的 VCORE 电平、高侧仍然为低电平
否则返回 PMM_STATUS_OK;//返回:OK

我的降低频率的应用程序代码是:

静态空 LOW_SPED_SELECT (空)

//注释中的值在 FLLREFCLK 为32768Hz 时有效。
UCSCTL1 = DCORSEL_5; // DCORSEL = 5:范围[2.5、54.1] MHz。
// DISMOD = 0 ->调制被启用。
UCSCTL2 = FLLD_2 // FLLD = 2 -> f_DCOCLK /4、
+75;               // FLLN = 75 ->/ 75
// 32768 * 4 * 75 = 9830400 Hz。 F_DCO ~ 10MHz。

UCSCTL5 = DIVM__2 // f_MCLK @~5MHz
| DIVS__1;// f_SMCLK @~10MHz

UCSCTL7 &=~DCOFFG;//清除 DCO 错误标志

而(CURRENT_PMM_LEVEL > 0){
-- Current_PMM_LEVEL;
//减小 V_Core 以降低低速运行时的功耗。
//一次一个级别。
SetVCoreDown (CURRENT_PMM_LEVEL);

CURRENT_SPEED = SPED_LOW;

那么、有人想知道为什么在降低系统频率时 MCU 会挂起? 谢谢你。

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

    当 DCO 的工作频率高于8MHz 时、您不能在 PMMCOREVx 为零的电平上运行、请尝试仅向下进入 PMMCOREVx = 1。

    如果这不能解决问题、代码会在哪里具体挂起? 您是否能够在 TI EVM 上重现此问题? CC430F5137s 的特定修订版是否仅展示了此问题? 您是否曾尝试降低 Vcore、同时将 MCLK 保持在与 DCO 和 SMCLK 相同的频率(无分频)?

    此致、
    Ryan