8个帖子/ 0个新
最后发表
白菜
离线
最后看到:3年9个月前
加入:2014-09-02 09:54
调试下载出错的问题

官网下载的SDK5.04。没改动过,编译ble_app_security工程,调试下载出现以下问题:

如果(DEVELOPMENT_DEBUG)

wdg_freeze ();/ /停止WDOG
SetBits16 (SYS_CTRL_REG DEBUGGER_ENABLE 1);//启用调试器能够重新连接

*(volatile unsigned long *)(STATUS_BASE) = hardfault_args[0];/ / R0
*(volatile unsigned long *)(STATUS_BASE + 0x04) = hardfault_args[1];/ / R1
*(volatile unsigned long *)(STATUS_BASE + 0x08) = hardfault_args[2];/ / R2
*(volatile unsigned long *)(STATUS_BASE + 0x0C) = hardfault_args[3];/ / R3
*(volatile unsigned long *)(STATUS_BASE + 0x10) = hardfault_args[4];/ / R12
*(volatile unsigned long *)(STATUS_BASE + 0x14) = hardfault_args[5];/ / LR
*(volatile unsigned long *)(STATUS_BASE + 0x18) = hardfault_args[6];/ /电脑
*(volatile unsigned long *)(STATUS_BASE + 0x1C) = hardfault_args[7];/ / PSR
*(volatile unsigned long *)(STATUS_BASE + 0x20) = (unsigned long)hardfault_args;/ /堆栈指针

*(volatile unsigned long *)(STATUS_BASE + 0x24) = (*((volatile unsigned long *)(0xE000ED28));/ / CFSR
*(volatile unsigned long *)(STATUS_BASE + 0x28) = (*((volatile unsigned long *)(0xE000ED2C));/ / HFSR
*(volatile unsigned long *)(STATUS_BASE + 0x2C) = (*((volatile unsigned long *)(0xE000ED30));/ / DFSR
*(volatile unsigned long *)(STATUS_BASE + 0x30) = (*((volatile unsigned long *)(0xE000ED3C));/ / AFSR
*(volatile unsigned long *)(STATUS_BASE + 0x34) = (*((volatile unsigned long *)(0xE000ED34));/ / MMAR
*(volatile unsigned long *)(STATUS_BASE + 0x38) = (*((volatile unsigned long *)(0xE000ED38));/ / BFAR

if (GetWord16(SYS_STAT_REG) & DBG_IS_UP) == DBG_IS_UP)
__asm(“BKPT # 0 \ n”);//调试下载死在这里
其他的

(1);

又试了下SDK5.04的其他工程:app_sleepmode。编译调试下载没出现这个问题,一切正常。这个问题是咋回事?

关键词:
设备:
Gongyu_Dialog
离线
最后看到:1天14小时前
加入:2016-04-27 07:07
我在演示板上跑,没问题啊。是怎么出现问题的

我在演示板上跑,没问题啊。是怎么出现问题的?广播包能看到吗?

白菜
离线
最后看到:3年9个月前
加入:2014-09-02 09:54
不知道怎么出现的,有时候也会出这种问题,换一块板又好了

不知道怎么出现的,有时候也会出这种问题,换一块板又好了

Gongyu_Dialog
离线
最后看到:1天14小时前
加入:2016-04-27 07:07
我想是不是没接闪?bond_db

我想是不是没接闪?bond_db_init函数需要和flash进行交互

Gongyu_Dialog
离线
最后看到:1天14小时前
加入:2016-04-27 07:07
出问题的时候,你把*(挥发性无符号

出问题的时候,你把*(挥发性无符号长*)(STATUS_BASE + 0 x14) = hardfault_args [5];/ / LR
*(volatile unsigned long *)(STATUS_BASE + 0x18) = hardfault_args[6];/ /电脑

这两个值拿到,回到地图文件,看看落在哪个函数里

白菜
离线
最后看到:3年9个月前
加入:2014-09-02 09:54
谢谢。

谢谢。
这几个寄存器:
LR 0 xfffffff9
电脑0 x200005f0
SP 0 x20009738
地址在地图上没找到啊。

Gongyu_Dialog
离线
最后看到:1天14小时前
加入:2016-04-27 07:07
需要拿的是之前保存的LR和PC,直接从地址”状态

需要拿的是之前保存的LR和PC,直接从地址”STATUS_BASE + 0 x14”里找。而不是停在NMI_HandlerC里直接从寄存器获取的值。
*(volatile unsigned long *)(STATUS_BASE + 0x14) = hardfault_args[5];/ / LR
*(volatile unsigned long *)(STATUS_BASE + 0x18) = hardfault_args[6];/ /电脑

从地图文件里找,地址只会落在某个函数里的范围。所以能确定是哪个函数引起的。”
如果要找对应行,需要在汇编文件里找。

用fromelf .rc。/ * * *。axf > code.asm生成汇编

(fromelf.exe可以在手臂\ Keil_v5 \ \ ARMCC \ bin里面找到)

白菜
离线
最后看到:3年9个月前
加入:2014-09-02 09:54
谢谢帮助。

谢谢帮助。