在hw_cpm_pll_sys_on()上崩溃

⚠️
嗨,...感谢您来论坛。令人兴奋的消息!我们现在正在迁至我们的新论坛平台,将提供更好的功能,并包含在主对话框网站中。所有帖子和帐户都已迁移。我们现在只接受新论坛上的流量 - 请发布任何新线程https://www.dialog-seminile.com/support.。我们将在未来几天修复错误/优化搜索和标记。
10个帖子/ 0新
最后一篇
托马斯·唐豪瑟
离线
最后一次露面:1周5天前
加入: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()){切换到_xtal16();if((type==sysclk_PLL48)| |(type==sysclk_PLL96)){切换到_pll()}

在switch_to_pll()中调用此代码:

静态void switch_to_pll(void){if(hw_cpm_is_pll_locked()== 0){hw_cpm_pll_sys_on();//打开pll} ......

有趣的是,在一块板上,函数hw_cpm_是_pll_locked()返回0,调用了hw_cpm_pll_sys_on()。在另一块板B上,pll未锁定,且hw_cpm_pll_sys_On()未调用。

在崩溃时,执行陷入困境

__保留代码无效hw_看门狗hw_handle_int(无符号长*异常参数){……hw_cpm_assert_trigger_gpio();如果(REG_GETF(CRG_TOP,SYS_STAT_REG,DBG_IS ACTIVE)){卡在这里-->\uu BKPT(0)}否则{while(1)}

最后,只有当我使用调试器单步执行代码时,才会发生这种情况。

我在为OTP安全引导加载程序和

1) 我想知道我能做些什么来对付它?

2) 为什么一块板上的PLL关闭,而另一块板上的PLL不关闭?

谢谢,

托马斯

设备:
PM_DIALOG.
离线
最后一次露面:5天12小时前
职员
加入:2018-02-08 11:03
嗨,托马斯·唐豪瑟,

嗨,托马斯·唐豪瑟,

让我将“设备”选项从DA14580更改为DA1468x,因为根据您最初的帖子,您正在使用DA14683。

你提到了这一点“最后,只有当我使用调试器单步执行代码时,才会发生这种情况。”

您是否意味着在调试器附加时,您正在进入代码?

那是在运行申请时发生的 - 没有调试器所连接的吗?

调试器将屏蔽所有中断。因此,当PLL准备就绪时,应用程序可能正在等待获得适当的中断,从未到达,因为所有中断都被屏蔽。在一个板上发生这种情况的原因是,另一个不是,这可能是为什么中断在第二种情况下到达的原因。通常,当连接调试器时,所有中断都禁用HW级别。如果您正在进行代码,则最佳方法可能是在代码中的某处添加断点并运行它而不是踩到代码中。

但是,请指示问题是否存在,如果您在没有调试器的情况下运行应用程序时是否存在。等待您的反馈意见。此问题与安全启动功能无关 - 可能调试器会导致此功能。

谢谢,PM_DIALOG.

托马斯·唐豪瑟
离线
最后一次露面:1周5天前
加入:2019-10-20 10:45
你好,PM_Dialog,

你好,PM_Dialog,

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

1)减轻我呼叫的错误hw_cpm_pll_系统关闭()switch_to_pll(sysclk_pll48)

if(!hw_cpm_check_xtal16m_status()){hw_cpm_enable_xtal16m();while(!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 Controller * / hw_otpc_init();......

因此,从我的观点来看,重新启动时寄存器似乎没有正确设置,调用hw_cpm_pll_sys_off()初始化寄存器。但我仍然不知道为什么这在一块板上是必要的,而在另一块板上是不必要的。这对我来说是可行的,但只要我没有一个可行的解释,我就觉得不太舒服。

2)如果未附加调试,则此问题不会发生。

3)问题发生在任何程序上,无论在调试时,无论ROM或QSPI如何。它在第一个断点放置到哪里有重要。

非常感谢。

托马斯

PM_DIALOG.
离线
最后一次露面:5天12小时前
职员
加入:2018-02-08 11:03
嗨,托马斯·唐豪瑟,

嗨,托马斯·唐豪瑟,

谢谢你的建议 - 我会审查它。

>>>问题发生在未附加调试时不会发生。

这意味着,如果您在没有附加调试程序的情况下正常运行代码。它在这两种设备上都起作用。我的理解正确吗?

>>>问题发生在任何程序上,无论在调试时,无论ROM或QSPI如何。并且它在第一个断点放置到哪里无关紧要。

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

谢谢,PM_DIALOG.

托马斯·唐豪瑟
离线
最后一次露面:1周5天前
加入:2019-10-20 10:45
>>>>这意味着如果你

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

是的,这是正确的!

PM_DIALOG.
离线
最后一次露面:5天12小时前
职员
加入:2018-02-08 11:03
嗨,托马斯·唐豪瑟

嗨,托马斯·唐豪瑟

这种行为是意料之中的。如前所述,当连接调试器时,中断被屏蔽,这就是PLL无法锁定的原因。

谢谢,PM_DIALOG.

托马斯·唐豪瑟
离线
最后一次露面:1周5天前
加入:2019-10-20 10:45
你好,下午对话,

你好,下午对话,

1)您的答案不会解释为什么它在一个板上工作而不是另一张。

