你好,
我有两个DA14683 USB开发套件。在我的system_init()函数中我打电话
cm_sys_clk_init(sysclk_pll96.);加快。
cm_sys_clk_init()依次调用此代码在switch_to_pll()中。
if(cm_poll_xtal16m_ready()){switch_to_xtal16();if((type == sysclk_pll48)||(type == sysclk_pll96))){switch_to_pll();}}
在switch_to_pll()中调用此代码:
静态void switch_to_pll(void){if(hw_cpm_is_pll_locked()== 0){hw_cpm_pll_sys_on();//打开pll} ......
现在有趣的是,在一个板上,函数hw_cpm_is_pll_locked()返回0和hw_cpm_pll_sys_on()被调用。在另一个板上,B未锁定PLL,并且未调用HW_CPM_PLL_SYS_ON()。
在崩溃时,执行陷入困境
__retained_code void hw_watchdog_handle_int(无符号long *异常_args){... ... hw_cpm_assert_trigger_gpio();if(reg_getf(crg_top,sys_stat_reg,dbg_is_active)){get the这里----> __bkpt(0);}否则{虽然(1);} ...... ......}
最后,只有在使用调试器的代码上才会发生这种情况。
在开发OTP安全引导加载程序的代码时,我禁止此错误/问题
1)我想知道我可以对它做些什么吗?
2)为什么PLL在一个板上关闭而不是另一个电路板?
谢谢,
托马斯
设备:
嗨托马斯唐豪斯,
让我根据初始帖子使用DA14683,将“设备”选择从DA14580更改为DA1468x。
你提到了这一点“最后,只有当我通过调试器逐步时,才会发生这种情况。”
您是否意味着在调试器附加时,您正在进入代码?
那是在运行申请时发生的 - 没有调试器所连接的吗?
调试器将屏蔽所有中断。因此,当PLL准备就绪时,应用程序可能正在等待获得适当的中断,从未到达,因为所有中断都被屏蔽。在一个板上发生这种情况的原因是,另一个不是,这可能是为什么中断在第二种情况下到达的原因。通常,当连接调试器时,所有中断都禁用HW级别。如果您正在进行代码,则最佳方法可能是在代码中的某处添加断点并运行它而不是踩到代码中。
但是,请指示问题是否存在,如果您在没有调试器的情况下运行应用程序时是否存在。等待您的反馈意见。此问题与安全启动功能无关 - 可能调试器会导致此功能。
谢谢,PM_DIALOG.
你好pm_dialog,
谢谢你的快速答案。我在这个问题上度过了另一个不眠之夜,我发现了这个问题:
1)减轻我呼叫的错误hw_cpm_pll_sys_off()前switch_to_pll(sysclk_pll48)。
因此,从我的视点看起来它看起来寄存器未正确设置重新启动并调用hw_cpm_pll_sys_off()inalliges它。但我仍然没有为什么在一个板上是必要的,而不是另一个。这对我有用,但我觉得它不太舒服,只长时间我没有可行的解释。
2)如果未附加调试,则此问题不会发生。
3)问题发生在任何程序上,无论在调试时,无论ROM或QSPI如何。它在第一个断点放置到哪里有重要。
谢谢!
托马斯
嗨托马斯唐豪斯,
谢谢你的建议 - 我会审查它。
>>>问题发生在未附加调试时不会发生。
这意味着如果您通常在没有连接的调试器的情况下运行代码。它正在处理两种设备。我的理解是否正确?
>>>问题发生在任何程序上,无论在调试时,无论ROM或QSPI如何。并且它在第一个断点放置到哪里无关紧要。
如前所述,这是预期的,因为当调试器附加时,中断被屏蔽。
谢谢,PM_DIALOG.
>>>>这意味着如果您通常在没有连接的调试器的情况下运行代码。它正在处理两种设备。我的理解是否正确?
是的,这是正确的!
托马斯唐豪瑟
预期此行为。如前所述,当调试器附加时,中断被屏蔽,因此这就是为什么PLL无法锁定。
谢谢,PM_DIALOG.
嗨pm_dialog,
1)您的答案不会解释为什么它在一个板上工作而不是另一张。
2)如果您所说的是真的,那么它无法在48或96 MHz上调试。但事实上它是可能的。这将意味着无法调试访问需要48 MHz的OTP的程序。所以你认真吗?
3)为什么调用hw_cpm_pll_sys_off()解决问题也没有得到你所说的。
所以我请你再次思考一个给我更详细的答案。
谢谢你,
托马斯
嗨托马斯唐豪斯,
对不起,但可能我没有正确地写作。是的,使用PLL运行时,您可以调试代码,但无法进入代码。我以为你正在进入代码。我再次读取了您的初始帖子,我看到您正在启动CLOW到PLL(CM_SYS_CLK_INIT(SYSCLK_PLL96))的时钟源)。你能给XTAL16M发起时钟,然后将其设置为PLL96吗?例如,在PXP_Reporter示例中,请使用以下配置:
请尝试上述建议,并让我知道这是否在两个董事会上。调用hw_cpm_pll_sys_off()禁用PLL,这就是为什么问题不存在的原因。
谢谢,PM_DIALOG.
你好pm_dialog,
您的建议在两个董事会的预期工作。但这是OS_Freertos的Aproach。选择OS_BareMetal时发生的问题。我使用与ble_suota_loader相同的设置(请参阅main_secure.c的init()函数)。
我的修复与hw_cpm_pll_sys_off();在调用switch_to_pll48()之前提到的电路板是必要的。
此代码有效:
如果没有修复,崩溃发生在循环中永远不会返回的循环中。
应用程序在hw_watchdog.c中陷入困境的代码:
我这个错误的问题是我没有明确的答案,为什么它发生在一个板上,为什么我的修复解决问题。所以我非常欣赏一个可以理解的答案。
谢谢,
托马斯
嗨托马斯唐豪斯,
这张票是与这个有关的吗?
https://support.dialog-semicondiondiondum./forums/post/dialog-smartbond-bluetooth-low-energy-%2%80%93-software/what-right-configuration-secure-boot.
如我之前的评论中所述,您应该将系统时钟初始化为XTAL16M,然后将其切换到PLL。原因是因为在切换到PLL之前应该稳定XTAL16M。PLL基于XTAL16M,因此XTAL16M应首先稳定,否则PLL将永远不会锁定。你起诉的sdk例子是什么?调用n hw_cpm_pll_sys_off()在调用此函数之前,必须将系统时钟设置为XTAL16M。因此,它可能与XTAL16M一起运行的系统。
谢谢,
PM_DIALOG.