你好
我有两个da14683 USB开发工具包。在我的system_init()函数中,我调用
系统时钟初始化(系统时钟PLL96); 加速。
cm_sys_clk_init()依次调用此代码,其中在switch_to_pll()中。
if(cm_poll_xtal16m_ready()){切换到_xtal16();if((type==sysclk_PLL48)| |(type==sysclk_PLL96)){切换到_pll()}
在开关_到_pll()中调用此代码:
静态无效开关_至_pll(无效){如果(hw_cpm_为_pll_锁定()==0){hw_cpm_pll_系统开启();//开启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不关闭?
非常感谢。
托马斯
设备:
嗨,托马斯·唐豪瑟,
让我将“设备”选项从DA14580更改为DA1468x,因为根据您最初的帖子,您正在使用DA14683。
你提到过“最后,只有当我使用调试器单步执行代码时,才会发生这种情况。”
您的意思是,在附加调试器时,您正在单步执行代码吗?
正常运行应用程序时会发生这种情况吗?没有连接调试器?
调试器将屏蔽所有中断。因此,当PLL准备就绪时,应用程序可能正在等待获得适当的中断,而PLL永远不会到达,因为所有中断都被屏蔽了。为什么在一个电路板上发生这种情况而在另一个电路板上不发生这种情况,这可能就是为什么在第二种情况下中断提前到达的原因。通常,在连接调试器时,所有中断都在硬件级别禁用。如果要单步执行代码,最好的方法可能是在代码中的某个位置添加断点并运行它,而不是单步执行代码。
但是,在未连接调试器的情况下运行应用程序时,请指出问题是否存在。请等待您对此的反馈。此问题与安全引导功能无关-可能是调试器导致的。
谢谢,下午好
你好,PM_Dialog,
谢谢你的快速回答。我在这个问题上又度过了一个不眠之夜,我发现:
1) 为了减轻错误,我调用hw_cpm_pll_系统关闭()之前切换到pll(系统时钟PLL48).
因此,从我的观点来看,重新启动时寄存器似乎没有正确设置,调用hw_cpm_pll_sys_off()初始化寄存器。但我仍然不知道为什么这在一块板上是必要的,而在另一块板上是不必要的。这对我来说是可行的,但只要我没有一个可行的解释,我就觉得不太舒服。
2) 如果未附加调试,则不会出现问题。
3) 当附加调试时,无论是ROM还是QSPI,该问题都会发生在任何程序上。第一个断点放在哪里并不重要。
非常感谢。
托马斯
嗨,托马斯·唐豪瑟,
谢谢你的建议,我会重新考虑的。
>>>如果未附加调试,则不会出现问题。
这意味着,如果您在没有附加调试程序的情况下正常运行代码。它在这两种设备上都起作用。我的理解正确吗?
>>>当附加调试时,无论是ROM还是QSPI,该问题都会发生在任何程序上。第一个断点放在哪里并不重要。
如前所述,这是预期的,因为当附加调试器时,中断被屏蔽。
谢谢,下午好
>>>>这意味着,如果您在没有附加调试程序的情况下正常运行代码。它在这两种设备上都起作用。我的理解正确吗?
是的,这是正确的!
嗨,托马斯·唐豪瑟
这种行为是意料之中的。如前所述,当连接调试器时,中断被屏蔽,这就是PLL无法锁定的原因。
谢谢,下午好
你好,下午对话,
1) 你的回答没有解释为什么它在一块板上工作而在另一块板上不工作。
2) 如果您所说的是真的,那么就不可能在48或96 MHz上进行调试。但事实上这是可能的。这意味着不可能调试访问OTP(需要48 Mhz)的程序。你是认真的吗?
3) 为什么调用hw_cpm_pll_sys_off()来解决这个问题,你说的也没有回答。
所以我请你们再想想,给我更详细的答案。
谢谢你的问候,
托马斯
嗨,托马斯·唐豪瑟,
对不起,可能我写得不对。是的,您可以在使用PLL运行时调试代码,但您不能单步执行代码。我以为你是在进入密码。我再次阅读了您最初的帖子,我看到您正在启动PLL的时钟源(cm_sys_clk_init(sysclk_PLL96))。请您将时钟设置为XTAL16M,然后设置为PLL96,好吗?例如,在pxp_reporter示例SDK中,请使用以下配置:
请尝试上述建议,并让我知道这是否在两个板上都起作用。当调用hw_cpm_pll_sys_off()时,pll被禁用,这就是问题不存在的原因。
谢谢,下午好
你好,PM_Dialog,
你的建议在董事会和董事会上都起到了预期的作用。但这是OS_FREERTOS的一个解决方案。我提到的问题发生在选择OS_BAREMETAL时。我使用了与ble_suota_loader相同的设置(请参阅main_secure.c中的init()函数)。
我的解决方案是hw_cpm_pll_sys_off();在调用switch_to_pll48()之前,我提到的电路板上需要。
此代码适用于:
如果没有修复,崩溃将发生在最后一个while循环中,并且永远不会返回。
应用程序卡在hw_watchdog.c中的代码:
我对这个错误的问题是,我没有一个明确的答案,为什么它会发生在一块板上,为什么我的修复解决了这个问题。所以我非常希望有一个可以理解的答案。
非常感谢。
托马斯
嗨,托马斯·唐豪瑟,
这张票和这张有关吗?
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_对话框