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.

[参考译文] 卡在 HWREG (HIB_CTL)|= HIB_CTL_CLK32EN 上;

Guru**** 2468460 points
Other Parts Discussed in Thread: EK-TM4C1294XL

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/668377/stuck-on-hwreg-hib_ctl-hib_ctl_clk32en

Thread 中讨论的其他器件:EK-TM4C1294XL

您好!

我有两个不同的板,它们具有相同的微处理器(TM4C1290NCDPT)。 较旧版本的代码在新板上运行文件、但使用最新版本时、代码会卡在以下过程中。 (转动时钟使能位)。 请记住、旧版本和新版本之间在此处使用的代码部分是相同的。 差别不大。

无效

HibernateEnableExpClk (uint32_t ui32HibClk)

//
//打开时钟使能位。
//
   HWREG (HIB_CTL)|= HIB_CTL_CLK32EN;

//
//在寄存器加载(上面)后等待写入完成。
//
_HibernateWriteComplete();

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

    [引用 user="Haroldo Cazeao]旧 版本和新版本之间在此处使用的代码部分是相同的。   差别不大[/报价]

    您的写作 "是相同的"、然后是"没有太大的差异"是否可能会 对 您的"将会"的帮助者提出过度挑战?     现在、"一致性"-并不(必然)延伸到"确切性"-因此(有些)差异(不一致)可能存在。   我们被告知"魔鬼在细节中"、但不知怎么说、这个细节还没有达到...

    假定您的代码在 "等待 写入"HIB_CTL"完成时"粘着"。    然而,我认为,"执行"检查是否完成"的循环代码没有显示出来!"

     您调用 "HibernateEnableExpClk ()"之前、是否确保所有必需的"设置和配置"(休眠要求)都已完全完成?    (您应该能够在进入该函数时切换位-证明已达到该位-并"开始执行函数"。   

    由于您的旧代码版本运行正常-并且有新的"记忆棒"-"比较和对比这里的两个版本-这样许多人可能会看到和评论吗?"   这似乎优于您的报告、 "差别不大"-当 "即使是最小的差别"-可能会证明是意外的!"

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

    您好 CB1_MOBILE、

    感谢您的书面答复。 您的观点得到了很好的采纳。

    无论如何、 更具体地说、 在新电路板上工作的代码的旧版本 与在新电路板上工作的代码的新版本之间的唯一区别在于:

    1) 1)对于旧版本、未使用引导加载程序。

    2)在新版本中、我们使用引导程序、固件开始在偏移量0x4000处运行。  

    3) 3)您的假设是正确的、  代码"粘着"、而 "等待 写入"HIB_CTL"以完成。"  

    以下是确切的代码:

    无效
    HibernateEnableExpClk (uint32_t ui32HibClk)

    //
    //打开时钟使能位。
    //
    HWREG (HIB_CTL)|= HIB_CTL_CLK32EN;

    //
    //在寄存器加载(上面)后等待写入完成。
    //
    _HibernateWriteComplete();

    有什么想法吗?

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

    谢谢您-您的问题现在更清楚(我相信)。

    Twas me -我(临时)绕过引导加载程序-并查看"新"代码是否成功。    "kiss"规定我们始终以"简单!"开头    以这种方式继续将确定引导加载程序是否导致了您的问题。    这就是关键价值-不是吗?

    未回答仍为 "正确设置/配置"。 休眠模块的"电源和供电"、然后再进行功能调用。

    必须是"_HibernateWriteComplete();"包含循环结构-既不严格、也不使用此供应商的引导加载程序-因此在这方面我几乎没有什么服务。    作为一个"最后关头"-引导加载程序可能会以某种方式/如何找到这个(完成)测试?    (似乎值得追求-尤其是当代码"摆脱了引导加载程序的束缚"时、代码运行正常时。    (即亲吻"避免"这种感情...)

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

    您好、Haroldo、

    在软件方面、请分享休眠模块配置设置。

    从硬件方面来说、有几个问题:

    1. 是否有与晶振/时钟相关的硬件更改?
    2. 是否有用于 HIB 模块的外部晶体?
      1. 如果是、您是否已验证晶体的原理图/布局? (指南: http://www.ti.com/lit/an/spma056/spma056.pdf)

    您报告的问题通常与配置不正确或新电路板上32kHz 晶体的问题有关。

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

    您好、Ralph、

    如果我可以-海报上报告了两块板-(过去成功了)-那么我们是否应该(相信)他过去的"晶振/计时"保持不变?    如果这种情况发生改变,那就一定要"他的工作"来详述这一点!

    我们(两者)质疑他的"休眠"设置/配置-他没有响应我的请求(或 Devil)提供此类信息...

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

    男士、

    很抱歉耽误你的时间。

    1) 1)这是休眠模块配置设置。

    /*以120MHz 的频率从 PLL 运行。 这将等待 PLL 正确锁定*。 *
    SysClock = MAP_SysCtlClockFreqSet ((SYSCTL_XTAL_25MHz |SYSCTL_MAIN |SYSCTL_USE_PLL |SYSCTL_CFG_VCO_480)、SYS_CLOCK FREQ_Hz);

    //代码 CRC 校验
    MAP_SysCtlPeripheralEnable (SYSCTL_Periph_CCM0);//启用 CRC 模块

    //基本硬件设置

    sysTickPeriodSet (sysClock / SYSTICKS_PER_second);//(时钟/秒)/(tick /秒)=时钟/节拍

    SysTickIntEnable();
    SysTickEnable();

      HibernateEnableExpClk (sysClock);  //配置休眠模块时钟。

    这是 HibernateEnableExpCl

    无效
    HibernateEnableExpClk (uint32_t ui32HibClk)

    //
    //打开时钟使能位。
    //
    HWREG (HIB_CTL)|= HIB_CTL_CLK32EN;

    //
    //在寄存器加载(上面)后等待写入完成。
    //
    _HibernateWriteComplete();

    2) 2) TI 有以下勘误表以及解决方法  

    HIB # 19在休眠模块复位后、HIBCTL 寄存器的第一个位可能无法成功完成。

    3) 3)权变措施的一部分是对休眠模块执行软件复位? 我该怎么做。 我从驱动程序库中查看了休眠.c。 这并不是显而易见的。

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

    您好、Haroldo、

    我看不到以下呼叫:  

    SysCtlPeripheralEnable (SYSCTL_Periph_HIBERNATE); 

    这是在对 Hibernate 执行任何其他操作之前所需的 API 执行。 它应该在 您的 HibernateEnableExpClk 调用之前。

    您还需要配置模块时钟源、例如具有 API 调用的、如下所示:

    HibernateClockConfig (HIBERNATE_OSC_LOWDRIVE); 

    如果您看一下 TivaWare 休眠示例(您的 MCU 最接近的示例位于 [安装路径]\TivaWare_C_Series-2.1.4.178\examples\boards\ek-tm4c1294xl\hibernate"中)、您可以看到有关设置休眠模块的更多详细信息

    就勘误表而言、我认为您没有遇到过该特定案例。 但是、有关该邮件的一些详细信息、请参阅 Amit 的前一篇文章: https://e2e.ti.com/support/microcontrollers/tiva_arm/f/908/p/408398/1448105#1448105

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    对于此问题、需要考虑以下事项:
    如果我单步执行休眠模块中的调用、我可以看到使用示波器触发外部时钟、并最终通过休眠模块。
    但是、如果我在休眠模块例程之后设置一个断点、它会挂起。
    有人能解释一下吗?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Haroldo、

    它可能表示时钟需要更多的时间才能运行、然后才能执行某些代码、因此当单步执行时、它会挂起。 也可能完全是其他问题。

    为什么这种情况很难说、因为我仍然无法完全了解您的软件配置、因为您似乎已经在上面发布了各种数据块(或者您可能仍然缺少我在上面强调的关键呼叫吗?) 我的任何硬件设置问题也没有得到解决...
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Ralph、
    感谢您对该问题的及时答复。 我们非常感激,因为这种情况变得越来越紧迫。

    下面是我的整个代码

    MAIN ()
    {
    sysClock = MAP_SysCtlClockFreqSet ((SYSCTL_XTAL_25MHz | SYSCTL_OSC_MAIN | SYSCTL_USE_PLL | SYSCTL_CFG_VCO_480)、SYS_CLOCK FREQ_Hz);
    .....
    //------------------------------------------------
    //设置中断优先级
    
    IntPrioritySet (INT_UART0、UART0_INT_PRI);
    IntPrioritySet (INT_USB0、USB_INT_PRI);
    IntPrioritySet (INT_ADC0SS2、 ADC0_SEQ2_INT_PRI);
    IntPrioritySet (FAULT_SysTick、SysTK_INT_PRI);
    
    ..........
    
    //基本硬件设置
    
    SysTickPeriodSet (sysClock / SYSTICKS_PER_second);//(时钟/秒)/(tick /秒)=时钟/ tick
    SysTickIntEnable();
    SysTickEnable();//启用系统节拍。 这应该
    是//每 ms 一次。
    
    .
    MAP_SysCtlPeripheralEnable (SYSCTL_Periph_HIBERNATE);//启用休眠模块。
    
    hib_Init();//请参阅吹扫以实现完全
    
    实现}
    
    
    
    
    /**
    *此函数初始化 MCU 中的休眠模块。 如果我们从休眠模式中唤醒
    *它会复位中断状态。 它还设置实时时钟、但不设置时间。
    //
    
    void hib_Init (void)
    {
    uint32_t hibStatus = 0;
    
    HibernateEnableExpClk (sysClk);//配置休眠模块时钟。
    
    //检查休眠模块是否已激活,
    //这可能意味着处理器从休眠中唤醒。
    if (HibernateIsActivate())
    {
    //读取状态位以查看是什么导致了唤醒。 清除 WAKE
    //源、以便器件再次进入休眠模式。
    hibStatus = HibernateIntStatus (0);
    HibernateIntClear (hibStatus);
    }
    
    if (!(hibStatus &(HIBERNATE_INT_PIN_WAKE | HIBERNATE_INT_RTC_MATCH_0 |
    HIBERNATE_INT_GPIO_WAKE | HIBERNATE_INT_RESET_WAKE)))
    ){
    HibernateClockConfig (HIBERNATE_RTC_RTC_MATCH_0 | HMATCH_E/ HIGRSC 时钟源/ HIGRSC 时钟源配置
    
    
    HibernateRTCEnable();//启用 RTC 模式。
    
    HibernateCounterMode (HIBERNATE_COUNTER_24HR);//将休眠模块计数
    器//配置为24小时日历模式。
    
    HibernateRTCTrimSet (eep_RdAddr (RTC_TRIM_ADDR));//从 EEPROM
    
    返回设置 RTC 调整寄存器;
    } 

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

    您好、Haroldo、

    感谢您共享完整的初始化。 如何回答之前的这些问题:

    从硬件方面来说、有几个问题:

      1. 是否有与晶振/时钟相关的硬件更改?
      2. 是否有用于 HIB 模块的外部晶体?
        1. 如果是、您是否已验证晶体的原理图/布局? (指南: http://www.ti.com/lit/an/spma056/spma056.pdf)

    现在我再添加一个、我看到了您的初始化代码:您的外部晶体上的滤波电容器是什么(如果使用)?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Ralph、
    a)发生了仅与晶体相关的硬件更改、而不是计时。 另一个商户被用于交替振荡器电路。 但是、没有使用引导加载程序的代码的较旧版本实际上起作用。 至于代码的较旧版本和较新版本之间的差异、没有任何应用休眠配置模块的方法。

    b)如上所述、HIB 模块使用外部晶振。 我根据您推荐的原理图验证了原理图。 当然、我会有一个硬件人员进行双重检查。

    外部晶振上的滤波电容各为20pF。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Haroldo、

    非常感谢您提供此信息。 当您的硬件工程师检查电路时、您还应该让他或与他一起检查晶体是否处于联机状态并以预期的频率振荡。 至少有半个问题、如您在论坛上所描述的问题、这些问题源于晶体问题、这就是为什么我一直对了解它的硬件设置有一定的了解。 如果晶振来自新的商家、则值得对晶振进行范围检查、以确保晶振按预期运行。 验证这将使硬件端完全无法入睡。

    我一直在研究导致您描述的问题发生的任何情况、因为启动加载程序、但尚未找到任何问题。 尽管提出了这一点、这是否意味着您运行的是旧固件、但在这个新电路板上没有引导加载程序? 这一点没有问题吗? 当您单步执行代码并使其运行时、是否使用引导加载程序? 您还使用哪种类型的引导加载程序? USB? UARTTM
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Ralph、

    感谢你的答复。  

    首先、我与硬件工程师进行了合作、我们能够对晶体进行范围控制、以确保其按预期运行。  

    第二、下面是我对您的问题的回答:

    1) 1) 这是否意味着您正在运行较旧的固件、但此新电路板上没有引导加载程序?

    是的、2年前的固件版本没有使用引导加载程序、在这个新电路板上100%可靠地运行。  

    2) 2) 当您单步执行代码并使其运行时、引导加载程序是否会运行该代码?

    是的、它是与引导加载程序一起使用的。 但我必须限定"正在运行"。 只有通过单步执行代码、我才能够通过休眠模块。

    3) 3) 您使用哪种类型的引导加载程序? USB? UARTTM

    USB。

    还有其他建议吗? 我将开始查看引导加载程序

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

    我同意对引导加载程序进行深入研究是最有意义的、这似乎是唯一的区别因素、因为它会看到晶体正常运行、并且休眠模块使用使用使用相同设置的旧代码运行。

    您对引导加载程序正常运行的信心如何? 您是否能够测试其他外设、甚至运行与闪烁项目(如果您有 LED)相关的项目、以确保引导加载程序平稳运行? 从我所了解到的所有内容中、我只能找到休眠或仅查找引导加载程序问题、还没有发现引导加载程序导致休眠模块失败的情况(尽管从未说过?) 我认为将这些功能结合在一起并不罕见、这样您就不会在我看来做一些不同寻常的事情。

    我认为另一个调试步骤是在休眠模块寄存器冻结之前读取休眠模块寄存器、以便我们可以看到器件运行的内部设置。 实际上、如果您可以这样做、请查看您是否可以比较引导加载程序与非引导加载程序的设置-如果由于引导加载程序的存在而配置不同的内容、这可以让我们更清楚地了解。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    [报价 USER="CB1_MOBIT]Twas Me -我(暂时)绕过引导加载程序-并查看"新"代码是否成功。    "kiss"规定我们始终以"简单!"开头    以这种方式继续将确定引导加载程序是否导致了您的问题。    这就是关键价值-它不是吗?

    引导加载程序-反复显示为(非常)"主要可疑!"    是否真的需要它?    它的"优势"(如果有)是否可以证明损失的时间/精力/费用?

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

    全部

    我能够找出问题的根源。 它不在引导加载程序中。 固件未通过电压检查、随后将进入休眠模式、从而导致软件复位。

    但是、我不想结束他的问题、因为还有一个非常重要的问题仍然悬而未决。

    当使用源代码级调试器时、代码在单步执行某些过程时会挂起。 但是、我知道代码会起作用、因为如果我不单步执行代码并让代码自由运行、一切都可以正常运行。 问题就变成了:在单步执行某些例程时、如何使用源代码 lelvel 调试器而不会卡住。

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

    您使用的是什么调试工具和编译器? 我认为我需要将您的问题直接发送给不同的专家、因为在我看来、这种问题与其说是特定于器件的问题、更像是工具问题?