官网下载的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。编译调试下载没出现这个问题,一切正常。这个问题是咋回事?
我在演示板上跑,没问题啊。是怎么出现问题的?广播包能看到吗?
不知道怎么出现的,有时候也会出这种问题,换一块板又好了
我想是不是没接闪?bond_db_init函数需要和flash进行交互
出问题的时候,你把*(挥发性无符号长*)(STATUS_BASE + 0 x14) = hardfault_args [5];/ / LR
*(volatile unsigned long *)(STATUS_BASE + 0x18) = hardfault_args[6];/ /电脑
这两个值拿到,回到地图文件,看看落在哪个函数里
谢谢。
这几个寄存器:
LR 0 xfffffff9
电脑0 x200005f0
SP 0 x20009738
地址在地图上没找到啊。
需要拿的是之前保存的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里面找到)
谢谢帮助。