2) 如果您所说的是真的,那么就不可能在48或96 MHz上进行调试。但事实上这是可能的。这意味着不可能调试访问OTP(需要48 Mhz)的程序。你是认真的吗?

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

所以我请你再次思考一个给我更详细的答案。

谢谢你,

托马斯

PM_DIALOG.
离线
最后一次露面:5天12小时前
职员
加入:2018-02-08 11:03
嗨,托马斯·唐豪瑟,

嗨,托马斯·唐豪瑟,

对不起,可能我写得不对。是的,您可以在使用PLL运行时调试代码,但您不能单步执行代码。我以为你是在进入密码。我再次阅读了您最初的帖子,我看到您正在启动PLL的时钟源(cm_sys_clk_init(sysclk_PLL96))。请您将时钟设置为XTAL16M,然后设置为PLL96,好吗?例如,在pxp_reporter示例SDK中,请使用以下配置:

cm_sys_clk_init(sysclk XTAL16M);cm_apb_set_clock_分配器(apb_div1);cm_ahb_装置_时钟_分配器(ahb_div1);cm_lp_clk_init();/*../**设置系统时钟*/cm\U系统时钟设置(系统时钟PLL96);

请尝试上述建议,并让我知道这是否在两个董事会上。调用hw_cpm_pll_sys_off()禁用PLL,这就是为什么问题不存在的原因。

谢谢,PM_DIALOG.

托马斯·唐豪瑟
离线
最后一次露面:1周5天前
加入:2019-10-20 10:45
你好,PM_Dialog,

你好,PM_Dialog,

你的建议在董事会和董事会上都起到了预期的作用。但这是OS_FREERTOS的一个解决方案。我提到的问题发生在选择OS_BAREMETAL时。我使用了与ble_suota_loader相同的设置(请参阅main_secure.c中的init()函数)。

我的解决方案是hw_cpm_pll_sys_off();在调用switch_to_pll48()之前,我提到的电路板上需要。

此代码有效:

静态void init(void){if(!hw_cpm_check_xtal16m_status()){hw_cpm_enable_xtal16m();while(!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 Controller * / hw_otpc_init();/ *修复解决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 }

如果没有修复,崩溃将发生在最后一个while循环中,并且永远不会返回。

无效hw_cpm_pll_sys_on(void){../*并等待锁定。*/while((GPREG->pll_sys_STATUS_REG®_MSK(GPREG,pll_sys_STATUS_REG,pll_lock_FINE))==0{}

应用程序卡在hw_watchdog.c中的代码:

__保留代码无效hw_watchdog_handle_int(无符号长*异常参数){…hw_cpm_assert_trigger_gpio();if(REG_GETF(CRG_TOP,SYS_STAT_REG,DBG_IS ACTIVE)){uu BKPT(0)//<--------------这里卡住了}

我这个错误的问题是我没有明确的答案,为什么它发生在一个板上,为什么我的修复解决问题。所以我非常欣赏一个可以理解的答案。

谢谢,

托马斯

PM_DIALOG.
离线
最后一次露面:5天12小时前
职员
加入:2018-02-08 11:03
嗨,托马斯·唐豪瑟,

嗨,托马斯·唐豪瑟,

这张票是与这个有关的吗?

https://support.dialog-semiconductor.com/forums/post/dialog-smartbond-bluetooth-low-energy-%E2%80%93-软件/什么是正确的配置安全引导

正如我在前面的评论中提到的,您应该将系统时钟初始化为XTAL16M,然后将其切换为PLL。原因是XTAL16M在切换到PLL之前应稳定。PLL基于XTAL16M,因此应首先稳定XTAL16M,否则PLL将永远不会锁定。您正在起诉的SDK示例是什么?调用n hw_cpm_pll_sys_off()时,在调用此函数之前,系统时钟必须设置为XTAL16M。因此,它可能使用XTAL16M运行的系统。

谢谢

PM_DIALOG.