嗨,对话框中,
基于BASIC DevKit开发了一个DA14681系统的开发板。
我们在BASIC开发工具包上正确运行的代码,它只是简单地定期打印“hello world”到COM端口。
但当我下载图像到自己设计的板,代码只运行了很短的时间,10秒后,程序停止。我们制作了5个开发板,都显示了相同的错误。
开发环境:
1.SmartSnippets工作室v1.2.3.588
2.SDK DA1468x_SDK_BTLE_v_1.0.6.968
3.外部闪存Winbond W25Q16DWSSIG QSPI 16Mbit
4.演示项目:pxp_reporter
我的问题是什么可能导致这个问题?谢谢
设备:
嗨auzzz,
问题的描述是相当通用的,我看不出问题是哪里提供的信息,你将不得不附加调试器,以检查哪里的代码已经停止,这可以给我们一个线索,发生了什么与你的自定义hw。
由于MT_dialog
嗨MT_dialog,
我们发现这个问题是由串口引起的。DA14681 Devkit USART1 Tx默认电压电平为低电平。我们使用的USB to TTL芯片是CH340,它的默认Tx是高电平的。
不同的电压水平可能导致系统崩溃,通过分离调试器的Tx,系统可以正常工作。
我的问题是为什么DA14681的Rx会导致崩溃?我们必须找到一个默认电压级别与DA14681相同的调试器吗?
我们使用硬币电池作为主要电源,而调试器提供3.3v电压水平。不同的参考电压可能会导致这个问题。
你好,
似乎我们也遇到了同样的问题,我们也设计了自己的板,我下载了SDK 1.0.6的pxp报告器。大约8秒后,它复位,然后在接下来的8秒再次复位,一次又一次……
嗨auzzz kingwheat,
我不认为UART和你的经历有什么关系,我相信是其他地方出了问题,你提到的只是另一个问题引起的副作用。一些信息,您正在使用的软件包,您的焊接配置文件,以及您的定制hw上的模板厚度是多少?
由于MT_dialog
嗨MT_dialog
我认为我的板有问题,当我使用演示项目pxp报告,我没有做任何改变,它在开发工具包中工作得很好。当我下载到我自己的板,并使用+Vbat和-Vbat供应,它重置一次又一次每8秒。但当我提供5V到Vbus或只是保持系统的电源在pm_mode_active时,它工作得很好。
SDK: DA1468x_SDK_BTLE_v_1.0.6.968
SmartSnippets Studio版本:1.2.3.588
测试项目:DA1468x_SDK_BTLE_v_1.0.6.968 \ DA1468x_SDK_BTLE_v_1.0.6.968 \ \ dk_apps \ demo \ pxp_reporter项目
嗨Kingwheat,
您是否使用UART进行调试?
嗨MT_dialog,
我们使用AQFN包,遵循开发工具包电路图。此问题只能在DA14681-01A9DEVKT-B上重现,当电源为CR2032时。
嗨auzzz,
我使用UART进行调试,并且我只在任务中打印tf。如果printf在中断的回调中,我认为可能会引起一些问题。
尝试在调试器中分离Tx并检查重置是否消失。
嗨kingwheat auzzz,
据我所知,你所经历的与你的定制PCB的接地焊接有关。因为在8到10秒后,两个板都停止了,这很可能是因为BOD开始发挥作用,并在DCDC被激活时重置你的板。8秒后,系统从LDO变为DCDC电源,当系统运行在LDO上时,获得BOD复位的唯一原因是有一个实际的电压下降,当系统运行在DCDC上时,BOD事件可能被触发,特别是如果DCDC GND引脚或中央GND垫有焊接问题。为了检查这一点,您可以通过#define dg_configUSE_BOD(0)禁用BOD,这将禁用重置(为了测试这是否是实际问题,问题仍然存在)。此外,您可以尝试按下PCB上的SoC或重新加热焊料,以改善您所经历的情况,这也将验证您有焊接问题。
另外,为了检查这是否确实是您的问题,您可以执行以下操作来检查BOD_VREF。在任何情况下,这应该精确到515mV,方差小于50mV。
因此,在启动任何新任务将BOD_VREF导出到P1_7之前,在system_init()中添加以下代码
//导出BOF_REF到P1_7
Reg_setf (gpio, test_ctrl5_reg, test_bod_vref_out, 1);//将BOD引用缓冲区输出映射到testbus
Reg_setf (anamisc, ana_test_reg, acore_testbus_en, 1);//在ACORE中启用模拟测试总线
REG_SETF(GPIO, TEST_CTRL2_REG, ANA_TESTMUX_CTRL, 0x3);//选择PADs中的模拟测试总线
hw_gpio_set_pin_function(HW_GPIO_PORT_1, HW_GPIO_PIN_7, HW_GPIO_MODE_OUTPUT, HW_GPIO_FUNC_ADC);//设置为P1.7 ADC/打开模式
保持BOD禁用,这样它就不会通过在custom_config_qspi.h文件中添加#define db_configUSE_BOD(0)来启动,并禁用休眠模式。
为了在示波器上看到这一点,你将不得不隔离电源以避免噪音,并运行电池上的笔记本电脑,以隔离它从设备可以通过地面注入噪音,所以要非常小心。
关于你可以在一个基本的套件上复制它的事实,我不能在我的设置上看到这样的东西,我下载了运行和使用UART接近报告和多链接演示运行在一个cr2032电池1.0.6 SDK。
由于MT_dialog
嗨,MT_dialog
非常感谢你回答我们的问题。
在测试之前,项目的配置是#define dg_configUSE_BOD(1),并打开休眠模式,它将重置
我有这个测试,
首先,#define dg_configUSE_BOD(0),并关闭睡眠模式,它运行良好。
其次,#define dg_configUSE_BOD(0),并打开睡眠模式,它将重置。
正如它所显示的,我发现重置是更多的相对于电源模式管理,。
还有一个问题,我遇到当我使用硬体IIC。
我操作IIC写函数像这样:ad_i2c_write();读取:ad_i2c_transact(dev, ®_addr, 1, reg_data, cnt);
如果我关掉ble栈,它会工作得很好。否则,可能会出现IIC接口中断的情况。
我很困惑,因为我是使用硬件iic,在我操作读或写功能后,我可以让我的cpu做另一件事,在完成操作后,他们会给我一个回调…在这种情况下,这一事件对硬质合金有什么影响呢?有时iic会错过回调,让我的任务停留在块..
嗨kingwheat,
如果你发现之前的回答有帮助,请标记为接受,也请不要回复一个与本线程主题无关的问题,如果你想问一个新问题,你可以创建一个新的线程。
关于你的问题,我不确定我是对的,我所理解的是你错过了中断。一般来说,BLE中断比其他中断具有更高的优先级,但这并不意味着您将错过I2C中断。可能发生的情况是,你的I2C中断与ble临界区同时发生,当ble将要休眠时,它有一个临界区禁用中断约600us,可能这就是你的程序停止的地方。
此外,对于在操作完成时引用的回调函数,您提到您使用的是同步函数ad_i2c_transact()和ad_i2c_write(),而不是相应的异步函数ad_i2c_async_transact(),这类函数以回调作为参数,不会等待操作完成,相应的回调将在操作结束时调用。
Thansk MT_dialog