你好,
我现在工作与SDK 5.0.4的DA14580 BLE模块,我不能通过arch_printf命令发送0。
当发送0时,FW跳转到hardfault_handler.c文件的第141行并保持不变。
if (GetWord16(SYS_STAT_REG) & DBG_IS_UP) == DBG_IS_UP)
__asm(“BKPT # 0 \ n”);
任何帮助都很好。
关键词:
设备:
嗨YehudaNovodes,
我试图复制你提到的问题,但我可以通过arch_printf()发送“0”。我在SDK 5.0.4的ble_app_barebone示例上工作,我使用了Pro-DK。让我描述一下我做了什么,并确保你做了相同的配置。
# elif HW_CONFIG_PRO_DK
#定义UART2_TX_GPIO_PORT GPIO_PORT_0
#定义UART2_TX_GPIO_PIN GPIO_PIN_4
#定义UART2_RX_GPIO_PORT GPIO_PORT_0
#定义UART2_RX_GPIO_PIN GPIO_PIN_5
如果您有我们的另一个dk或如果您正在定制板上工作,请使用适当的gpio修改上述定义
如果我理解错了什么,请让我知道你试图完成什么或提供我热调用arch_printf()到你的代码。
谢谢,PM_Dialog
对不起,我说的不够清楚。
是的,我可以通过arch_printf发送0。
问题是当我试图通过UART回显输入时。如果插入的一个字节是0x00,那么当我试图打印保存这个字节的数组的元素时,我得到这个错误。我相信原因是,0不考虑作为一个“值”,所以当我试图打印它,它找不到要打印的东西,因此错误。
我检查了一下这个问题,我想我现在确定是什么问题了。
我使用arch_printf函数来打印一个数组。例如,如果数组的内容是:
ExampleArr[2] = {0x01, 0x02};
我试着逃跑
arch_printf (ExampleArr);
打印出来的是01 02,这正是我想要的。当ExampleArr的第一个元素是0x00时,问题就开始了,然后SW会遇到
if (GetWord16(SYS_STAT_REG) & DBG_IS_UP) == DBG_IS_UP)
__asm(“BKPT # 0 \ n”);
错误。
如果第二个元素是0x00,没有问题。
当我尝试使用arch_printf来像这样打印0时:
ExampleVar = 0;
arch_printf(“% x”,ExampleVar);
没有错误,但实际上打印的是ASCII值0,也就是30。我需要打印0值,而不是符号…
嗨YehudaNovodes,
您能试一下这段代码吗?
uint8_t ExampleArr[3] = {0x00, 0x01, 0x02};
For (uint8_t I = 0;我< 3;我+ +)
{
arch_printf(“% x”,ExampleArr[我]);
}
arch_printf (" \ n \ r ");
否则,请提供您的代码片段,因为您正在使用它到您的固件。
谢谢,PM_Dialog
你好,
如前所述,arch_printf函数通过地址arch_printf(ExampleArr)而不是值arch_printf(ExampleArr[I])获取要打印的数组。更清楚地说,如果我有一个名为ExampleVar = 0x01的变量,那么写arch_printf(&ExampleVar)的结果是1,在终端上打印,但如果ExampleVar = 0x00, arch_printf(&ExampleVar)的结果是错误!!
我不使用你的方式的原因是,打印出来的值不是实际的值,但它的ASCII兼容。那么,如果我回到我之前的例子,这是两种情况下的样子:
1)
ExampleVar = 0 x01;
arch_printf (&ExampleVar);
打印结果为:1
ExampleVar = 0 x00;
arch_printf (&ExampleVar);
打印出来是:错误
2)
ExampleVar = 0 x01;
arch_printf(“% x”,ExampleVar);
打印出来是:31
ExampleVar = 0 x00;
arch_printf(“% x”,ExampleVar);
打印出来是:30
我真的希望问题现在清楚了……
嗨YehudaNovodes,
很抱歉耽搁了。我试着测试你的代码,这个代码片段arch_printf(&ExampleVar)不能由Keil构建。这是一个很奇怪的情况,因为如果我理解正确的话,这可以从你的角度建立。而且,我的结果和你的不一样。请查阅以下资料:
ExampleVar = 0 x01;
arch_printf(“% x”,ExampleVar);
输出为:1(而不是31,它是ASCII字符1)
ExampleVar = 0 x00;
arch_printf(“% x”,ExampleVar);
输出为:0(而不是30,这是ASCII字符0)
请问你是否修改了arch_printf()函数的源代码?你能试着在一个新的SDK路径做同样的事情吗?请注意,我使用的是最新的D14580系列SDK (SDK5.0.4)
谢谢,PM_Dialog
你好,
不,我根本没有修改你的arch_prinf源代码。
但我有个更好的办法。打印数组的值在任何位置,我只是使用了uart2_write (arr *,大小,NULL)函数,当* arr打印数组的指针,印刷尺寸大小,以字节为单位,和零是空指针,需要描述的功能。
嗨YehudaNovodes,
由于您没有修改arch_prinf()函数,这有点奇怪,因为我得到的结果与您的不同。顺便说一句,很高兴你搞清楚了你的问题还有你的暗示。
谢谢,PM_Dialog
亲爱的论坛专家,
我正在工作与sdk5.0.4 DA14580。
我想知道主机如何接收来自slave的SMP请求。
我已经运行了下面的代码,嗅探从服务器,但是在用户函数中没有CALLBACK。
看来是无效的?
主机如何接收从服务器的SMP请求?
由于advcance,
狄俄尼索斯
嗨,狄俄尼索斯,
谢谢你的问题,但这与本论坛无关。如果我理解正确的话,DA14580是一个中心。由于您是一个中心,您不能从外设请求安全性。如果您有任何后续问题,请创建一个新的论坛帖子。如果你不知道热创建一个新的论坛帖子,请让我知道,我将提供你适当的步骤。
谢谢,PM_Dialog
嗨YehudaNovodes,
你可以试试我的代码可以发送十六进制,如下所示:
Extern void uart_callback(uint8_t res);
uint8_t数据= 0 x00;
uart2_write(平1 uart_callback);
嗨chenpenglai,
谢谢你的提示。
问候,PM_DIalog