我有一个自定义板,我为我的应用程序修改了示例ble_app_all_in_one。我使用ARCH_EXT_SLEEP_OTP_COPY_ON。到目前为止,一切都正常,但是当我禁用CFG_DEVELOPMENT_DEBUG时,设备会在几秒钟后重新启动。
有什么可能发生的线索吗?
嗨,螺旋,
这个宏启用开发/调试模式。对于生产模式构建,必须禁用它。请定义此宏并在调试模式下运行代码。你的固件会崩溃吗?
谢谢,PM_Dialog
是的,当我定义这个宏时,一切正常(没有崩溃)。
我想禁用它的生产模式,但然后它崩溃后大约两秒钟和重启-但只有当我烧到Flash,而不是当我在调试器运行它。
我在OTP中刻录了引导加载程序。
你打算烧了OTP然后从那里启动吗?当启用CFG_DEVELOPMENT_DEBUG时,它允许模拟到System RAM的OTP镜像。你能说明一下你在OTP中烧了哪个bootloader吗?如果您将睡眠配置更改为ARCH_EXT_SLEEP_ON,您还会面临同样的问题吗?
我们的HW制造商在OTP中烧毁了一个引导加载程序,我们从那里启动,在flash中没有引导加载程序。不幸的是,我不知道到底是哪个引导加载程序,但我怀疑它是相当标准的(但可能是一个较老的SDK?)
当我使用ble_app_all_in_one时也会发生这个问题。我只是添加了一个LED输出来查看FW什么时候在运行,什么时候在重启……启用CFG_DEVELOPMENT_DEBUG后,一切工作正常。但是当我禁用CFG_DEVELOPMENT_DEBUG时,它每5秒重新启动一次。如果我通过BLE快速连接,在5秒之前,它不会重新启动,只要我保持连接。只要我断开连接,几秒钟后它就会重新启动。
这发生在ARCH_EXT_SLEEP_OTP_COPY_ON和ARCH_EXT_SLEEP_ON…
能否分享一下你做了哪些修改?请尝试使用SDK的ble_app_barebone示例,不使用睡眠模式,并且未定义CFG_DEVELOPMENT_DEBUG。当从Flash启动时,你会遇到同样的问题吗?也请尝试从System-RAM启动。
我对ble_app_all_in_one项目以及ble_app_barebone所做的唯一修改是将这些行添加到user_periph_setup.c GPIO_reservations()和set_pad_functions()以关闭板的led。引导加载程序打开所有三个led,因此我可以通过led的状态看到重启何时发生。
#define GPIO_RED_LED_PORT GPIO_PORT_0 #define GPIO_RED_LED_PIN GPIO_PIN_2 #define GPIO_GREEN_LED_PORT GPIO_PIN_2 #define GPIO_GREEN_LED_PIN GPIO_PIN_5 #define GPIO_BLUE_LED_PORT GPIO_PORT_2 #define GPIO_PIN_9 RESERVE_GPIO(LED, GPIO_RED_LED_PORT, GPIO_RED_LED_PIN, PID_GPIO);Reserve_gpio (led, gpio_green_led_port, gpio_green_led_pin, pid_gpio);Reserve_gpio (led, gpio_blue_led_port, gpio_blue_led_pin, pid_gpio);GPIO_ConfigurePin(GPIO_RED_LED_PORT, GPIO_RED_LED_PIN, OUTPUT, PID_GPIO, true);GPIO_ConfigurePin(GPIO_GREEN_LED_PORT, GPIO_GREEN_LED_PIN, OUTPUT, PID_GPIO, true);GPIO_ConfigurePin(GPIO_BLUE_LED_PORT, GPIO_BLUE_LED_PIN, OUTPUT, PID_GPIO, true);
问题:
你有一个定制板,或者你正在使用我们的任何开发工具包?由于这两个项目都在活动模式下工作,并且CFG_DEVELOPMENT_DEBUG未定义,我猜问题可能与睡眠模式有关。你用哪个时钟作为低功耗时钟?
是的,显然问题与睡眠模式有关。
问题发生在自定义板上,如上所述。定制板已经烧了OTP。
我也有一个基本的开发工具包,那里的问题不会发生,但也不是OTP烧在那里。
我的OTP头说睡眠时钟源=外部晶体。HW文档也确认32k振荡器被用作扩展睡眠模式的时钟。也许我没有在我的应用程序中正确配置?检查什么?
当然我可以烧SPI flash,但如果我烧bootloader到flash和OTP也被烧了,它会在flash中使用bootloader吗?似乎不是,我今天也测试过。当我将引导加载程序刻录到Flash时也会发生这个问题。
当我通过Keil下载固件时,它会通过调试器。当使用调试器时,问题不会发生。有没有办法通过Keil下载固件,然后分离调试器?
好的,我已经在arch_main.c中找到了下面两行:
SetBits16 (SYS_CTRL_REG DEV_PHASE 1);retained_ram_blocks = ret_mode;
如果存在这些问题,比如定义DEVELOPMENT_DEBUG时,则不存在崩溃/重新引导。
根据DA14585数据表,SYS_CTRL_REG的DEV_PHASE位域设置了开发阶段模式。如果设置了这个位,结合OTP_COPY位,OTP DMA将模拟到系统RAM的OTP镜像。实际上并没有对RAM进行写操作,但是所花费的时间与发生镜像时的时间完全相同。这是为了模拟行为,就好像系统代码已经在OTP中,镜像在唤醒后发生,但(开发)代码仍然驻留在外部源代码中。如果这个位被设置为'0'并且OTP_COPY='1',那么OTP DMA将在唤醒时实际执行OTP镜像。
那么,当拥有开发阶段模式时,代码在所有情况下都能正确运行吗?
是的,这就是我上面说的。是的,我读过数据表。
谢谢您的指点。
问候,PM_Dialog
有什么消息吗?你认为我应该在生产版本中启用这个标志吗?对我来说,这个问题还没有解决。这充其量是一种变通方法。
你在ble_app_all_in_one项目中做过其他修改吗?默认SDK在广告期间使用OTP复制的扩展睡眠模式。请检查user_app_adv_start()。如果您有CFG_DEVELOPMENT_DEBUG,我假设您应该烧录OTP。然而,要注意OTP代表One Time Programmable,因此您不能多次擦除和重写OTP,但您只能翻转仍然设置为0的位并将其变为1。
嗨,螺旋,
这个宏启用开发/调试模式。对于生产模式构建,必须禁用它。请定义此宏并在调试模式下运行代码。你的固件会崩溃吗?
谢谢,PM_Dialog
是的,当我定义这个宏时,一切正常(没有崩溃)。
我想禁用它的生产模式,但然后它崩溃后大约两秒钟和重启-但只有当我烧到Flash,而不是当我在调试器运行它。
我在OTP中刻录了引导加载程序。
嗨,螺旋,
你打算烧了OTP然后从那里启动吗?当启用CFG_DEVELOPMENT_DEBUG时,它允许模拟到System RAM的OTP镜像。你能说明一下你在OTP中烧了哪个bootloader吗?如果您将睡眠配置更改为ARCH_EXT_SLEEP_ON,您还会面临同样的问题吗?
谢谢,PM_Dialog
我们的HW制造商在OTP中烧毁了一个引导加载程序,我们从那里启动,在flash中没有引导加载程序。不幸的是,我不知道到底是哪个引导加载程序,但我怀疑它是相当标准的(但可能是一个较老的SDK?)
当我使用ble_app_all_in_one时也会发生这个问题。我只是添加了一个LED输出来查看FW什么时候在运行,什么时候在重启……启用CFG_DEVELOPMENT_DEBUG后,一切工作正常。但是当我禁用CFG_DEVELOPMENT_DEBUG时,它每5秒重新启动一次。如果我通过BLE快速连接,在5秒之前,它不会重新启动,只要我保持连接。只要我断开连接,几秒钟后它就会重新启动。
这发生在ARCH_EXT_SLEEP_OTP_COPY_ON和ARCH_EXT_SLEEP_ON…
嗨,螺旋,
能否分享一下你做了哪些修改?请尝试使用SDK的ble_app_barebone示例,不使用睡眠模式,并且未定义CFG_DEVELOPMENT_DEBUG。当从Flash启动时,你会遇到同样的问题吗?也请尝试从System-RAM启动。
谢谢,PM_Dialog
我对ble_app_all_in_one项目以及ble_app_barebone所做的唯一修改是将这些行添加到user_periph_setup.c GPIO_reservations()和set_pad_functions()以关闭板的led。引导加载程序打开所有三个led,因此我可以通过led的状态看到重启何时发生。
问题:
嗨,螺旋,
你有一个定制板,或者你正在使用我们的任何开发工具包?由于这两个项目都在活动模式下工作,并且CFG_DEVELOPMENT_DEBUG未定义,我猜问题可能与睡眠模式有关。你用哪个时钟作为低功耗时钟?
谢谢,PM_Dialog
是的,显然问题与睡眠模式有关。
问题发生在自定义板上,如上所述。定制板已经烧了OTP。
我也有一个基本的开发工具包,那里的问题不会发生,但也不是OTP烧在那里。
我的OTP头说睡眠时钟源=外部晶体。HW文档也确认32k振荡器被用作扩展睡眠模式的时钟。也许我没有在我的应用程序中正确配置?检查什么?
当然我可以烧SPI flash,但如果我烧bootloader到flash和OTP也被烧了,它会在flash中使用bootloader吗?似乎不是,我今天也测试过。当我将引导加载程序刻录到Flash时也会发生这个问题。
当我通过Keil下载固件时,它会通过调试器。当使用调试器时,问题不会发生。有没有办法通过Keil下载固件,然后分离调试器?
好的,我已经在arch_main.c中找到了下面两行:
如果存在这些问题,比如定义DEVELOPMENT_DEBUG时,则不存在崩溃/重新引导。
嗨,螺旋,
根据DA14585数据表,SYS_CTRL_REG的DEV_PHASE位域设置了开发阶段模式。如果设置了这个位,结合OTP_COPY位,OTP DMA将模拟到系统RAM的OTP镜像。实际上并没有对RAM进行写操作,但是所花费的时间与发生镜像时的时间完全相同。这是为了模拟行为,就好像系统代码已经在OTP中,镜像在唤醒后发生,但(开发)代码仍然驻留在外部源代码中。如果这个位被设置为'0'并且OTP_COPY='1',那么OTP DMA将在唤醒时实际执行OTP镜像。
那么,当拥有开发阶段模式时,代码在所有情况下都能正确运行吗?
谢谢,PM_Dialog
是的,这就是我上面说的。是的,我读过数据表。
嗨,螺旋,
谢谢您的指点。
问候,PM_Dialog
有什么消息吗?你认为我应该在生产版本中启用这个标志吗?对我来说,这个问题还没有解决。这充其量是一种变通方法。
嗨,螺旋,
你在ble_app_all_in_one项目中做过其他修改吗?默认SDK在广告期间使用OTP复制的扩展睡眠模式。请检查user_app_adv_start()。如果您有CFG_DEVELOPMENT_DEBUG,我假设您应该烧录OTP。然而,要注意OTP代表One Time Programmable,因此您不能多次擦除和重写OTP,但您只能翻转仍然设置为0的位并将其变为1。
谢谢,PM_Dialog