⚠️
大家好. .感谢来到论坛。令人兴奋的消息!我们现在正在转移到新的论坛平台的过程中,它将提供更好的功能,并包含在主对话网站。所有的帖子和账号已经迁移。我们现在只接受新论坛的流量-请发布任何新的帖子在//www.xmece.com/support.我们会在接下来的几天修复bug /优化搜索和标记。
10个帖子/ 0个新帖子
最后发表
托马斯唐豪瑟
离线
最后看到:6天前1周
加入:2019-10-20 10:45
在hw_cpm_pll_sys_on ()

你好,

我有两个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()中调用以下代码:

Static 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在一个板上关闭而不是另一个电路板?

谢谢你!

托马斯。

设备:
PM_Dialog
离线
最后看到:6天8小时前
工作人员
加入:2018-02-08 11:03
嗨托马斯唐豪斯,

嗨托马斯唐豪斯,

让我根据初始帖子使用DA14683,将“设备”选择从DA14580更改为DA1468x。

你提到“最后,只有当我通过调试器逐步时,才会发生这种情况。”

您的意思是在附加调试器时进入代码吗?

在没有附加调试器的情况下正常运行应用程序时会发生这种情况吗?

调试器将屏蔽所有中断。因此,当PLL准备好时,应用程序可能正在等待获得适当的中断,但它永远不会到达,因为所有的中断都被屏蔽掉了。为什么这在一个板上发生而在另一个板上没有,这可能就是为什么在第二种情况中中断来得更早的原因。通常,当附加调试器时,所有中断在HW级别禁用。如果您要进入代码,最好的方法可能是在代码的某个地方添加一个断点并运行它,而不是进入代码。

但是,当您在没有附加调试器的情况下运行应用程序时,请指出问题是否存在。等待你的反馈。这个问题与安全启动功能无关——可能是调试器导致的。

谢谢,PM_Dialog

托马斯唐豪瑟
离线
最后看到:6天前1周
加入:2019-10-20 10:45
你好pm_dialog,

你好pm_dialog,

谢谢你快速的回答。我在这个问题上又度过了一个不眠之夜,我发现了这个:

1)为了减少我调用的错误hw_cpm_pll_sys_off()之前switch_to_pll (sysclk_PLL48)

If (!hw_cpm_check_xtal16m_status()) {hw_cpm_enable_xtal16m();而(! hw_cpm_is_xtal16m_trimmed ());} hw_cpm_set_sysclk (SYS_CLK_IS_XTAL16M);hw_cpm_set_hclk_div (0);hw_cpm_set_pclk_div (0);/*这是为了避免错误*/ hw_cpm_pll_sys_off();/*加速启动时间*/ switch_to_pll(sysclk_PLL48);/*启用OTP控制器*/ hw_otpc_init();……

因此,从我的视点看起来它看起来寄存器未正确设置重新启动并调用hw_cpm_pll_sys_off()inalliges它。但我仍然没有为什么在一个板上是必要的,而不是另一个。这对我有用,但我觉得它不太舒服,只长时间我没有可行的解释。

2)如果没有附带调试,就不会出现问题。

3)在附加了调试的情况下,无论ROM还是QSPI,任何程序都会出现问题。第一个断点放在哪里并不重要。

谢谢!

托马斯。

PM_Dialog
离线
最后看到:6天8小时前
工作人员
加入:2018-02-08 11:03
嗨托马斯唐豪斯,

嗨托马斯唐豪斯,

谢谢你的建议,我会审核的。

>>>如果没有附加调试,则不会出现问题。

这意味着如果您通常在没有连接的调试器的情况下运行代码。它在两种设备上都能运行。我的理解正确吗?

当附加了调试时,任何程序都会出现问题,无论是ROM还是QSPI。第一个断点放在哪里并不重要。

如前所述,这是预期的,因为当附加调试器时,中断将被屏蔽。

谢谢,PM_Dialog

托马斯唐豪瑟
离线
最后看到:6天前1周
加入:2019-10-20 10:45
>>>>这意味着如果你

>>>>这意味着如果你在没有附加调试器的情况下正常运行代码。它在两种设备上都能运行。我的理解正确吗?

是的,这是正确的!

PM_Dialog
离线
最后看到:6天8小时前
工作人员
加入:2018-02-08 11:03
托马斯唐豪瑟

