我在SMARTTAG和睡眠模式的源代码中找到了这个功能,但是在SDK参考中找不到它的用法,它是如何工作的?它会唤醒核心吗?还是在我触发中断后核心被唤醒?
嗨daniel59,
它只是一个用于唤醒时使用的api,通过app_easy_wakeup_set(),您只需为设备设置一个回调函数,以便在从app_easy_wakeup函数()发送唤醒消息时立即执行。因此,app_easy_wakeup()函数将从唤醒计时器中断中调用(它将特定的消息推送到内核中),一旦内核被唤醒并调度消息,您通过app_easy_wakeup_set()设置的函数将被触发。
由于MT_dialog
如果我想把LED打开延长睡眠模式。我应该如何编写代码?
1.app_button_press_cb {turn_on_led ();}on_init () {wkupct_register_callback (app_button_press_cb);wkupct_enable_irq(WKUPCT_PIN_SELECT(GPIO_BUTTON_PORT, GPIO_BUTTON_PIN), // select pin (GPIO_BUTTON_PORT, GPIO_BUTTON_PIN)wkupct_pin_极性(GPIO_BUTTON_PORT, GPIO_BUTTON_PIN, WKUPCT_PIN_POLARITY_LOW), //极性低1, // 1事件40);// debging time = 0}或2。wakeup_cb () {turn_on_led ();}app_button_press_cb () {app_easy_wakeup_set (turn_on_led);app_easy_wakeup ();}
on_init () {wkupct_register_callback (app_button_press_cb);wkupct_enable_irq(WKUPCT_PIN_SELECT(GPIO_BUTTON_PORT, GPIO_BUTTON_PIN), // select pin (GPIO_BUTTON_PORT, GPIO_BUTTON_PIN)wkupct_pin_极性(GPIO_BUTTON_PORT, GPIO_BUTTON_PIN, WKUPCT_PIN_POLARITY_LOW), //极性低1, // 1事件40);// debging time = 0}
我应该把arch_disable_sleep函数放在哪里?
在开始发布时设置唤醒中断(如果设备将以扩展睡眠模式发布),或者在从.app_on_adv_undirect_complete完成发布过程时设置唤醒中断。中断的设置可以如下所示:
app_easy_wakeup_set (app_wakeup_cb);// app_wakeup_cb是你要打开LED的地方,所以它只包含函数GPIOSetActive()。wkupct_register_callback (app_button_press_cb);// app_button_press是唤醒中断的回调(描述如下)wkupct_enable_irq(WKUPCT_PIN_SELECT(GPIO_BUTTON_PORT, GPIO_BUTTON_PIN), // select pin (GPIO_BUTTON_PORT, GPIO_BUTTON_PIN)wkupct_pin_极性(GPIO_BUTTON_PORT, GPIO_BUTTON_PIN, WKUPCT_PIN_POLARITY_LOW), //极性低1, // 1事件40);// debging time = 0
静态孔隙app_button_press_cb(空白){如果(GetBits16 (SYS_STAT_REG PER_IS_DOWN)){periph_init ();}
如果(arch_ble_ext_wakeup_get ()){arch_set_sleep_mode (ARCH_SLEEP_OFF);//禁用休眠模式arch_ble_force_wakeup ();//强制唤醒BLEarch_ble_ext_wakeup_off ();//禁用外部唤醒(如果你在进入永久休眠之前设置了arch_ble_ext_wakeup_on()函数)app_easy_wakeup ();//一旦BLE被唤醒,就按顺序调用app_easy_wakeup()来执行app_wakeup_cb()函数并打开//LED}}
嗨MT_dialog,
但我发现在SMARTTAG源代码中,app_easy_wakeup()就在app_easy_wakeup_set()之后;
你的意思是我必须在app_easy_wakeup之前修改睡眠模式?或者我可以在简单唤醒回调中修改睡眠模式吗?
我的代码没有关闭BLE,所以我可以直接使用app_easy_wakeup没有if (arch_ble_ext_wakeup_get())?
如果我有更多的操作后,核心唤醒,我应该把代码放在哪里?在wkupct回调中还是在easy wakeup回调中?
什么代码应该在wkupct回调中,什么代码应该在简单唤醒回调中?
谢谢,丹尼尔
app_easy_wakeup_set()只设置将在app_easy_wakeup()发送消息时执行的回调,什么时候设置这个消息并不重要,只需要在调用触发它的app_easy_wakeup()之前设置。关于改变睡眠。只要唤醒计时器的中断发生,或者app_easy回调执行完成,您就可以更改休眠模式。
有关,你应该把额外的操作代码,这取决于你想做什么,对切换GPIO app_easy_wakeup可以使用回调,但如果有与外部的交互外设,传感器等你应该醒来并实现您的代码在app_on_ble_powered或app_on_system_powered(如何使用这些回调函数你可以找到更多的信息在嗯- b - 051 - da1458x软件平台参考v1.0.pdf 7.2节)。
对于arch_ble_ext_wakeup_get(),检查是为了验证用户是否调用了arch_ble_ext_wakeup_on(),如果你在睡觉前没有调用这个函数,你就不必进行检查。
通常,wkupct回调具有外设的初始化(peripherals (peri_init()),强制BLE唤醒(如果需要),如果在进入睡眠之前调用了arch_ble_ext_wakeup_on(),则调用arch_ble_ext_wakeup_off(),并通过app_easy_wakeup()发送消息,以便在BLE唤醒后立即执行一些代码。app_easy_wakeup()回调函数接受您想要的任何类型的代码,但您应该注意在该函数中执行的代码不会花太长时间,因为有遗漏BLE事件的情况。对于使用UART、SPI、I2C外围设备的长时间操作,您应该使用前面提到的回调。
我的产品需要一直连接到电话,所以我不使用arch_ble_ext_wakeup_on()函数。
我尝试了app_on_system_powered, app_on_ble_powered和user_resume_from_sleep。我觉得他们做不到我想要的。
我尝试用一个简单的代码。
arch_main_loop_callback_ret_t user_on_system_powered(空白){+ +;返回GOTO_SLEEP;}arch_main_loop_callback_ret_t user_on_ble_powered(空白){b + +;返回GOTO_SLEEP;}空白user_resume_from_sleep(空白){c++;}
然后发现a b c会增加而不点击唤醒计时器。
我想做的是点击唤醒定时器与SPI传感器FIFO水印中断,无论BLE连接与否,拉出所有的FIFO数据和计算步数,如果步数大于100,例如,打开蜂鸣器和led,这需要核心禁用睡眠模式。
我写了所有的代码在唤醒定时器回调,它可以工作,但led和蜂鸣器不能工作,因为扩展睡眠模式,有时它会触发警告显示if ((DEVELOPMENT_DEBUG) && (USE_POWER_OPTIMIZATIONS)){slp_period_retained = slp_period;//如果这个断言命中,那么LP ISR持续的时间比时间长//已经通过LP_ISR_TIME_XTAL32_CYCLES和LP_ISR_TIME_USEC保留。If (sleep_lp_cycles && (sleep_lp_cycles < slp_period))ASSERT_WARNING (0);}
我试着把所有的代码放到简单的唤醒回叫中,它的工作原理一样,但不会触发警告,但我发现我的手机与芯片断开了。
如何编写代码?
你应该在唤醒手柄中重新配置与Led和蜂鸣器相关的gpio引脚,因为从睡眠模式唤醒时,引脚的所有配置都丢失了。像这样如果(GetBits16 (SYS_STAT_REG PER_IS_DOWN))periph_init ();
嗨,克里斯,
是的,我重新配置了。但在睡眠模式下LED只亮0.5秒。
你所使用的回调将在系统通过你的主循环时被执行,因为设备不会进入睡眠状态这意味着在唤醒执行连接间隔后,代码将通过所有那些函数并增加你拥有的变量直到连接间隔结束,它到达睡眠过程。从那一刻起,它将留在WFI()中,直到下一个连接事件到来。如果你在唤醒定时器回调中有你的实现,那么你正在延迟唤醒睡眠,你看到的ASSERT_WARNING(),通知你设备应该已经被唤醒,但有什么东西延迟了这个过程。
在第二种情况下,通过app_easy_wakeup()触发你的代码,本质上你发送了一个消息,你不会干扰连接事件和活动的BLE过程,但显然你花在与传感器交互读取数据的时间非常大,或者你的连接间隔对于这种活动太小,所以你错过了连接事件,因此设备认为连接丢失了。要么试着把你的传感器交互分成更小的块(读取更小的部分的数据),这样580将能够服务于传感器交互和BLE事件,或者增加一点连接间隔的超时和连接的延迟,这样设备在连接间隔发生之前有更多的时间与传感器交互,这样你的设备在丢失事件中有更多的容忍度,以防有帮助。
至于LED灯,它只点亮0.5秒,当处于睡眠模式时,针脚会保持自己的状态,所以当进入睡眠状态时没有问题,问题是当设备醒来时。为了配置应用程序使用的引脚,在每次唤醒时都会调用peri_init(),因此当执行peri_init()时,会重新配置引脚及其状态。为了克服这个问题,您必须存储引脚的值(活动的,不活动的),并且在每次唤醒时,根据您所存储的状态在外设_init()函数中配置引脚的状态。
那么我把代码放在哪里重要吗?
如何增加连接的连接间隔、超时和延迟?
是下面的代码吗?静态const结构connection_param_configuration user_connection_param_conf = {///双槽连接间隔最小值为1.25ms///使用宏MS_TO_DOUBLESLOTS将毫秒(ms)转换为双槽.intv_min = MS_TO_DOUBLESLOTS (10),
///双槽最大连接间隔为1.25ms///使用宏MS_TO_DOUBLESLOTS将毫秒(ms)转换为双槽.intv_max = MS_TO_DOUBLESLOTS (20),
///在连接事件中测量的延迟.latency = 0,
///监视超时,以计时器单位测量(10 ms)///使用宏MS_TO_TIMERUNITS将毫秒(ms)转换为计时器单位.time_out = MS_TO_TIMERUNITS (1250),
///最小连接事件持续时间(1.25ms)///使用宏MS_TO_DOUBLESLOTS将毫秒(ms)转换为双槽.ce_len_min = MS_TO_DOUBLESLOTS (0)
///最大连接事件持续时间(1.25ms)///使用宏MS_TO_DOUBLESLOTS将毫秒(ms)转换为双槽.ce_len_max = MS_TO_DOUBLESLOTS (0)};
我使用RCX20作为睡眠时钟有关系吗?
所以led和蜂鸣器可以在扩展睡眠模式下工作,但我必须在peri_init()中设置状态?
如果我的产品需要一直连接,休眠模式能省电吗?因为我发现在连接之后,经常会调用peri_init(),这意味着内核经常被唤醒。
至于你把代码放在哪里很重要,我想你指的是连接外部传感器的代码,正如我上面提到的,这取决于设备的状态(连接,广告)和你的代码需要多长时间来执行,如果它花了足够长的时间,你可能错过了连接间隔和与外围设备的松散连接。
关于如何增加连接间隔,连接间隔是由中心定义的,你可以做的是发出一个连接更新请求,中心将决定它是否接受你所请求的连接参数。你所张贴的SDK部分是设备在与中心连接时检查的部分,如果当前参数不匹配,将发送一个请求到中心以更新连接参数(该请求在连接建立后10秒发送),所以如果中心接受参数,连接将更改为user_connection_param_conf结构中指定的值。
对于连接参数,LP时钟没有任何影响。
正如上面所解释的,LED可以工作,因为当设备处于睡眠模式时,引脚保持他们的状态,你只需要记住引脚的状态,并在peripheral _init()中相应地设置它,因为在唤醒时,会执行peripheral _init()并重新配置引脚。关于蜂鸣器,我认为你提供了一个PWM,定时器在睡眠模式关闭,因此PWM,因此你不能产生PWM来驱动蜂鸣器,而设备在睡眠模式。
是的,睡眠模式可以节省电力,设备将进入睡眠和唤醒在安排的连接间隔,考虑到外围init()和调用的频率,它被调用在每个连接间隔,以与中央通信,一般连接间隔越长,你应该睡得越长(不考虑外部唤醒),你睡得越多,你消耗的越少。
不,我的意思是把代码放在唤醒定时器回调或简单唤醒回调中。一个会影响睡眠另一个会影响连接事件?解决这两个问题的方法是增加连接间隔?
在常规的方式,代码应该在容易唤醒回调?
那么在我的应用中,哪一个需要DA14580一直连接,核心按连接间隔睡觉和醒来?
我发现Android没有api来改变连接间隔,所以我可以使用app_easy_gap_param_update_start在user_on_connection更新连接参数到我的user_connection_param_conf在user_config.h?
user_gapm_conf中的interval和user_connection_param_conf中的interval有什么区别?它们是一样的吗?如何使用user_gapm_conf与app_easy_gap_dev_configure()?
在training 04中,它说使用RCX20,它只能在连接时计数到2秒,或者在广告时无限时间内计数,这是否意味着连接间隔必须小于2秒?
而在SmartTag参考表10中,它表明2500 ms间隔比500 ms间隔使用更多的功率,原因是:对于较长的间隔射频接收器必须激活较长时间以检测来自主服务器的轮询。这和你说的不一样。是为了连接的功耗吗?
你的意思是,如果它关系到你要在哪个文件中放置回调你要放置app_easy_wakeup_set() ?不,没关系。关于你应该把你的代码放在哪里,如上所述,这取决于事务的长度,如果事务占用MCU很长一段时间,代码在哪里并不重要,它会破坏你的连接,因为你占用MCU很长一段时间(这种情况下,你应该考虑把你的事务分成更小的片段),如果你把你的代码放在唤醒定时器回调将影响唤醒系统,因为你与传感器的交互将干扰唤醒过程,在app_easy方法中,设备将通过消息同步启动事务,这对唤醒过程是ok的,但同样,如果过程足够长,延迟设备从服务的连接间隔,你将失去连接。
是的,SDK会根据设备的通告或连接间隔来处理设备的休眠。
如上所述,是的,你可以向中心发送一个请求,它取决于中心是否接受外设指示的参数,而且SDK发送请求需要一些时间(大约10秒)。
不可以,BLE规定可以实现的最大连接间隔是4秒。
在之前的文章中,我提到了一个大家可以遵循的一般规则,并不是所有的设计都是这样,智能标签上提到的功耗就是每次醒来时的功耗。这意味着,在第一种情况下,每次设备醒来(每500ms醒来一次),它将消耗大约752uA,在第二种情况下,每次设备醒来(2500ms),它将消耗大约1199,更清楚地说,在第二种情况下,设备将消耗更多,但它将唤醒更少的次数。所以这是一个必须考虑的权衡。
现在我将最小连接间隔设置为1秒,最大连接间隔设置为2秒。
我发现如果我把唤醒定时器回调的代码放进去,DA14580就死机了。如果我把代码放在容易唤醒回调,它也不能工作。
我的想法是:当在唤醒定时器回调,无论连接间隔有多长,代码延迟唤醒过程,所以它死。但在简单唤醒回调中,如果芯片正确唤醒,并且间隔足够长,代码可以运行,它就可以工作。
但是DA14580也死了。为什么?所以也许我需要增加睡眠间隔?
我的问题有什么原因吗?
期待您的回复!
然而在第二个,间隔的增加不会解决你的问题,我忽略了这个事实,因为你有一个连接,你也由一个外部中断醒来有外部中断的可能性可能发生在连接事件之前,理论上如果事务是足够小的,不应该影响自设备的连接会使传感器事务和服务通过调用rwip_schedule BLE事件函数。现在,在您的例子中,可见性事务相当长,如果它发生在连接事件之前,rwip_schedule()(调度消息的函数)不会被调用(因为传感器事务正在进行),所以您将错过事件,这可能导致断开连接。如前一篇文章所述,您可以尝试在app_easy_message被触发时设置一个标志,而不是在处理程序中进行交互。在主循环中(使用我提到的app_on_system_powered回调函数),您可以检查该标志,并将传感器交互分成块,并在每个较小的事务顺序中返回KEEP_POWERED,以强制rwip_schedule()函数运行调度器并为任何即将到来的事件提供服务。
所以你的意思是我设置一个标志名为samplefull,当传感器使中断,我设置标志为真在唤醒回调,并写的代码app_on_system_powered像
user_on_system_powered ()如果samplefull = = true{阅读所有样品做某事}回来睡会儿
我不能一次读取所有的样本,如果200个样本导致中断,我必须一次读取20个样本,并读取10次,否则芯片就会出错?
所以我必须这样写:
user_on_system_powered ()如果samplenumber > 0{阅读20样品samplenumber-20做某事返回保持动力}其他的回来睡会儿
我在一个空白的模板项目中尝试了前面提到的简单代码。
并发现,在连接之前,每次a增加9,b增加8,c增加1。连接后,每次a增加5,b增加4,c增加1。为什么?
嗨daniel59。
我的意思是在你在app_easy_wakeup_set()处设置的回调中设置一个标志,它将指示你有准备从传感器接收的数据,并在app_on_system_powered中有一个检查,检查那个标志,如果它为真,它就开始与传感器的交互。不要让所有的外设交互一次,因为如果你保持580在app_on_system_powered,那么当连接事件发生时,你将执行代码从传感器获取数据,你将一直这样做,直到你的交互结束,这将导致不执行rwip_schedule。所以就像你在你的文章中提到的那样,在app_on_system_powered中进行交互并将其放在小数据块中。因此,如果您有200个数据事务,则在每个事务从app_on_system_powered()返回后使用KEEP_POWERED创建10个事务,每个事务包含20个数据,以便app_on_ble_powered()再次运行并调度消息(如果有的话)。
对于你的实验,每个函数的调用取决于设备的状态和事件。这些功能尤其是app_on_ble_powered和app_on_system_powered运行不止一次在每个醒来(只要设备是活跃BLE事件),同样的事实app_on_system_powered + 1比app_on_ble_powered运行时间,运行它,因为第一个运行只要祝福核心是活跃的,它需要一些时间为核心的活跃,为user_resume_from_sleep()只运行一次就醒来。如果您想知道为什么在每个广告事件上有更多的交互而不是连接事件,那是因为广告事件比连接事件持续的时间更长。
谢谢你的回答,芯片现在工作正常。我把所有的操作与传感器到动力回调。我要测试它是否处于稳定状态。
还有一个问题,你说增加间隔并不能解决我的问题,你还说连接间隔对这种活动来说太小了,所以你错过了连接事件。那么增加间隔有什么用呢?降低消费?
问候,丹尼尔
一开始我对你的实现感到困惑,我提到了增加连接间隔(我认为你在每个连接间隔唤醒时都与传感器交互,与传感器交互将花费太多时间,直到下一个连接间隔)。关于连接间隔的长度,这取决于您想要实现的应用程序。更短的连接间隔意味着为了传输,你会更频繁地醒来,因此你将消耗更多的电力,但你将能够发送更多的数据,更快,如果你不感兴趣发送那么多的数据,连接间隔很短,没有理由那么频繁地醒来,因为没有数据交换,因此没有理由那么频繁地唤醒设备。正如在之前的帖子中提到的,是的,作为一个通用规则,一个人可以有更长的连接间隔来节省更多的电力,但这同样取决于应用程序,这是有权衡的。
我测试了3天的代码,有时它也会死机。死的意思是它再也找不到了,不是跟我的手机断了。我不知道为什么。
现在我改变了主意,当触发唤醒定时器回调时,我唤醒核心,在容易唤醒回调中用传感器做所有的事情,然后去睡觉。
这种方式与使用系统驱动的方式有相同的消耗吗?因为我必须在与传感器交互时使用system_powered的核心KEEP POWERED ?
最好的问候,丹尼尔
我不太明白你的意思,你提到的设备死机意味着没有断开与手机的连接,但找不到(我猜你的意思是广告),设备连接后也是在做广告?
关于第二个问题,如果我错了请纠正我,但是,我认为这是我们在以前的帖子中处理的情况,我提到了在块中做所有的传感器交互,而不是在唤醒回调中有所有的交互。关于GATT错误,你得到的十进制133不是一个有效的GATT错误码,如果你提到这到底发生在哪里,在断开回调?你提到的错误是断开的原因吗?
我不认为这将对你的功耗有任何重大影响,因为在这两种情况下,你保持580是为了从传感器读取,也许当设备保持运行时,块读取的方法将使设备保持多一点的唤醒,但我不认为功耗将是那么重要。
因为Android没有像Lightblue这样的工具,所以我使用nrf连接器来测试我的芯片。
下载代码后,我扫描芯片,连接它,切换通知,并查看结果。
过了一段时间,它断开了,再也找不到它了,按钮功能也不能工作了,所以我认为芯片是死的。
错误代码来自nrf连接器。
我很抱歉,但我很困惑,你提到你放弃了我建议的方式,为了如何获取数据,当app_easy_wakeup被触发时,你执行整个数据事务(这导致从第一次设备由于我上面提到的原因停滞)。因为在连接和通知数据时,这意味着设备会卡在代码的某个地方,由于断言,您必须进行调试,以检查设备的确切位置。
我试了三种方法,
1.与传感器交互并读取数据在容易唤醒回调没有disable_sleep_mode(),只有disable_sleep_mode()时蜂鸣器是打开的。2.通过disable_sleep_mode()与传感器交互并在容易的唤醒回调中读取数据。3.在user_on_system_powered()中与传感器交互并读取数据,在易唤醒回调中只读取传感器状态并设置标志,在蜂鸣器打开时使用disable_sleep_mode()。
他们都失败了。
当我把代码放在容易唤醒回调,uvision不会触发断言,所以我不能找到哪里出错了。
我很抱歉,但是根据你提供的信息,我不能找出设备在哪里卡住了,你必须在不同的情况下测试这个,以便给我更多的线索,找出可能出错的地方。如果你正在读取传感器,而设备从user_on_system_powered()唤醒,你返回KEEP_POWERED以便设备在读取时保持唤醒,那么我不认为你错过任何BLE事件。如果在调试模式下设备没有停止,那么你可以做的是让设备在无睡眠模式下运行,当问题发生时,连接调试器并检查设备在哪里停止,如下所述:
1)搜索项目的所有文件“SetBits16(SYS_CTRL_REG, DEBUGGER_ENABLE, 0);”并在所有地方注释它。//如果你正在使用SDK5,这应该已经完成2)创建xxx的副本。Uvprojx在你的项目的应用文件夹,并命名为xxx_attach.uvprojx3)运行附加项目并进入项目选项4)在“调试”选项卡中禁用“启动应用程序时加载”复选框,并删除到初始化文件的链接5)单击调试器的设置按钮,禁用“连接后重置”复选框6)单击“确定”,再单击“确定”关闭项目选项7)回到原来的项目,像往常一样编译你的代码8)附加调试器下载代码(在RAM中)9)分离调试器开始代码的执行
------------------------- 运行代码,一旦问题发生 ------------------
10)要再次附加而不下载代码(热附加)转到附加项目并启动调试器。如果cpu处于断点,那么您可以找到已经停止的代码行。
我尝试了你提到的方法,(不能找到任何“SetBits16(SYS_CTRL_REG, DEBUGGER_ENABLE, 0);”,但找到“SetBits16(SYS_CTRL_REG, DEBUGGER_ENABLE, 1);”)复制项目文件,修改选项,并首先启动调试会话,并在xxx.uvprojx中运行代码。然后等待芯片出现问题,然后运行xxx_attach。Uvprojx和启动调试会话。
但是它显示了一个错误。日志如下:
加载“F:\\Dialog\\5.0.4\\projects\\target_apps\\template\\v2 - ledwake\\Keil_5\\out_580\\empty_peripheral_template_580.axf”设置JLink项目文件为“F:\Dialog\5.0.4\projects\target_apps\template\v2 - ledwake\Keil_5\JLinkSettings.ini”* JLink信息:设备“CORTEX-M0”被选中。
JLink信息:------------DLL: V5.12e,编译于Apr 29 2016 15:03:58固件:J-Link ARM-OB STM32编译于Aug 22 2012 19:52:04硬件:V7.00S / N: 20090928特性:RDI、FlashDL FlashBP, JFlash GDBFull
发现ID为0x0BB11477的SWD-DP* JLink Info: Found Cortex-M0 r0p0, Little endian。* JLink信息:FPUnit: 4个代码(BP)插槽和0个文字插槽CoreSight组件:* JLink信息:ROMTbl 0 @ E00FF000* JLink Info: ROMTbl 0 [0]: FFF0F000, CID: B105E00D, PID: 000BB008 SCS* JLink Info: ROMTbl 0 [1]: FFF02000, CID: B105E00D, PID: 000BB00A DWT* JLink Info: ROMTbl 0 [2]: FFF03000, CID: B105E00D, PID: 000BB00B fbbROMTableAddr = 0 xe00ff000
目标信息:------------设备:ARMCM0VTarget = 3.300 v针的状态:Tck: 0, tdi: 0, tdo: 1, tms: 0, tres: 1, trst: 0Hardware-Breakpoints: 4Software-Breakpoints: 8192监测点:2JTAG速度:4000 kHz
没有找到算法:20000000H - 2000009FH没有找到算法:20000160H - 20000323H没有找到用于:20000340H - 200003E3H的算法没有找到用于:20000440H - 20005803H的算法抹去了!错误:Flash下载失败- "Cortex-M0"Flash Load在15:40:09完成
我已经在上面的说明中提到,如果你正在使用最新的SDK SetBits16(SYS_CTRL_REG, DEBUGGER_ENABLE, 0);当设备进入睡眠状态时,SDK5.0.4不会禁用调试器模块(较老版本的SDK会禁用)。关于你看到的错误,是因为你没有在Keil中指定,你将在“目标选项”中的“实用工具”选项卡中“使用外部工具进行Flash编程”。
嗨daniel59,
它只是一个用于唤醒时使用的api,通过app_easy_wakeup_set(),您只需为设备设置一个回调函数,以便在从app_easy_wakeup函数()发送唤醒消息时立即执行。因此,app_easy_wakeup()函数将从唤醒计时器中断中调用(它将特定的消息推送到内核中),一旦内核被唤醒并调度消息,您通过app_easy_wakeup_set()设置的函数将被触发。
由于MT_dialog
如果我想把LED打开延长睡眠模式。我应该如何编写代码?
1.
app_button_press_cb {
turn_on_led ();
}
on_init () {
wkupct_register_callback (app_button_press_cb);
wkupct_enable_irq(WKUPCT_PIN_SELECT(GPIO_BUTTON_PORT, GPIO_BUTTON_PIN), // select pin (GPIO_BUTTON_PORT, GPIO_BUTTON_PIN)
wkupct_pin_极性(GPIO_BUTTON_PORT, GPIO_BUTTON_PIN, WKUPCT_PIN_POLARITY_LOW), //极性低
1, // 1事件
40);// debging time = 0
}
或2。
wakeup_cb () {
turn_on_led ();
}
app_button_press_cb () {
app_easy_wakeup_set (turn_on_led);
app_easy_wakeup ();
}
on_init () {
wkupct_register_callback (app_button_press_cb);
wkupct_enable_irq(WKUPCT_PIN_SELECT(GPIO_BUTTON_PORT, GPIO_BUTTON_PIN), // select pin (GPIO_BUTTON_PORT, GPIO_BUTTON_PIN)
wkupct_pin_极性(GPIO_BUTTON_PORT, GPIO_BUTTON_PIN, WKUPCT_PIN_POLARITY_LOW), //极性低
1, // 1事件
40);// debging time = 0
}
我应该把arch_disable_sleep函数放在哪里?
嗨daniel59,
在开始发布时设置唤醒中断(如果设备将以扩展睡眠模式发布),或者在从.app_on_adv_undirect_complete完成发布过程时设置唤醒中断。中断的设置可以如下所示:
app_easy_wakeup_set (app_wakeup_cb);// app_wakeup_cb是你要打开LED的地方,所以它只包含函数GPIOSetActive()。
wkupct_register_callback (app_button_press_cb);// app_button_press是唤醒中断的回调(描述如下)
wkupct_enable_irq(WKUPCT_PIN_SELECT(GPIO_BUTTON_PORT, GPIO_BUTTON_PIN), // select pin (GPIO_BUTTON_PORT, GPIO_BUTTON_PIN)
wkupct_pin_极性(GPIO_BUTTON_PORT, GPIO_BUTTON_PIN, WKUPCT_PIN_POLARITY_LOW), //极性低
1, // 1事件
40);// debging time = 0
静态孔隙app_button_press_cb(空白)
{
如果(GetBits16 (SYS_STAT_REG PER_IS_DOWN))
{
periph_init ();
}
如果(arch_ble_ext_wakeup_get ())
{
arch_set_sleep_mode (ARCH_SLEEP_OFF);//禁用休眠模式
arch_ble_force_wakeup ();//强制唤醒BLE
arch_ble_ext_wakeup_off ();//禁用外部唤醒(如果你在进入永久休眠之前设置了arch_ble_ext_wakeup_on()函数)
app_easy_wakeup ();//一旦BLE被唤醒,就按顺序调用app_easy_wakeup()来执行app_wakeup_cb()函数并打开//LED
}
}
由于MT_dialog
嗨MT_dialog,
但我发现在SMARTTAG源代码中,app_easy_wakeup()就在app_easy_wakeup_set()之后;
你的意思是我必须在app_easy_wakeup之前修改睡眠模式?或者我可以在简单唤醒回调中修改睡眠模式吗?
我的代码没有关闭BLE,所以我可以直接使用app_easy_wakeup没有if (arch_ble_ext_wakeup_get())?
如果我有更多的操作后,核心唤醒,我应该把代码放在哪里?在wkupct回调中还是在easy wakeup回调中?
什么代码应该在wkupct回调中,什么代码应该在简单唤醒回调中?
谢谢,
丹尼尔
嗨daniel59,
app_easy_wakeup_set()只设置将在app_easy_wakeup()发送消息时执行的回调,什么时候设置这个消息并不重要,只需要在调用触发它的app_easy_wakeup()之前设置。关于改变睡眠。只要唤醒计时器的中断发生,或者app_easy回调执行完成,您就可以更改休眠模式。
有关,你应该把额外的操作代码,这取决于你想做什么,对切换GPIO app_easy_wakeup可以使用回调,但如果有与外部的交互外设,传感器等你应该醒来并实现您的代码在app_on_ble_powered或app_on_system_powered(如何使用这些回调函数你可以找到更多的信息在嗯- b - 051 - da1458x软件平台参考v1.0.pdf 7.2节)。
对于arch_ble_ext_wakeup_get(),检查是为了验证用户是否调用了arch_ble_ext_wakeup_on(),如果你在睡觉前没有调用这个函数,你就不必进行检查。
通常,wkupct回调具有外设的初始化(peripherals (peri_init()),强制BLE唤醒(如果需要),如果在进入睡眠之前调用了arch_ble_ext_wakeup_on(),则调用arch_ble_ext_wakeup_off(),并通过app_easy_wakeup()发送消息,以便在BLE唤醒后立即执行一些代码。app_easy_wakeup()回调函数接受您想要的任何类型的代码,但您应该注意在该函数中执行的代码不会花太长时间,因为有遗漏BLE事件的情况。对于使用UART、SPI、I2C外围设备的长时间操作,您应该使用前面提到的回调。
由于MT_dialog
嗨MT_dialog,
我的产品需要一直连接到电话,所以我不使用arch_ble_ext_wakeup_on()函数。
我尝试了app_on_system_powered, app_on_ble_powered和user_resume_from_sleep。我觉得他们做不到我想要的。
我尝试用一个简单的代码。
arch_main_loop_callback_ret_t user_on_system_powered(空白)
{
+ +;
返回GOTO_SLEEP;
}
arch_main_loop_callback_ret_t user_on_ble_powered(空白)
{
b + +;
返回GOTO_SLEEP;
}
空白user_resume_from_sleep(空白)
{
c++;
}
然后发现a b c会增加而不点击唤醒计时器。
我想做的是点击唤醒定时器与SPI传感器FIFO水印中断,无论BLE连接与否,拉出所有的FIFO数据和计算步数,如果步数大于100,例如,打开蜂鸣器和led,这需要核心禁用睡眠模式。
我写了所有的代码在唤醒定时器回调,它可以工作,但led和蜂鸣器不能工作,因为扩展睡眠模式,有时它会触发警告显示
if ((DEVELOPMENT_DEBUG) && (USE_POWER_OPTIMIZATIONS))
{
slp_period_retained = slp_period;
//如果这个断言命中,那么LP ISR持续的时间比时间长
//已经通过LP_ISR_TIME_XTAL32_CYCLES和LP_ISR_TIME_USEC保留。
If (sleep_lp_cycles && (sleep_lp_cycles < slp_period))
ASSERT_WARNING (0);
}
我试着把所有的代码放到简单的唤醒回叫中,它的工作原理一样,但不会触发警告,但我发现我的手机与芯片断开了。
如何编写代码?
你应该在唤醒手柄中重新配置与Led和蜂鸣器相关的gpio引脚,因为从睡眠模式唤醒时,引脚的所有配置都丢失了。
像这样
如果(GetBits16 (SYS_STAT_REG PER_IS_DOWN))
periph_init ();
嗨,克里斯,
是的,我重新配置了。但在睡眠模式下LED只亮0.5秒。
嗨daniel59,
你所使用的回调将在系统通过你的主循环时被执行,因为设备不会进入睡眠状态这意味着在唤醒执行连接间隔后,代码将通过所有那些函数并增加你拥有的变量直到连接间隔结束,它到达睡眠过程。从那一刻起,它将留在WFI()中,直到下一个连接事件到来。如果你在唤醒定时器回调中有你的实现,那么你正在延迟唤醒睡眠,你看到的ASSERT_WARNING(),通知你设备应该已经被唤醒,但有什么东西延迟了这个过程。
在第二种情况下,通过app_easy_wakeup()触发你的代码,本质上你发送了一个消息,你不会干扰连接事件和活动的BLE过程,但显然你花在与传感器交互读取数据的时间非常大,或者你的连接间隔对于这种活动太小,所以你错过了连接事件,因此设备认为连接丢失了。要么试着把你的传感器交互分成更小的块(读取更小的部分的数据),这样580将能够服务于传感器交互和BLE事件,或者增加一点连接间隔的超时和连接的延迟,这样设备在连接间隔发生之前有更多的时间与传感器交互,这样你的设备在丢失事件中有更多的容忍度,以防有帮助。
至于LED灯,它只点亮0.5秒,当处于睡眠模式时,针脚会保持自己的状态,所以当进入睡眠状态时没有问题,问题是当设备醒来时。为了配置应用程序使用的引脚,在每次唤醒时都会调用peri_init(),因此当执行peri_init()时,会重新配置引脚及其状态。为了克服这个问题,您必须存储引脚的值(活动的,不活动的),并且在每次唤醒时,根据您所存储的状态在外设_init()函数中配置引脚的状态。
由于MT_dialog
嗨MT_dialog,
那么我把代码放在哪里重要吗?
如何增加连接的连接间隔、超时和延迟?
是下面的代码吗?
静态const结构connection_param_configuration user_connection_param_conf = {
///双槽连接间隔最小值为1.25ms
///使用宏MS_TO_DOUBLESLOTS将毫秒(ms)转换为双槽
.intv_min = MS_TO_DOUBLESLOTS (10),
///双槽最大连接间隔为1.25ms
///使用宏MS_TO_DOUBLESLOTS将毫秒(ms)转换为双槽
.intv_max = MS_TO_DOUBLESLOTS (20),
///在连接事件中测量的延迟
.latency = 0,
///监视超时,以计时器单位测量(10 ms)
///使用宏MS_TO_TIMERUNITS将毫秒(ms)转换为计时器单位
.time_out = MS_TO_TIMERUNITS (1250),
///最小连接事件持续时间(1.25ms)
///使用宏MS_TO_DOUBLESLOTS将毫秒(ms)转换为双槽
.ce_len_min = MS_TO_DOUBLESLOTS (0)
///最大连接事件持续时间(1.25ms)
///使用宏MS_TO_DOUBLESLOTS将毫秒(ms)转换为双槽
.ce_len_max = MS_TO_DOUBLESLOTS (0)
};
我使用RCX20作为睡眠时钟有关系吗?
所以led和蜂鸣器可以在扩展睡眠模式下工作,但我必须在peri_init()中设置状态?
如果我的产品需要一直连接,休眠模式能省电吗?因为我发现在连接之后,经常会调用peri_init(),这意味着内核经常被唤醒。
嗨daniel59,
至于你把代码放在哪里很重要,我想你指的是连接外部传感器的代码,正如我上面提到的,这取决于设备的状态(连接,广告)和你的代码需要多长时间来执行,如果它花了足够长的时间,你可能错过了连接间隔和与外围设备的松散连接。
关于如何增加连接间隔,连接间隔是由中心定义的,你可以做的是发出一个连接更新请求,中心将决定它是否接受你所请求的连接参数。你所张贴的SDK部分是设备在与中心连接时检查的部分,如果当前参数不匹配,将发送一个请求到中心以更新连接参数(该请求在连接建立后10秒发送),所以如果中心接受参数,连接将更改为user_connection_param_conf结构中指定的值。
对于连接参数,LP时钟没有任何影响。
正如上面所解释的,LED可以工作,因为当设备处于睡眠模式时,引脚保持他们的状态,你只需要记住引脚的状态,并在peripheral _init()中相应地设置它,因为在唤醒时,会执行peripheral _init()并重新配置引脚。关于蜂鸣器,我认为你提供了一个PWM,定时器在睡眠模式关闭,因此PWM,因此你不能产生PWM来驱动蜂鸣器,而设备在睡眠模式。
是的,睡眠模式可以节省电力,设备将进入睡眠和唤醒在安排的连接间隔,考虑到外围init()和调用的频率,它被调用在每个连接间隔,以与中央通信,一般连接间隔越长,你应该睡得越长(不考虑外部唤醒),你睡得越多,你消耗的越少。
由于MT_dialog
嗨MT_dialog,
不,我的意思是把代码放在唤醒定时器回调或简单唤醒回调中。一个会影响睡眠另一个会影响连接事件?解决这两个问题的方法是增加连接间隔?
在常规的方式,代码应该在容易唤醒回调?
那么在我的应用中,哪一个需要DA14580一直连接,核心按连接间隔睡觉和醒来?
我发现Android没有api来改变连接间隔,所以我可以使用app_easy_gap_param_update_start在user_on_connection更新连接参数到我的user_connection_param_conf在user_config.h?
user_gapm_conf中的interval和user_connection_param_conf中的interval有什么区别?它们是一样的吗?如何使用user_gapm_conf与app_easy_gap_dev_configure()?
在training 04中,它说使用RCX20,它只能在连接时计数到2秒,或者在广告时无限时间内计数,这是否意味着连接间隔必须小于2秒?
而在SmartTag参考表10中,它表明2500 ms间隔比500 ms间隔使用更多的功率,原因是:对于较长的间隔射频接收器必须
激活较长时间以检测来自主服务器的轮询。这和你说的不一样。是为了连接的功耗吗?
谢谢,
丹尼尔
嗨daniel59,
你的意思是,如果它关系到你要在哪个文件中放置回调你要放置app_easy_wakeup_set() ?不,没关系。关于你应该把你的代码放在哪里,如上所述,这取决于事务的长度,如果事务占用MCU很长一段时间,代码在哪里并不重要,它会破坏你的连接,因为你占用MCU很长一段时间(这种情况下,你应该考虑把你的事务分成更小的片段),如果你把你的代码放在唤醒定时器回调将影响唤醒系统,因为你与传感器的交互将干扰唤醒过程,在app_easy方法中,设备将通过消息同步启动事务,这对唤醒过程是ok的,但同样,如果过程足够长,延迟设备从服务的连接间隔,你将失去连接。
是的,SDK会根据设备的通告或连接间隔来处理设备的休眠。
如上所述,是的,你可以向中心发送一个请求,它取决于中心是否接受外设指示的参数,而且SDK发送请求需要一些时间(大约10秒)。
不可以,BLE规定可以实现的最大连接间隔是4秒。
在之前的文章中,我提到了一个大家可以遵循的一般规则,并不是所有的设计都是这样,智能标签上提到的功耗就是每次醒来时的功耗。这意味着,在第一种情况下,每次设备醒来(每500ms醒来一次),它将消耗大约752uA,在第二种情况下,每次设备醒来(2500ms),它将消耗大约1199,更清楚地说,在第二种情况下,设备将消耗更多,但它将唤醒更少的次数。所以这是一个必须考虑的权衡。
由于MT_dialog
嗨MT_dialog,
现在我将最小连接间隔设置为1秒,最大连接间隔设置为2秒。
我发现如果我把唤醒定时器回调的代码放进去,DA14580就死机了。如果我把代码放在容易唤醒回调,它也不能工作。
我的想法是:当在唤醒定时器回调,无论连接间隔有多长,代码延迟唤醒过程,所以它死。
但在简单唤醒回调中,如果芯片正确唤醒,并且间隔足够长,代码可以运行,它就可以工作。
但是DA14580也死了。为什么?所以也许我需要增加睡眠间隔?
嗨MT_dialog,
我的问题有什么原因吗?
期待您的回复!
谢谢,
丹尼尔
嗨daniel59,
然而在第二个,间隔的增加不会解决你的问题,我忽略了这个事实,因为你有一个连接,你也由一个外部中断醒来有外部中断的可能性可能发生在连接事件之前,理论上如果事务是足够小的,不应该影响自设备的连接会使传感器事务和服务通过调用rwip_schedule BLE事件函数。现在,在您的例子中,可见性事务相当长,如果它发生在连接事件之前,rwip_schedule()(调度消息的函数)不会被调用(因为传感器事务正在进行),所以您将错过事件,这可能导致断开连接。如前一篇文章所述,您可以尝试在app_easy_message被触发时设置一个标志,而不是在处理程序中进行交互。在主循环中(使用我提到的app_on_system_powered回调函数),您可以检查该标志,并将传感器交互分成块,并在每个较小的事务顺序中返回KEEP_POWERED,以强制rwip_schedule()函数运行调度器并为任何即将到来的事件提供服务。
由于MT_dialog
嗨MT_dialog,
所以你的意思是我设置一个标志名为samplefull,当传感器使中断,我设置标志为真在唤醒回调,并写的代码app_on_system_powered像
user_on_system_powered ()
如果samplefull = = true
{
阅读所有样品
做某事
}
回来睡会儿
我不能一次读取所有的样本,如果200个样本导致中断,我必须一次读取20个样本,并读取10次,否则芯片就会出错?
所以我必须这样写:
user_on_system_powered ()
如果samplenumber > 0
{
阅读20样品
samplenumber-20
做某事
返回保持动力
}
其他的
回来睡会儿
我在一个空白的模板项目中尝试了前面提到的简单代码。
arch_main_loop_callback_ret_t user_on_system_powered(空白)
{
+ +;
返回GOTO_SLEEP;
}
arch_main_loop_callback_ret_t user_on_ble_powered(空白)
{
b + +;
返回GOTO_SLEEP;
}
空白user_resume_from_sleep(空白)
{
c++;
}
并发现,在连接之前,每次a增加9,b增加8,c增加1。连接后,每次a增加5,b增加4,c增加1。为什么?
嗨daniel59。
我的意思是在你在app_easy_wakeup_set()处设置的回调中设置一个标志,它将指示你有准备从传感器接收的数据,并在app_on_system_powered中有一个检查,检查那个标志,如果它为真,它就开始与传感器的交互。不要让所有的外设交互一次,因为如果你保持580在app_on_system_powered,那么当连接事件发生时,你将执行代码从传感器获取数据,你将一直这样做,直到你的交互结束,这将导致不执行rwip_schedule。所以就像你在你的文章中提到的那样,在app_on_system_powered中进行交互并将其放在小数据块中。因此,如果您有200个数据事务,则在每个事务从app_on_system_powered()返回后使用KEEP_POWERED创建10个事务,每个事务包含20个数据,以便app_on_ble_powered()再次运行并调度消息(如果有的话)。
对于你的实验,每个函数的调用取决于设备的状态和事件。这些功能尤其是app_on_ble_powered和app_on_system_powered运行不止一次在每个醒来(只要设备是活跃BLE事件),同样的事实app_on_system_powered + 1比app_on_ble_powered运行时间,运行它,因为第一个运行只要祝福核心是活跃的,它需要一些时间为核心的活跃,为user_resume_from_sleep()只运行一次就醒来。如果您想知道为什么在每个广告事件上有更多的交互而不是连接事件,那是因为广告事件比连接事件持续的时间更长。
由于MT_dialog
嗨MT_dialog,
谢谢你的回答,芯片现在工作正常。我把所有的操作与传感器到动力回调。我要测试它是否处于稳定状态。
还有一个问题,你说增加间隔并不能解决我的问题,你还说连接间隔对这种活动来说太小了,所以你错过了连接事件。那么增加间隔有什么用呢?降低消费?
问候,
丹尼尔
嗨daniel59,
一开始我对你的实现感到困惑,我提到了增加连接间隔(我认为你在每个连接间隔唤醒时都与传感器交互,与传感器交互将花费太多时间,直到下一个连接间隔)。关于连接间隔的长度,这取决于您想要实现的应用程序。更短的连接间隔意味着为了传输,你会更频繁地醒来,因此你将消耗更多的电力,但你将能够发送更多的数据,更快,如果你不感兴趣发送那么多的数据,连接间隔很短,没有理由那么频繁地醒来,因为没有数据交换,因此没有理由那么频繁地唤醒设备。正如在之前的帖子中提到的,是的,作为一个通用规则,一个人可以有更长的连接间隔来节省更多的电力,但这同样取决于应用程序,这是有权衡的。
由于MT_dialog
嗨MT_dialog,
我测试了3天的代码,有时它也会死机。死的意思是它再也找不到了,不是跟我的手机断了。我不知道为什么。
现在我改变了主意,当触发唤醒定时器回调时,我唤醒核心,在容易唤醒回调中用传感器做所有的事情,然后去睡觉。
这种方式与使用系统驱动的方式有相同的消耗吗?因为我必须在与传感器交互时使用system_powered的核心KEEP POWERED ?
最好的问候,
丹尼尔
嗨daniel59,
我不太明白你的意思,你提到的设备死机意味着没有断开与手机的连接,但找不到(我猜你的意思是广告),设备连接后也是在做广告?
关于第二个问题,如果我错了请纠正我,但是,我认为这是我们在以前的帖子中处理的情况,我提到了在块中做所有的传感器交互,而不是在唤醒回调中有所有的交互。关于GATT错误,你得到的十进制133不是一个有效的GATT错误码,如果你提到这到底发生在哪里,在断开回调?你提到的错误是断开的原因吗?
我不认为这将对你的功耗有任何重大影响,因为在这两种情况下,你保持580是为了从传感器读取,也许当设备保持运行时,块读取的方法将使设备保持多一点的唤醒,但我不认为功耗将是那么重要。
由于MT_dialog
嗨MT_dialog,
因为Android没有像Lightblue这样的工具,所以我使用nrf连接器来测试我的芯片。
下载代码后,我扫描芯片,连接它,切换通知,并查看结果。
过了一段时间,它断开了,再也找不到它了,按钮功能也不能工作了,所以我认为芯片是死的。
错误代码来自nrf连接器。
最好的问候,
丹尼尔
嗨daniel59,
我很抱歉,但我很困惑,你提到你放弃了我建议的方式,为了如何获取数据,当app_easy_wakeup被触发时,你执行整个数据事务(这导致从第一次设备由于我上面提到的原因停滞)。因为在连接和通知数据时,这意味着设备会卡在代码的某个地方,由于断言,您必须进行调试,以检查设备的确切位置。
由于MT_dialog
嗨MT_dialog,
我试了三种方法,
1.与传感器交互并读取数据在容易唤醒回调没有disable_sleep_mode(),只有disable_sleep_mode()时蜂鸣器是打开的。
2.通过disable_sleep_mode()与传感器交互并在容易的唤醒回调中读取数据。
3.在user_on_system_powered()中与传感器交互并读取数据,在易唤醒回调中只读取传感器状态并设置标志,在蜂鸣器打开时使用disable_sleep_mode()。
他们都失败了。
当我把代码放在容易唤醒回调,uvision不会触发断言,所以我不能找到哪里出错了。
最好的问候,
丹尼尔
嗨daniel59,
我很抱歉,但是根据你提供的信息,我不能找出设备在哪里卡住了,你必须在不同的情况下测试这个,以便给我更多的线索,找出可能出错的地方。如果你正在读取传感器,而设备从user_on_system_powered()唤醒,你返回KEEP_POWERED以便设备在读取时保持唤醒,那么我不认为你错过任何BLE事件。如果在调试模式下设备没有停止,那么你可以做的是让设备在无睡眠模式下运行,当问题发生时,连接调试器并检查设备在哪里停止,如下所述:
1)搜索项目的所有文件“SetBits16(SYS_CTRL_REG, DEBUGGER_ENABLE, 0);”并在所有地方注释它。//如果你正在使用SDK5,这应该已经完成
2)创建xxx的副本。Uvprojx在你的项目的应用文件夹,并命名为xxx_attach.uvprojx
3)运行附加项目并进入项目选项
4)在“调试”选项卡中禁用“启动应用程序时加载”复选框,并删除到初始化文件的链接
5)单击调试器的设置按钮,禁用“连接后重置”复选框
6)单击“确定”,再单击“确定”关闭项目选项
7)回到原来的项目,像往常一样编译你的代码
8)附加调试器下载代码(在RAM中)
9)分离调试器开始代码的执行
------------------------- 运行代码,一旦问题发生 ------------------
10)要再次附加而不下载代码(热附加)转到附加项目并启动调试器。如果cpu处于断点,那么您可以找到已经停止的代码行。
由于MT_dialog
嗨MT_dialog,
我尝试了你提到的方法,(不能找到任何“SetBits16(SYS_CTRL_REG, DEBUGGER_ENABLE, 0);”,但找到“SetBits16(SYS_CTRL_REG, DEBUGGER_ENABLE, 1);”)复制项目文件,修改选项,并首先启动调试会话,并在xxx.uvprojx中运行代码。然后等待芯片出现问题,然后运行xxx_attach。Uvprojx和启动调试会话。
但是它显示了一个错误。日志如下:
加载“F:\\Dialog\\5.0.4\\projects\\target_apps\\template\\v2 - ledwake\\Keil_5\\out_580\\empty_peripheral_template_580.axf”
设置JLink项目文件为“F:\Dialog\5.0.4\projects\target_apps\template\v2 - ledwake\Keil_5\JLinkSettings.ini”
* JLink信息:设备“CORTEX-M0”被选中。
JLink信息:
------------
DLL: V5.12e,编译于Apr 29 2016 15:03:58
固件:J-Link ARM-OB STM32编译于Aug 22 2012 19:52:04
硬件:V7.00
S / N: 20090928
特性:RDI、FlashDL FlashBP, JFlash GDBFull
发现ID为0x0BB11477的SWD-DP
* JLink Info: Found Cortex-M0 r0p0, Little endian。
* JLink信息:FPUnit: 4个代码(BP)插槽和0个文字插槽
CoreSight组件:
* JLink信息:ROMTbl 0 @ E00FF000
* JLink Info: ROMTbl 0 [0]: FFF0F000, CID: B105E00D, PID: 000BB008 SCS
* JLink Info: ROMTbl 0 [1]: FFF02000, CID: B105E00D, PID: 000BB00A DWT
* JLink Info: ROMTbl 0 [2]: FFF03000, CID: B105E00D, PID: 000BB00B fbb
ROMTableAddr = 0 xe00ff000
目标信息:
------------
设备:ARMCM0
VTarget = 3.300 v
针的状态:
Tck: 0, tdi: 0, tdo: 1, tms: 0, tres: 1, trst: 0
Hardware-Breakpoints: 4
Software-Breakpoints: 8192
监测点:2
JTAG速度:4000 kHz
没有找到算法:20000000H - 2000009FH
没有找到算法:20000160H - 20000323H
没有找到用于:20000340H - 200003E3H的算法
没有找到用于:20000440H - 20005803H的算法
抹去了!
错误:Flash下载失败- "Cortex-M0"
Flash Load在15:40:09完成
最好的问候,
丹尼尔
嗨daniel59,
我已经在上面的说明中提到,如果你正在使用最新的SDK SetBits16(SYS_CTRL_REG, DEBUGGER_ENABLE, 0);当设备进入睡眠状态时,SDK5.0.4不会禁用调试器模块(较老版本的SDK会禁用)。关于你看到的错误,是因为你没有在Keil中指定,你将在“目标选项”中的“实用工具”选项卡中“使用外部工具进行Flash编程”。
由于MT_dialog