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.

[参考译文] MSP432P401R:如何在 MSP432上设置 SMCLK

Guru**** 2614265 points


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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/668333/msp432p401r-how-to-set-smclk-on-msp432

器件型号:MSP432P401R

我正在将 MSP430代码转换为 MSP432、这并不容易。 在 MSP430上、MCLK 和 SMCLK 为16MHz。 我希望 MSP432上的 MCLK 为最大值、48MHz、但我希望 SMCLK 为16MHz、以便所有波特率分频器等将与我的 MSP430代码相同。 以下是应将 MCLK 设置为48MHz 的各种源代码、但到目前为止|我还没有发现必须设置 SMCLK。

   while (((PCM->CTL1 & PCM_CTL1_PMR_BUSY))();            //将 Vcore 更改为1以支持48MHz
   PCM->CTL0 = PCM_CTL0_KEY_VAL | PCM_CTL0_AMR_1;         //正确地从当前电源状态转换到 VCORE 电平1
   while (((PCM->CTL1 & PCM_CTL1_PMR_BUSY))();
   MAP_GPIO_setPeripheralModuleFunctionOutputPin (GPIO_PORT_PJ、
   GPIO_PIN3 | GPIO_PIN4、GPIO_PRIMARY_MODULE_FUNCTION);  //用于外设/晶体的引脚
//   map_GPIO_setAsOutputPin (GPIO_PORT_P1、GPIO_PIN0);    //需要一个引脚来观察 MCLK??
   cs_setExternalClockSourceFrequency (32000、48000000);
//   MAP_PCM_setCoreVoltageLevel (PCM_VCORE1);               // VCORE 设为1以支持48MHz 频率
   MAP_FlashCtl_setWaitState (FLASH_BANK0、2);             //使用较新的器件时可能需要更少的等待状态。 检查
   MAP_FlashCtl_setWaitState (FLASH_BANK1、2);
   CS_startHFXT (false);                                   //在非旁路模式下启动 HFXT 而不超时。
   MAP_CS_initClockSignal (CS_MCLK、CS_HFXTCLK_select、CS_clock_divider _1);//将 MCLK 初始化为 HFXT (有效48MHz)

我于1月18日从 TI 购买了 MSP432P401R lalunchpad、因此在上述代码中是否需要2个等待状态?

也是…

下面是要搜索的代码

           SCB->SCR |=(SCB_SCR_SLEEPDEEP_MSK);           //设置睡眠深度位
           __DSB();                                       //确保 SLEEPDEEP 立即发生
           _SLEEP();
           __no_operation();                              //<<在此处设置断点(如果需要进行调试)

以下是唤醒的代码:

空 Port1_IRQHandler (空)

   IF (P1->IFG & BIT3)
   {
       P1->IFG &=~BIT3;                                  // P1.3 IFG 被清零
       SCB_SCR &=~SCB_SCR_SLEEPONEXIT;                   //从 ISR 退出时从睡眠状态唤醒
       strt_hn_cycle = true;                              //标志 strt_hn_cycle (全局)、因此主 PGM 可以启动新的1秒周期
   }

这些看起来不错吗? 我从中获取这些信息的来源也发生了其他事情、我很难确定适合我的事情。 我甚至无法从该代码中得知正在使用哪个 LPM ... MSP430的文档更令人困惑。 BTW、I use

   NVIC->ISER[1]= 1 <<(Port1_IRQn)& 31);              //启用 Port1中断

中断的中断。 我不知道这是怎么做的。

谢谢

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    如果您有一个红色 launchpad、则只需要1个等待状态。 最后、TI 将更新所有文档以反映这一点。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    David、

     要在 MCLK 运行48MHz 时将 SMCLK 设置为16MHz,只需添加带有相应时钟、源振荡器和分频器设置的 CS_initClockSignal()调用。 然后、用于设置两个时钟的代码变为:

    cs_setExternalClockSourceFrequency (32000、48000000);
    MAP_CS_initClockSignal (CS_MCLK、CS_HFXTCLK_SELECT、CS_Clock_divider);//48MHz
    MAP_CS_initClockSignal (CS_SMCLK、CS_HFXTCLK_SELECT、CS_CLOCK_DEVIDER_3);// 16MHz

    从数据表的第5.8节可以看出、对于48MHz 的 MSP432P401x、2个等待状态可降低至1。 (在当前的 v1.6 SDK 示例中、'P401R/M'器件出现错误、设置等待状态=2。)

    您的睡眠/唤醒代码在寄存器级完成、而不是用于时钟设置的 driverlib 代码。 为了实现一致性和可移植性、我建议对所有内容使用 driverlib。 要了解睡眠进入/退出对的工作原理、我建议查看  TI Resource Explorer 中的 PCM_GO_TO_lpm3_带有 计时器_A_WAKEUP 示例。

    此致、

     Bob L.

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    感谢每个人... 但仍然不满意:
    Bob 说
    MAP_CS_initClockSignal (CS_SMCLK、CS_HFXTCLK_SELECT、CS_CLOCK_DEVIDER_4);// 16MHz
    我的计算器显示48MHz/4 = 12MHz、因此 CS_clock_divider _4表示"除以3"、或者没有从48MHz 到16MHz 的路径
    我认为后者是因为我最终找到了 cs.h、其中第69行中的最后一个术语是 DIVS_2

    2.没有人回答我的示例代码调用的睡眠类型... LPM0? 无论这意味着什么、都使用术语"深度睡眠"。 我不信任 LPM3.5及更高版本的休眠、因此我需要 LPM0。 浏览网页、我找到了
    MAP_PCM_gotoLPM0 ()
    可以替换
    SCB->SCR |=(SCB_SCR_SLEEPDEEP_MSK); //设置睡眠深度位
    _DSB(); //确保 SLEEPDEEP 立即发生
    _SLEEP();

    但我还没有发现 IF
    SCB_SCR &=~SCB_SCR_SLEEPONEXIT; //从 ISR 退出时从睡眠状态唤醒
    仍可用于从 MAP_PCM_gotoLPM0唤醒
    苹果和橙子无处不在、我不知道它们是如何组合在一起的。
    谢谢您的耐心、如果我让您感到很抱歉。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    浏览更多信息后的更多信息.... 帮助处于同一情况的其他人.... 有些陈述是根据很少的事实得出的结论、因此如果有人发现了错误、请予以回复。

    1. Sleep ()  将 MSP432置于之前设置的睡眠类型中。

    即,如果您在 sleep()之前的代码中输入,

        SCB->SCR |= SCB_SCR_SLEEPONEXIT_Msk;
    then sleep = LPM0.
    如果在 sleep()之前的代码中输入
        
        SCB->SCR |= SCB_SCR_SLEEPONEXIT_Msk;
        SCB->SCR |= (SCB_SCR_SLEEPDEEP_Msk);
    然后睡眠是更深的睡眠。 "DeepSleep "似乎是一个 ARM 术语、而不是 TI、因此会引起混淆。
    2.有人提出了在退出中断后、部分 ISR 或所有 ISR 是否会恢复睡眠的问题。 许多应用(例如我的)希望一些中断返回到睡眠状态、而其他应用应该从睡眠状态唤醒。
    解决方案似乎如下:
    a)代码在某处执行指令"SLEEP()"、该指令是根据第1段设置的任何类型的睡眠。 以上内容。
    b)如果应用程序希望特定的 ISR 在退出后返回睡眠状态、则 ISR 中的某个位置应显示以下内容
    SCB_SCR |= SCB_SCR_SLEEPONEXIT;
    c)如果应用程序在退出 ISR 后希望另一个特定的 ISR 从睡眠状态唤醒、则 ISR 中的某个位置应显示以下内容
    SCB_SCR &=~SCB_SCR_SLEEPONEXIT;
    此外、使用 MSP432中 Driverlib ROM 中编码的函数也是有益的、因为它们速度更快、不使用任何闪存。 前缀"map_"通知编译器命令位于 ROM 中。
    我已发现    MAP_Interrupt_disableSlepOnISRExit();
    但到目前为止,我还没有发现是否有 MAP_Interrupt_enableSlepOnISRExit();
    如果这两个函数都存在、我认为这些函数应该与上面的 SCB_SCR 函数等效。
    希望这对我们有所帮助 我将返回浏览并查看我可以找到的其他内容。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    David、
    抱歉、div by 4而不是 div-3上的拼写错误! 感谢您发布更正。 我更正了我的原始帖子、以避免任何人误使用该设置。

    根据其他设置、您所示的睡眠深度为"LPM3"或更深。

    请注意:LPM0只停止 CPU 时钟。 它不会关闭任何系统。 因此、LPM0进入/退出速度非常快(大约1-4个 MCLK 周期、但节能低于 LPM3/ETC 模式。

    -Bob L.