托马斯唐豪瑟

预期此行为。如前所述,当调试器附加时,中断被屏蔽,因此这就是为什么PLL无法锁定。

谢谢,PM_Dialog

托马斯唐豪瑟
离线
最后看到:6天前1周
加入:2019-10-20 10:45
嗨pm_dialog,

嗨pm_dialog,

1)你的答案没有解释为什么它在一个板上工作,而不是在另一个板上。

2)如果您所说的是真的,那么它无法在48或96 MHz上调试。但事实上它是可能的。这将意味着无法调试访问需要48 MHz的OTP的程序。所以你认真吗?

3)为什么调用hw_cpm_pll_sys_off()解决问题也没有回答你所说的。

所以我要求你再考虑一下,给我更详细的答案。

谢谢你的问候,

托马斯。

PM_Dialog
离线
最后看到:6天8小时前
工作人员
加入:2018-02-08 11:03
嗨托马斯唐豪斯,

嗨托马斯唐豪斯,

对不起,但可能我没有正确地写作。是的,使用PLL运行时,您可以调试代码,但无法进入代码。我以为你正在进入代码。我再次读取了您的初始帖子,我看到您正在启动CLOW到PLL(CM_SYS_CLK_INIT(SYSCLK_PLL96))的时钟源)。你能给XTAL16M发起时钟,然后将其设置为PLL96吗?例如,在PXP_Reporter示例中,请使用以下配置:

cm_sys_clk_init(sysclk_xtal16m);cm_apb_set_clock_divider(apb_div1);cm_ahb_set_clock_divider(ahb_div1);cm_lp_clk_init();/* .......*/ / *设置系统时钟* / cm_sys_clk_set(sysclk_pll96);

请尝试上述建议,并让我知道这是工作在两个板。当调用hw_cpm_pll_sys_off()时,PLL被禁用,这就是问题不存在的原因。

谢谢,PM_Dialog

托马斯唐豪瑟
离线
最后看到:6天前1周
加入:2019-10-20 10:45
你好pm_dialog,

你好pm_dialog,

您的建议在两个董事会的预期工作。但这是OS_Freertos的Aproach。选择OS_BareMetal时发生的问题。我使用与ble_suota_loader相同的设置(请参阅main_secure.c的init()函数)。

我的修复与hw_cpm_pll_sys_off();在调用switch_to_pll48()之前提到的电路板是必要的。

这段代码:

Static void init(void) {if (!hw_cpm_check_xtal16m_status()) {hw_cpm_enable_xtal16m();而(! hw_cpm_is_xtal16m_trimmed ());} hw_cpm_set_sysclk (SYS_CLK_IS_XTAL16M);hw_cpm_set_hclk_div (0);hw_cpm_set_pclk_div (0);/*启用OTP控制器*/ hw_otpc_init();/* FIX THAT SOLVED THE PROBLEM OF chashing IN hw_cpm_pll_sys_on() */ hw_cpm_pll_sys_off();/*加速启动时间*/ switch_to_pll48();hw_watchdog_freeze ();//停止看门狗hw_cpm_deactivate_pad_latches(); // enable pads hw_cpm_power_up_per_pd(); // exit peripheral power down }

如果没有修复,崩溃发生在循环中永远不会返回的循环中。

void hw_cpm_pll_sys_on(void){.... / *等到锁定。* / whist((gpreg-> pll_sys_status_reg&reg_msk(gpreg,pll_sys_status_reg,pll_lock_fine))== 0){}}

应用程序在hw_watchdog.c中陷入困境的代码:

__retataDed_code void hw_watchdog_handle_int(无符号长*异常_args){.... hw_cpm_aster_trigger_gpio();if(reg_getf(crg_top,sys_stat_reg,dbg_is_active)){__bkpt(0);// <---------------这里陷入困境} ...}

我的问题与这个错误是,我没有一个明确的答案,为什么它发生在一个板和为什么我的修复解决了这个问题。所以我非常希望你能给我一个理解的答案。

谢谢你!

托马斯。

PM_Dialog
离线
最后看到:6天8小时前
工作人员
加入:2018-02-08 11:03
嗨托马斯唐豪斯,

嗨托马斯唐豪斯,

这张票和这张有关系吗?

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