大家好,
我现在在DA14580 BLE模块上使用SDK 5.0.4工作,我无法通过ARCH_PRINTF命令发送0。
发送0时,FW跳转到HardFault_Handler.c文件到第141行并留在那里。
if((getword16(sys_stat_reg)&dbg_is_up)== dbg_is_up)
__asm(“bkpt#0 \ n”);
任何帮助都会很棒。
关键词:
设备:
嗨yehudanovode,
我试图复制您提到的问题,但我可以通过arch\u printf()发送“0”。我开发了sdk5.0.4的ble\u app\u barebone示例,并使用了Pro-DK。让我描述一下我做了什么,并确保你做了同样的配置。
#elif hw_config_pro_dk.
#define uart2_tx_gpio_port gpio_port_0.
#定义UART2\U TX\U GPIO\U引脚GPIO\U引脚4
#define uart2_rx_gpio_port gpio_port_0.
#define uart2_rx_gpio_pin gpio_pin_5.
如果您有其他我们的DKS或者您正在使用自定义板,请用适当的GPIO修改上面的定义
如果我理解任何错误,请告诉我你想要完成的东西或让我很热,以调用arch_printf()进入您的代码。
谢谢,PM_DIALOG.
对不起,不够清楚。
是的,我可以通过ARCH_PRINTF发送0。
问题是当我试图回应UART的输入时。如果插入的一个字节是0x00,那么当我尝试打印保存这个字节的数组的元素时,我会收到此错误。我相信原因是0不认为是“价值”,所以当我试图打印它时,它找不到打印的东西,因此错误。
我再检查了一下这个问题,我想我确定现在出了什么问题。
我使用arch\u 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\u printf打印0时,如下所示:
examplevar = 0;
ARCH_PRINTF(“%x”,examplevar);
没有错误,但实际打印的是0的ASCII值,也就是30。我需要打印0值,而不是符号。。。
嗨yehudanovode,
你能试试这个代码片段吗?
uint8\u t ExampleArr[3]={0x00,0x01,0x02};
for(Uint8_t i = 0; I <3; I ++)
{
ARCH_PRINTF(“%X”,EXAMPLEARR [I]);
}
ARCH_PRINTF(“\ n \ r”);
否则,请提供我你的代码片段,因为你正在使用它到你的固件。
谢谢,PM_DIALOG.
你好,
正如我所提到的,ARCH_PRINTF函数通过地址ARCH_PRINTF(EXAMPLEARR)来打印阵列,而不是按value ARCH_PRINTF(Examplearr [i])打印。要更清晰,如果我有一个名为examplevar = 0x01的变量,那么编写Arch_printf(&examplevar)将结束1,在终端上打印,但如果exalvar = 0x00,则Arch_printf(&examplevar)结束了错误!!
我不使用顺利的原因是打印出的值不是实际值,而是其ASCII兼容。所以,如果我返回我的前一个例子,这就是它在这两种情况下的样子:
1)
examplevar = 0x01;
ARCH_PRINTF(&examplevar);
打印出:1
examplevar = 0x00;
ARCH_PRINTF(&examplevar);
打印输出为:错误
2)
examplevar = 0x01;
ARCH_PRINTF(“%x”,examplevar);
打印出:31
examplevar = 0x00;
ARCH_PRINTF(“%x”,examplevar);
打印出:30
我真的希望问题现在清楚了。。。
嗨yehudanovode,
抱歉耽搁了。我试着测试你的代码,这个代码片段arch\u printf(&ExampleVar)不能由Keil构建。这是一个非常奇怪的情况,因为如果我理解正确,这可以建立在你这边。而且,我的结果和你的不一样。请检查以下内容:
examplevar = 0x01;
ARCH_PRINTF(“%x”,examplevar);
打印输出为:1(而不是1的ASCII字符31)
examplevar = 0x00;
ARCH_PRINTF(“%x”,examplevar);
打印为:0(不是30,即0的ASCII字符)
如果您已修改ARCH_PRINTF()函数的源代码,请您告诉我吗?您能否在新的SDK路径中尝试这样做?请注意,我正在使用D14580系列的最新SDK(SDK5.0.4)
谢谢,PM_DIALOG.
你好,
不,我根本没有修改Arch_Prinf的源代码。
但我有更好的解决办法。为了在任何位置打印任何值的数组,我刚刚使用了uart2_write(*arr,Size,NULL)函数,当*arr是指向打印数组的指针时,Size是要打印的大小,以字节为单位,NULL是NULL指针,这是函数描述中所要求的。
嗨yehudanovode,
由于您没有修改ARCH_PRINF()函数,因此有点奇怪,因为我得到了来自的不同结果。顺便说一下,你很高兴你识上你的问题,为你的迹象表明。
谢谢,PM_DIALOG.
尊敬的论坛专家:,
我正在用sdk5.0.4开发DA14580。
我想知道主机如何从从站接收SMP请求。
我已经运行了我的代码,附着在下面,嗅探从站,但在用户函数中没有回调。
似乎它无效?
主机如何从奴隶接收SMP请求?
谢谢你的建议,
狄俄尼索斯
嗨狄俄尼索斯,
谢谢你的问题,但这与本论坛的帖子无关。如果我理解正确的话,DA14580是作为一个中心。由于您是中心设备,因此无法从外围设备请求安全性。如果您有任何其他后续问题,请创建一个新的论坛线程。如果你不知道热创建一个新的论坛线程,请让我知道,我会为你提供适当的步骤。
谢谢,PM_DIALOG.
嗨,耶胡达诺沃德斯
你可以试试我的代码,它可以发送十六进制,如下所示:
extern void UART_CALLBALL(UINT8_T RES);
UINT8_T数据= 0x00;
UART2_WRITE(&DATA,1,UART_CALLBACK);
嗨Chenpenglai,
谢谢你的指示。
你好,下午好