我在SmartTag和SleepMode源代码中发现了这个功能,但不能在SDK引用中找到用法,它是如何运作的?它醒来核心吗?或者在触发中断之后,核心醒来?
嗨daniel59,
它只是为了唤醒时使用,用(),您将只需设置一个回调函数的设备尽快唤醒消息从app_easy_wakeup函数发送执行app_easy_wakeup_set的API()。所以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),//选择引脚(GPIO_BUTTON_PORT,GPIO_BUTTON_PIN)WKUPCT_PIN_POLARITY(GPIO_BUTTON_PORT,GPIO_BUTTON_PIN,WKUPCT_PIN_POLARITY_LOW),//极性低1, // 1事件40);//去抖动时间= 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),//选择引脚(GPIO_BUTTON_PORT,GPIO_BUTTON_PIN)WKUPCT_PIN_POLARITY(GPIO_BUTTON_PORT,GPIO_BUTTON_PIN,WKUPCT_PIN_POLARITY_LOW),//极性低1, // 1事件40);//去抖动时间= 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),//选择引脚(GPIO_BUTTON_PORT,GPIO_BUTTON_PIN)WKUPCT_PIN_POLARITY(GPIO_BUTTON_PORT,GPIO_BUTTON_PIN,WKUPCT_PIN_POLARITY_LOW),//极性低1, // 1事件40);//去抖动时间= 0
静态孔隙app_button_press_cb(空白){if(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();//调用为了所述app_easy_wakeup()只要BLE醒来以执行app_wakeup_cb()函数和打开// LED}}
嗨MT_dialog,
但我发现,在SmartTag源代码中,App_easy_wakeup()只是app_easy_wakeup_set()之后;
你的意思是我必须在app_easy_wakeup之前修改睡眠模式?或者我可以修改睡眠模式在简单的唤醒回调?
而我的代码不转BLE下来,这样我可以直接使用app_easy_wakeup如果没有(arch_ble_ext_wakeup_get())?
如果我有更多的操作核心醒来后做,我应该在哪里放置的代码?在wkupct回调或容易唤醒回调?
应在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(这些回调是如何使用的,你可以找到在UM-B-051的详细信息 - da1458x软件平台参考v1.0.pdf 7.2节)。
关于arch_ble_ext_wakeup_get()检查是为了做验证用户已经调用arch_ble_ext_wakeup_on(),如果你临睡前不要调用此功能,你不必做检查。
通常wkupct回调的initilalization外设(periph_init()),迫使BLE唤醒(如果需要),调用arch_ble_ext_wakeup_off()如果arch_ble_ext_wakeup_on()被调用之前睡觉,并通过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(无效){A ++;返回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水印中断唤醒定时器是否有幸获得连接,退出所有FIFO数据和计算步数,举个例子,如果一步数大于100开启蜂鸣器和领导,需要禁用睡眠模式的核心。
我写了唤醒计时器回调的所有代码,它可以工作,但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管脚,因为当wkup从睡眠模式时,所有的管脚配置已经丢失。像这样if(getBits16(sys_stat_reg,per_is_down))periph_init ();
嗨,克里斯,
是的,我重新配置了。但在睡眠模式下,LED只亮0.5秒。
当系统通过主循环时,你使用的回调将被执行,因为设备不会进入睡眠,这意味着在唤醒执行连接间隔后,代码会通过所有这些函数并增加变量,直到连接间隔结束,它到达睡眠过程。从那一刻起,它将留在WFI()中,直到下一个连接事件到达。如果你有你的实现在唤醒计时器回调,那么你正在延迟唤醒睡眠和ASSERT_WARNING(),你看到,通知你,设备应该被唤醒,但某些东西一直在延迟过程。
在第二种情况下,通过使用app_easy_wakeup()触发代码,基本上您正在发送消息,并且您不会与连接事件和活动的BLE过程进行间隔,但显然您花费与传感器交互以读取数据的时间对于这种活动来说非常大或您的连接间隔太小,因此您错过了连接事件,因此设备考虑丢失的连接。尝试在较小的块中分离传感器交互(读取较小部分的数据),以便580将能够为传感器交互和BLE事件提供服务或增加连接间隔超时和连接的延迟,因此在发生连接间隔之前,设备在与传感器发生更多的时间内具有更多时间,以便在有助于的情况下,您的设备在缺失事件中具有更多的速度。
关于LED和其点亮约0.5秒,当在睡眠模式下引脚保持其状态,所以要睡觉时没有问题,但问题是当设备被唤醒。该periph_init()被调用在每个醒来,以便配置应用程序所使用的针,所以当periph_init()执行引脚重新配置和他们的状态也是如此。为了克服,你将不得不存储引脚的值(有效,无效),并在每个醒来配置根据您已存储的状态在periph_init()功能引脚的状态。
所以我把代码置于哪里有重要吗?
如何增加连接间隔超时和连接延迟?
它是下面的代码吗?Static const struct connection_param_configuration user_connection_param_conf = {///在双槽中测量的最小连接间隔(1.25ms)///使用宏观MS_TO_DOUBLESLOTS从毫秒(MS)转换为双插槽.intv_min = MS_TO_DOUBLESLOTS (10),
在BLE双时隙测量///连接间隔最大(1.25ms)///使用宏观MS_TO_DOUBLESLOTS从毫秒(MS)转换为双插槽.intv_max = MS_TO_DOUBLESLOTS (20),
///延迟在连接事件测量.latency = 0,
在计时器测量单位///监督超时(10毫秒)///使用宏MS_TO_TIMERUNITS将毫秒(ms)转换为计时器单位.time_out = MS_TO_TIMERUNITS(1250),
在BLE双时隙测量///最小连接事件持续时间(1.25ms)///使用宏观MS_TO_DOUBLESLOTS从毫秒(MS)转换为双插槽.ce_len_min = ms_to_doubleslots(0),
///在BLE双槽(1.25ms)中测量的最大连接事件持续时间///使用宏观MS_TO_DOUBLESLOTS从毫秒(MS)转换为双插槽.ce_len_max = MS_TO_DOUBLESLOTS(0),};
不要紧,我使用RCX20睡眠时钟?
所以led和蜂鸣器可以在扩展睡眠模式下工作,但我必须在peripher_init()中设置状态?
如果我的产品需要一直连接,睡眠模式能省电吗?因为我发现连接之后,经常会调用peripher_init(),这意味着经常会唤醒核心。
关于你把代码放在哪里是否重要,我认为你指的是与外部传感器接口的代码,正如我上面提到的,它取决于设备的状态(连接,广告)和代码执行所需的时间,如果它花费的时间足够长,您可能会错过连接间隔和与外围设备的连接松散。
至于如何增加连接间隔连接间隔由中央确定,你可以做什么,是发出连接请求,更新和中心将决定是否将接受连接参数,你有要求。该SDK您已经粘贴的部分是一部分,该设备将检查在与中心连接,如果当前的参数不匹配会以更新的连接参数发送请求到中央(请求被发送10连接之后秒成立),因此,如果中央接受的参数的连接将在user_connection_param_conf结构改变为指定的值。
对于连接参数,LP时钟没有任何影响。
如上所述,LED能够工作,因为引脚都会保持其状态,而该设备处于休眠模式时,你只需要记住引脚的状态,因为起床后的periph_init在periph_init()进行相应的设置()执行并且销被重新配置。关于蜂鸣器我想你提供的PWM,定时器在休眠模式期间从而PWM关闭,因此你将无法以产生PWM驱动蜂鸣器当所述设备处于睡眠模式。
是的,休眠模式可以节省功率,该装置将落入睡眠和醒来的布置连接间隔,关于periph_init()的时间和频率被调用时,如所提到的其在每一个连接间隔,以便与中心进行通信调用一般较长的连接间隔,时间越长,你应该睡觉(考虑外部唤醒UPS未服用)越多,你睡你消耗越少。
不,我的意思是把代码放到唤醒计时器回调或简单唤醒回调中。一个影响睡眠,一个影响连接事件?解决这两个问题的方法是增加连接间隔?
以常规方式,代码应该是简单的唤醒回调?
所以在我的应用程序中,需要一直连接DA14580,核心通过连接间隔睡眠并唤醒?
我发现Android没有api改变连接间隔,所以我可以使用app_easy_gap_param_update_start在user_on_connection更新连接参数到我的user_connection_param_conf在user_config.h?
user_gapm_conf之间的间隔与user_connection_param_conf中的间隔之间有什么区别?他们是同样的吗?如何使用app_easy_gap_dev_configure()使用user_gapm_conf?
在训练04,它说,使用RCX20,它可以计数达2秒只有当连接或在无限的时间,而广告,这是否意味着连接间隔必须小于2秒?
而在SmartTag参考表10中,可以看出2500 ms间隔比500 ms间隔使用更多的功率,原因是:对于更长的间隔,射频接收机必须活动较长时间,以检测来自主服务器的轮询。这和你说的不一样。是连接功耗吗?
你的意思是,如果它的问题在文件中你要放置回调,你会放置app_easy_wakeup_set()?没有也没关系。对于其中上面提到你应该把你的代码依赖于交易的长度,如果交易保持MCU占据很长一段时间它好好尝试一下身在何处的代码,因为你占用MCU它会毁了你的连接很长一段时间(这是你应该考虑打破在更小的碎片您的交易的情况下),如果你把你的代码在唤醒定时器的回调会影响,因为与传感器将与interfiere的交互系统的唤醒唤醒过程,在app_easy方法的设备将同步通过消息开始交易,这将是确定的苏醒过程,但同样,如果程序是足够长的时间,并从服务延迟装置在区间您将松散的连接连接。
是的,SDK会根据广告或连接间隔来考虑设备的睡眠时间。
如上所述,是的,您可以向中央发送请求,如果它要接受外围设备所示的参数,以及SDK将需要一些时间以发送请求(约10秒)。
不,BLE指定可实现的最大连接间隔不超过4秒。
在之前的文章中,我提到了一个可以遵循的一般规则,并不是每种设计都适用,Smart Tag上提到的功耗是每次唤醒时的功耗。这意味着,在第一种情况下每次设备会醒来,醒来每500 ms)它将消耗约752 ua和每次在第二种情况下,设备会醒来(2500毫秒),它将消耗约1199,更清楚在第二种情况下设备将消费更多,但醒来更少时间。所以这是一个必须考虑的权衡。
现在我将MIN连接间隔设置为1秒钟,最大连接间隔为2秒。
我发现如果我把代码放到唤醒计时器回调中,DA14580会死。如果我把代码放在简单的唤醒回调,它也不能工作。
我的想法是:当在唤醒计时器回调时,无论连接间隔多长,代码延迟唤醒过程,所以它死。但在简单的唤醒回调中,芯片正确地唤醒,间隔足够长,代码运行,它可以工作。
但DA14580也死了。为什么?所以也许我需要增加睡眠间隔?
我的问题有什么原因吗?
期待您的来信!
在一秒钟,虽然间隔的增加不会解决你的问题,我忽略了一个事实,因为你有一个连接,你也被外部中断唤醒,有可能外部中断可能发生在连接事件之前,理论上,如果事务足够小,应该不会影响连接,因为设备有时间进行传感器事务,并通过调用rwip_schedule函数来服务BLE事件。现在在你的情况中apparenty事务很长,如果它发生在连接事件rwip_schedule()(时间表)的消息的函数不会被称为(因为传感器事务正在进行)所以你将错过的事件,会导致断开连接。您可以尝试的是,如前一篇文章所述,在触发app_easy_message时设置一个标志,而不是在处理程序中进行交互。在主循环(使用回调函数我提到app_on_system_powered)你可以检查标志和传感器交互与KEEP_POWERED在每个小块并返回事务以迫使rwip_schedule()函数来运行调度程序和任何upcomming事件。
所以,你是指我设置一个标志命名samplefull,当传感器使得中断,I标志设置为true,唤醒回调,并在app_on_system_powered喜欢写代码
user_on_system_powered ()如果samplefull ==真{阅读所有样品做点什么}回来睡会儿
我不能阅读所有的样品在一个时间,如果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检查国旗,如果它真的,它开始与传感器的交互。不让外围interraction一下子因为如果你保持580年app_on_system_powered然后当连接事件打你将执行代码从传感器获得数据,你就会继续这样做,直到你的互动结束,这将导致不执行rwip_schedule。因此,在app_on_system_powered中进行交互,并将其分成小块数据,就像你在文章中提到的那样。因此,如果你有一个200个数据事务,那么可以创建10个事务,每个事务包含20个数据,在每个事务之后,使用KEEP_POWERED从app_on_system_powered()返回,以便app_on_ble_powered()再次运行并安排消息(如果有消息的话)。
关于你的实验中,每个功能取决于设备的状态,并根据事件被调用。这些功能特别是app_on_ble_powered和app_on_system_powered不止一次在每个唤醒运行(只要设备是活动的,以服务BLE事件),也事实,即app_on_system_powered运行1比app_on_ble_powered运行更多的时间,因为它的第一一个运行只要BLE核活动,它需要一段时间的核心是积极的,对user_resume_from_sleep()它一旦它醒来只运行一次。如果你想知道为什么你对每个广告的事件,而不是一个连接事件更interations是因为广告事件持续时间超过一个连接事件更长的时间。
谢谢你的答案,现在芯片工作很好。我将传感器的所有操作放入动力回调。我会测试它是否处于稳定状态。
还有一个问题,你说增加间隔并不能解决我的问题,你还说这种活动连接间隔太小,所以你错过了连接事件。那么增加间隔有什么帮助呢?降低消费?
问候,丹尼尔
一开始我对你的实现感到困惑,我提到了增加连接间隔(我认为你在每个连接间隔中与传感器的交互将会唤醒,与传感器的交互将花费太多时间,直到下一个连接间隔)。关于连接间隔的长度,这取决于要实现的应用程序。短连接的间隔意味着你会醒来经常为了传输,因此您将消耗更多的权力,但你将能够发送更多的数据和速度,如果你不感兴趣的sed那么多数据和连接时间间隔较短,没有理由醒来,常常因为不会有数据交换,因此,没有理由经常唤醒设备。正如之前的帖子中提到的,是的,作为一个普遍的规则,一个人可以有更长的连接间隔来节省更多的电力,但这也取决于应用程序,这是一个权衡。
我测试代码3天,有时它也会死。死亡意味着它再也找不到,而不是我的手机断开。我不知道为什么。
现在我改变了我的想法,当触发唤醒计时器回调时,我唤醒核心,在简单的唤醒回调中用传感器做所有的事情,然后去睡觉。
这种方式是否与使用system_powered方式具有相同的消耗?因为我必须保持供电的核心使用system_powered时,与传感器交互?
最好的问候,丹尼尔
我不完全理解情况,你提到的设备去死的意思是没有断开连接,但无法找到(我想你的意思是广告),设备连接时,它也是广告?
关于第二个问题,如果我错了,请纠正我,但是,我认为这是我们在以前的帖子中处理的情况,我提到了在块中做所有的传感器交互,而不是在唤醒回调中有所有的交互。关于GATT错误,你得到133十进制不是一个有效的GATT错误码,如果你提到这到底发生在哪里,在断开回调?你提到的错误是断开的原因吗?
我不认为这将对您的功耗产生任何重大影响,因为在这两种情况下,您在两种情况下都保持580才能从传感器中读取,或许在块中读取的同时保持设备的方法将保持设备唤醒更多,但我不认为功耗将是重要的。
因为Android没有像Lightblue这样的工具,所以我使用nrf连接器来测试我的芯片。
下载代码后,我扫描芯片,连接它,切换通知并查看结果。
一段时间后,它会断开连接,无法再找到,按钮功能不能再工作,所以我认为芯片已经死了。
错误代码来自nrf连接器。
我很抱歉,但我很困惑,你提到你抛弃的方式,我为了如何得到的数据表明,你执行时app_easy_wakeup被触发(从第一次引起了设备停转,由于整个数据事务的原因,我上面提到的)。由于同时连接和数据通知意味着该装置被卡住的地方在代码中,由于断言,你将不得不调试,以检查其中的设备正好档。
我试了三种方法,
1.与传感器交互并在易于捕获的唤醒回调中读取数据,而无禁用_sleep_mode(),只有蜂鸣器打开时禁用_sleep_mode()。2.与传感器交互,并使用禁用唤醒呼叫中的读取数据删除→sleep_mode()。3.与传感器和读取数据相互作用,在user_on_system_powered()中读取数据,只读取传感器状态并在Easy Wakeup回调中设置标志,并在蜂鸣器打开时使用disable_sleep_mode()。
他们都失败了。
当我把代码放在简单的唤醒回调,uvision不会触发断言,所以我找不到哪里出了问题。
对不起,但是,通过您提供的信息,我无法弄清楚设备摊位的位置,您必须在不同的情况下测试这一点,以便给我更多的线索来弄清楚什么可能出错。如果在设备从User_on_System_Powered()唤醒时读取传感器,并且您返回Keep_Power后,才能让设备在阅读时保持清醒,然后我不认为您错过了任何BLE事件。如果在调试模式下设备不会停止,那么您可以做的是将设备留下在无睡眠模式下运行,并且当发生调试器时,当该问题发生时,通过执行以下操作,检查设备停顿的位置:
1)在项目的所有文件中搜索“SetBits16(SYS_CTRL_REG, DEBUGGER_ENABLE, 0);”,并到处注释。//如果你正在使用SDK5,这应该已经完成了2)在项目的应用程序文件夹中创建xxx.uvprojx的副本,并将xxx_attach.uvprojx命名为xxx_attach.uvprojx3)运行的附加项目,并转到项目选项4)在“调试”页签禁用“启动时加载应用程序”复选框,并擦除到初始化文件的链接5)单击调试器的设置按钮,禁用“连接后重启”复选框6)单击“确定”并再次确定以关闭项目选项7)回到原来的项目,编译你的代码,就像你总是做的附加调试器以下载代码(在RAM中)9)分离调试器以启动代码的执行
-------------------------运行你的代码,一旦出现问题------------------
10)在不下载代码(热连接)的情况下再次连接到附件并启动调试器。如果CPU处于断点,那么您可以找到已停止的代码行。
我尝试了所提到的方式,(无法找到任何“setbits16(sys_ctrl_reg,debugger_enable,0);”,但查找“setbits16(sys_ctrl_reg,debugger_enable,1);”)复制项目文件,修改选项,并首先启动调试会话并在xxx.uvprojx中运行代码。然后等待芯片出错,然后运行xxx_attach.uvprojx并开始调试会话。
但它显示了一个错误。日志如下:
加载“f:\\对话框\\ 5.0.4 \\ projects \\ target_apps \\ template \\ v2 - leedwake \\ keil_5 \\ out_580 \\ extent_peripheral_template_580.axf”JLINK设置项目文件 “F:\对话\ 5.0.4 \项目\ target_apps \模板\ V2 - ledwake \ Keil_5 \ JLinkSettings.ini”* JLINK INFO:选择“Cortex-M0”所选的。
JLink信息:------------DLL: V5.12e,编译Apr 29 2016 15:03:58固件:J-Link ARM-OB STM32编译2012年8月22日19:52:04硬件:V7.00S / N:20090928功能:RDI,Flashdl,FlashBP,JFLASH,GDBFULL
* JLink Info: Found SWD-DP with ID 0x0BB11477* JLINK信息:发现的Cortex-M0 r0p0,小尾数。* JLINK信息:FPUnit:4代码(BP)插槽和0字面槽* JLink信息:CoreSight组件:* jlink信息:romtbl 0 @ E00FF000* jlink信息:romtbl 0 [0]:fff0f000,cid:b105e00d,pid:000bb008 scs* jlink信息:romtbl 0 [1]:fff02000,cid:b105e00d,pid:000bb00a dwt* JLINK信息:ROMTbl 0 [2]:FFF03000,CID:B105E00D,PID:000BB00B FPBROMTableAddr = 0 xe00ff000
目标信息:------------设备:ARMCM0vtarget = 3.300V.销状态: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加载完成后在十五点40分09秒
如果您使用的是使用最新的SDK16(sys_ctrl_reg,debugger_enable,0),则在上面提到的方向上提到。完成后,SDK5.0.4当设备睡眠时不会禁用调试器模块(SDK的旧版本)。关于您所看到的错误是因为您尚未在Keil中指定,您将在“目标选项”中的“实用程序”选项卡中“使用Flash编程”中的“使用外部工具”。
嗨daniel59,
它只是为了唤醒时使用,用(),您将只需设置一个回调函数的设备尽快唤醒消息从app_easy_wakeup函数发送执行app_easy_wakeup_set的API()。所以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),//选择引脚(GPIO_BUTTON_PORT,GPIO_BUTTON_PIN)
WKUPCT_PIN_POLARITY(GPIO_BUTTON_PORT,GPIO_BUTTON_PIN,WKUPCT_PIN_POLARITY_LOW),//极性低
1, // 1事件
40);//去抖动时间= 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),//选择引脚(GPIO_BUTTON_PORT,GPIO_BUTTON_PIN)
WKUPCT_PIN_POLARITY(GPIO_BUTTON_PORT,GPIO_BUTTON_PIN,WKUPCT_PIN_POLARITY_LOW),//极性低
1, // 1事件
40);//去抖动时间= 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),//选择引脚(GPIO_BUTTON_PORT,GPIO_BUTTON_PIN)
WKUPCT_PIN_POLARITY(GPIO_BUTTON_PORT,GPIO_BUTTON_PIN,WKUPCT_PIN_POLARITY_LOW),//极性低
1, // 1事件
40);//去抖动时间= 0
静态孔隙app_button_press_cb(空白)
{
if(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();//调用为了所述app_easy_wakeup()只要BLE醒来以执行app_wakeup_cb()函数和打开// LED
}
}
由于MT_dialog
嗨MT_dialog,
但我发现,在SmartTag源代码中,App_easy_wakeup()只是app_easy_wakeup_set()之后;
你的意思是我必须在app_easy_wakeup之前修改睡眠模式?或者我可以修改睡眠模式在简单的唤醒回调?
而我的代码不转BLE下来,这样我可以直接使用app_easy_wakeup如果没有(arch_ble_ext_wakeup_get())?
如果我有更多的操作核心醒来后做,我应该在哪里放置的代码?在wkupct回调或容易唤醒回调?
应在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(这些回调是如何使用的,你可以找到在UM-B-051的详细信息 - da1458x软件平台参考v1.0.pdf 7.2节)。
关于arch_ble_ext_wakeup_get()检查是为了做验证用户已经调用arch_ble_ext_wakeup_on(),如果你临睡前不要调用此功能,你不必做检查。
通常wkupct回调的initilalization外设(periph_init()),迫使BLE唤醒(如果需要),调用arch_ble_ext_wakeup_off()如果arch_ble_ext_wakeup_on()被调用之前睡觉,并通过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(无效)
{
A ++;
返回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水印中断唤醒定时器是否有幸获得连接,退出所有FIFO数据和计算步数,举个例子,如果一步数大于100开启蜂鸣器和领导,需要禁用睡眠模式的核心。
我写了唤醒计时器回调的所有代码,它可以工作,但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管脚,因为当wkup从睡眠模式时,所有的管脚配置已经丢失。
像这样
if(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秒,当在睡眠模式下引脚保持其状态,所以要睡觉时没有问题,但问题是当设备被唤醒。该periph_init()被调用在每个醒来,以便配置应用程序所使用的针,所以当periph_init()执行引脚重新配置和他们的状态也是如此。为了克服,你将不得不存储引脚的值(有效,无效),并在每个醒来配置根据您已存储的状态在periph_init()功能引脚的状态。
由于MT_dialog
嗨MT_dialog,
所以我把代码置于哪里有重要吗?
如何增加连接间隔超时和连接延迟?
它是下面的代码吗?
Static const struct connection_param_configuration user_connection_param_conf = {
///在双槽中测量的最小连接间隔(1.25ms)
///使用宏观MS_TO_DOUBLESLOTS从毫秒(MS)转换为双插槽
.intv_min = MS_TO_DOUBLESLOTS (10),
在BLE双时隙测量///连接间隔最大(1.25ms)
///使用宏观MS_TO_DOUBLESLOTS从毫秒(MS)转换为双插槽
.intv_max = MS_TO_DOUBLESLOTS (20),
///延迟在连接事件测量
.latency = 0,
在计时器测量单位///监督超时(10毫秒)
///使用宏MS_TO_TIMERUNITS将毫秒(ms)转换为计时器单位
.time_out = MS_TO_TIMERUNITS(1250),
在BLE双时隙测量///最小连接事件持续时间(1.25ms)
///使用宏观MS_TO_DOUBLESLOTS从毫秒(MS)转换为双插槽
.ce_len_min = ms_to_doubleslots(0),
///在BLE双槽(1.25ms)中测量的最大连接事件持续时间
///使用宏观MS_TO_DOUBLESLOTS从毫秒(MS)转换为双插槽
.ce_len_max = MS_TO_DOUBLESLOTS(0),
};
不要紧,我使用RCX20睡眠时钟?
所以led和蜂鸣器可以在扩展睡眠模式下工作,但我必须在peripher_init()中设置状态?
如果我的产品需要一直连接,睡眠模式能省电吗?因为我发现连接之后,经常会调用peripher_init(),这意味着经常会唤醒核心。
嗨daniel59,
关于你把代码放在哪里是否重要,我认为你指的是与外部传感器接口的代码,正如我上面提到的,它取决于设备的状态(连接,广告)和代码执行所需的时间,如果它花费的时间足够长,您可能会错过连接间隔和与外围设备的连接松散。
至于如何增加连接间隔连接间隔由中央确定,你可以做什么,是发出连接请求,更新和中心将决定是否将接受连接参数,你有要求。该SDK您已经粘贴的部分是一部分,该设备将检查在与中心连接,如果当前的参数不匹配会以更新的连接参数发送请求到中央(请求被发送10连接之后秒成立),因此,如果中央接受的参数的连接将在user_connection_param_conf结构改变为指定的值。
对于连接参数,LP时钟没有任何影响。
如上所述,LED能够工作,因为引脚都会保持其状态,而该设备处于休眠模式时,你只需要记住引脚的状态,因为起床后的periph_init在periph_init()进行相应的设置()执行并且销被重新配置。关于蜂鸣器我想你提供的PWM,定时器在休眠模式期间从而PWM关闭,因此你将无法以产生PWM驱动蜂鸣器当所述设备处于睡眠模式。
是的,休眠模式可以节省功率,该装置将落入睡眠和醒来的布置连接间隔,关于periph_init()的时间和频率被调用时,如所提到的其在每一个连接间隔,以便与中心进行通信调用一般较长的连接间隔,时间越长,你应该睡觉(考虑外部唤醒UPS未服用)越多,你睡你消耗越少。
由于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之间的间隔与user_connection_param_conf中的间隔之间有什么区别?他们是同样的吗?如何使用app_easy_gap_dev_configure()使用user_gapm_conf?
在训练04,它说,使用RCX20,它可以计数达2秒只有当连接或在无限的时间,而广告,这是否意味着连接间隔必须小于2秒?
而在SmartTag参考表10中,可以看出2500 ms间隔比500 ms间隔使用更多的功率,原因是:对于更长的间隔,射频接收机必须
活动较长时间,以检测来自主服务器的轮询。这和你说的不一样。是连接功耗吗?
谢谢,
丹尼尔
嗨daniel59,
你的意思是,如果它的问题在文件中你要放置回调,你会放置app_easy_wakeup_set()?没有也没关系。对于其中上面提到你应该把你的代码依赖于交易的长度,如果交易保持MCU占据很长一段时间它好好尝试一下身在何处的代码,因为你占用MCU它会毁了你的连接很长一段时间(这是你应该考虑打破在更小的碎片您的交易的情况下),如果你把你的代码在唤醒定时器的回调会影响,因为与传感器将与interfiere的交互系统的唤醒唤醒过程,在app_easy方法的设备将同步通过消息开始交易,这将是确定的苏醒过程,但同样,如果程序是足够长的时间,并从服务延迟装置在区间您将松散的连接连接。
是的,SDK会根据广告或连接间隔来考虑设备的睡眠时间。
如上所述,是的,您可以向中央发送请求,如果它要接受外围设备所示的参数,以及SDK将需要一些时间以发送请求(约10秒)。
不,BLE指定可实现的最大连接间隔不超过4秒。
在之前的文章中,我提到了一个可以遵循的一般规则,并不是每种设计都适用,Smart Tag上提到的功耗是每次唤醒时的功耗。这意味着,在第一种情况下每次设备会醒来,醒来每500 ms)它将消耗约752 ua和每次在第二种情况下,设备会醒来(2500毫秒),它将消耗约1199,更清楚在第二种情况下设备将消费更多,但醒来更少时间。所以这是一个必须考虑的权衡。
由于MT_dialog
嗨MT_dialog,
现在我将MIN连接间隔设置为1秒钟,最大连接间隔为2秒。
我发现如果我把代码放到唤醒计时器回调中,DA14580会死。如果我把代码放在简单的唤醒回调,它也不能工作。
我的想法是:当在唤醒计时器回调时,无论连接间隔多长,代码延迟唤醒过程,所以它死。
但在简单的唤醒回调中,芯片正确地唤醒,间隔足够长,代码运行,它可以工作。
但DA14580也死了。为什么?所以也许我需要增加睡眠间隔?
嗨MT_dialog,
我的问题有什么原因吗?
期待您的来信!
谢谢,
丹尼尔
嗨daniel59,
在一秒钟,虽然间隔的增加不会解决你的问题,我忽略了一个事实,因为你有一个连接,你也被外部中断唤醒,有可能外部中断可能发生在连接事件之前,理论上,如果事务足够小,应该不会影响连接,因为设备有时间进行传感器事务,并通过调用rwip_schedule函数来服务BLE事件。现在在你的情况中apparenty事务很长,如果它发生在连接事件rwip_schedule()(时间表)的消息的函数不会被称为(因为传感器事务正在进行)所以你将错过的事件,会导致断开连接。您可以尝试的是,如前一篇文章所述,在触发app_easy_message时设置一个标志,而不是在处理程序中进行交互。在主循环(使用回调函数我提到app_on_system_powered)你可以检查标志和传感器交互与KEEP_POWERED在每个小块并返回事务以迫使rwip_schedule()函数来运行调度程序和任何upcomming事件。
由于MT_dialog
嗨MT_dialog,
所以,你是指我设置一个标志命名samplefull,当传感器使得中断,I标志设置为true,唤醒回调,并在app_on_system_powered喜欢写代码
user_on_system_powered ()
如果samplefull ==真
{
阅读所有样品
做点什么
}
回来睡会儿
我不能阅读所有的样品在一个时间,如果200个样本,使中断,我要读20个样本一次,读取10次,或芯片会出问题?
所以我必须这样写:
user_on_system_powered ()
如果将SampleNumber> 0
{
阅读20样品
Samplenumber-20.
做点什么
返回保持动力
}
别的
回来睡会儿
我尝试了在空白模板项目中提到的简单代码。
arch_main_loop_callback_ret_t user_on_system_powered(无效)
{
A ++;
返回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检查国旗,如果它真的,它开始与传感器的交互。不让外围interraction一下子因为如果你保持580年app_on_system_powered然后当连接事件打你将执行代码从传感器获得数据,你就会继续这样做,直到你的互动结束,这将导致不执行rwip_schedule。因此,在app_on_system_powered中进行交互,并将其分成小块数据,就像你在文章中提到的那样。因此,如果你有一个200个数据事务,那么可以创建10个事务,每个事务包含20个数据,在每个事务之后,使用KEEP_POWERED从app_on_system_powered()返回,以便app_on_ble_powered()再次运行并安排消息(如果有消息的话)。
关于你的实验中,每个功能取决于设备的状态,并根据事件被调用。这些功能特别是app_on_ble_powered和app_on_system_powered不止一次在每个唤醒运行(只要设备是活动的,以服务BLE事件),也事实,即app_on_system_powered运行1比app_on_ble_powered运行更多的时间,因为它的第一一个运行只要BLE核活动,它需要一段时间的核心是积极的,对user_resume_from_sleep()它一旦它醒来只运行一次。如果你想知道为什么你对每个广告的事件,而不是一个连接事件更interations是因为广告事件持续时间超过一个连接事件更长的时间。
由于MT_dialog
嗨MT_dialog,
谢谢你的答案,现在芯片工作很好。我将传感器的所有操作放入动力回调。我会测试它是否处于稳定状态。
还有一个问题,你说增加间隔并不能解决我的问题,你还说这种活动连接间隔太小,所以你错过了连接事件。那么增加间隔有什么帮助呢?降低消费?
问候,
丹尼尔
嗨daniel59,
一开始我对你的实现感到困惑,我提到了增加连接间隔(我认为你在每个连接间隔中与传感器的交互将会唤醒,与传感器的交互将花费太多时间,直到下一个连接间隔)。关于连接间隔的长度,这取决于要实现的应用程序。短连接的间隔意味着你会醒来经常为了传输,因此您将消耗更多的权力,但你将能够发送更多的数据和速度,如果你不感兴趣的sed那么多数据和连接时间间隔较短,没有理由醒来,常常因为不会有数据交换,因此,没有理由经常唤醒设备。正如之前的帖子中提到的,是的,作为一个普遍的规则,一个人可以有更长的连接间隔来节省更多的电力,但这也取决于应用程序,这是一个权衡。
由于MT_dialog
嗨MT_dialog,
我测试代码3天,有时它也会死。死亡意味着它再也找不到,而不是我的手机断开。我不知道为什么。
现在我改变了我的想法,当触发唤醒计时器回调时,我唤醒核心,在简单的唤醒回调中用传感器做所有的事情,然后去睡觉。
这种方式是否与使用system_powered方式具有相同的消耗?因为我必须保持供电的核心使用system_powered时,与传感器交互?
最好的问候,
丹尼尔
嗨daniel59,
我不完全理解情况,你提到的设备去死的意思是没有断开连接,但无法找到(我想你的意思是广告),设备连接时,它也是广告?
关于第二个问题,如果我错了,请纠正我,但是,我认为这是我们在以前的帖子中处理的情况,我提到了在块中做所有的传感器交互,而不是在唤醒回调中有所有的交互。关于GATT错误,你得到133十进制不是一个有效的GATT错误码,如果你提到这到底发生在哪里,在断开回调?你提到的错误是断开的原因吗?
我不认为这将对您的功耗产生任何重大影响,因为在这两种情况下,您在两种情况下都保持580才能从传感器中读取,或许在块中读取的同时保持设备的方法将保持设备唤醒更多,但我不认为功耗将是重要的。
由于MT_dialog
嗨MT_dialog,
因为Android没有像Lightblue这样的工具,所以我使用nrf连接器来测试我的芯片。
下载代码后,我扫描芯片,连接它,切换通知并查看结果。
一段时间后,它会断开连接,无法再找到,按钮功能不能再工作,所以我认为芯片已经死了。
错误代码来自nrf连接器。
最好的问候,
丹尼尔
嗨daniel59,
我很抱歉,但我很困惑,你提到你抛弃的方式,我为了如何得到的数据表明,你执行时app_easy_wakeup被触发(从第一次引起了设备停转,由于整个数据事务的原因,我上面提到的)。由于同时连接和数据通知意味着该装置被卡住的地方在代码中,由于断言,你将不得不调试,以检查其中的设备正好档。
由于MT_dialog
嗨MT_dialog,
我试了三种方法,
1.与传感器交互并在易于捕获的唤醒回调中读取数据,而无禁用_sleep_mode(),只有蜂鸣器打开时禁用_sleep_mode()。
2.与传感器交互,并使用禁用唤醒呼叫中的读取数据删除→sleep_mode()。
3.与传感器和读取数据相互作用,在user_on_system_powered()中读取数据,只读取传感器状态并在Easy Wakeup回调中设置标志,并在蜂鸣器打开时使用disable_sleep_mode()。
他们都失败了。
当我把代码放在简单的唤醒回调,uvision不会触发断言,所以我找不到哪里出了问题。
最好的问候,
丹尼尔
嗨daniel59,
对不起,但是,通过您提供的信息,我无法弄清楚设备摊位的位置,您必须在不同的情况下测试这一点,以便给我更多的线索来弄清楚什么可能出错。如果在设备从User_on_System_Powered()唤醒时读取传感器,并且您返回Keep_Power后,才能让设备在阅读时保持清醒,然后我不认为您错过了任何BLE事件。如果在调试模式下设备不会停止,那么您可以做的是将设备留下在无睡眠模式下运行,并且当发生调试器时,当该问题发生时,通过执行以下操作,检查设备停顿的位置:
1)在项目的所有文件中搜索“SetBits16(SYS_CTRL_REG, DEBUGGER_ENABLE, 0);”,并到处注释。//如果你正在使用SDK5,这应该已经完成了
2)在项目的应用程序文件夹中创建xxx.uvprojx的副本,并将xxx_attach.uvprojx命名为xxx_attach.uvprojx
3)运行的附加项目,并转到项目选项
4)在“调试”页签禁用“启动时加载应用程序”复选框,并擦除到初始化文件的链接
5)单击调试器的设置按钮,禁用“连接后重启”复选框
6)单击“确定”并再次确定以关闭项目选项
7)回到原来的项目,编译你的代码,就像你总是做的
附加调试器以下载代码(在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:\\对话框\\ 5.0.4 \\ projects \\ target_apps \\ template \\ v2 - leedwake \\ keil_5 \\ out_580 \\ extent_peripheral_template_580.axf”
JLINK设置项目文件 “F:\对话\ 5.0.4 \项目\ target_apps \模板\ V2 - ledwake \ Keil_5 \ JLinkSettings.ini”
* JLINK INFO:选择“Cortex-M0”所选的。
JLink信息:
------------
DLL: V5.12e,编译Apr 29 2016 15:03:58
固件:J-Link ARM-OB STM32编译2012年8月22日19:52:04
硬件:V7.00
S / N:20090928
功能:RDI,Flashdl,FlashBP,JFLASH,GDBFULL
* JLink Info: Found SWD-DP with ID 0x0BB11477
* JLINK信息:发现的Cortex-M0 r0p0,小尾数。
* JLINK信息:FPUnit:4代码(BP)插槽和0字面槽
* JLink信息:CoreSight组件:
* jlink信息:romtbl 0 @ E00FF000
* jlink信息:romtbl 0 [0]:fff0f000,cid:b105e00d,pid:000bb008 scs
* jlink信息:romtbl 0 [1]:fff02000,cid:b105e00d,pid:000bb00a dwt
* JLINK信息:ROMTbl 0 [2]:FFF03000,CID:B105E00D,PID:000BB00B FPB
ROMTableAddr = 0 xe00ff000
目标信息:
------------
设备:ARMCM0
vtarget = 3.300V.
销状态:
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加载完成后在十五点40分09秒
最好的问候,
丹尼尔
嗨daniel59,
如果您使用的是使用最新的SDK16(sys_ctrl_reg,debugger_enable,0),则在上面提到的方向上提到。完成后,SDK5.0.4当设备睡眠时不会禁用调试器模块(SDK的旧版本)。关于您所看到的错误是因为您尚未在Keil中指定,您将在“目标选项”中的“实用程序”选项卡中“使用Flash编程”中的“使用外部工具”。
由于MT_dialog