我在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), //选择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), //选择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), //选择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();}
if(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,
但我发现,在SmartTag源代码中,App_easy_wakeup()只是app_easy_wakeup_set()之后;
你的意思是我必须在app_easy_wakeup之前修改睡眠模式?或者我可以修改睡眠模式在简单的唤醒回调?
我的代码没有关闭BLE,所以我可以直接使用app_easy_wakeup而不需要if (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_WAKESUP_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(void){+ +;返回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从睡眠模式时,所有的管脚配置已经丢失。像这样如果(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()执行引脚时,还可以重新配置,以及其状态。为了克服您必须存储PIN(活动,非活动)的值,并且在每个唤醒中根据所存储的状态配置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),
///最小连接事件持续时间(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和蜂鸣器可以在扩展的睡眠模式下工作,但我必须在periph_init()中设置状态?
如果我的产品需要一直连接,可以睡眠模式保存电源?因为我发现连接后,通常被调用Periph_init(),这意味着通常会醒来的话。
关于你把代码放在哪里是否重要,我认为你指的是与外部传感器接口的代码,正如我上面提到的,它取决于设备的状态(连接,广告)和代码执行所需的时间,如果它花费的时间足够长,您可能会错过连接间隔和与外围设备的连接松散。
关于如何提高连接间隔,连接间隔由中央定义,您可以做什么,是发出连接更新请求,中央将决定它是否会接受所请求的连接参数。您已经粘贴的SDK的一部分是设备将与中央连接检查的部分,以及当前参数不匹配将向中央发送请求,以便更新连接参数(请求发送10建立连接后的秒数),因此如果中央接受参数,则连接将在User_connection_param_conf结构中更改为指定的值。
对于连接参数,您的LP时钟没有任何影响。
如上所述,LED可以工作,因为当设备处于睡眠模式时,引脚保持它们的状态,你只需要记住引脚的状态,并在peripher_init()中相应设置它,因为一旦唤醒,peripher_init()将执行,引脚将被重新配置。关于蜂鸣器,我假设你提供一个PWM,定时器在睡眠模式下关闭,因此,当设备处于睡眠模式时,你不能产生一个PWM来驱动蜂鸣器。
是的,睡眠模式可以节省电量,该设备将睡眠状态下降并以排列的连接间隔唤醒,关于periph_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方法中,设备将通过消息同步地开始事务,并且唤醒过程将是可以的,但是,如果过程足够长并延迟从服务延迟设备连接间隔,则可以松开联系。
是的,SDK会根据广告或连接间隔来考虑设备的睡眠时间。
正如上面提到的,是的,你可以发送请求到中央,它取决于中央是否接受外设指示的参数,而且SDK发送请求也需要一些时间(大约10秒)。
不,BLE指定可实现的最大连接间隔不超过4秒。
在上一篇文章中,我提到了一个可以遵循的一般规则,这不是每个设计的情况,并且智能标签上提到的功耗是每个唤醒中的功耗。这意味着在第一种情况下,每次设备将唤醒(并唤醒每500ms时),它将消耗大约752ua,并且每次设备将唤醒(2500ms)它将消耗大约1199在第二种情况下更清晰,该设备将消耗更多,但它将醒来减少次数。因此,这是一个必须考虑的权衡。
现在我将最小连接间隔设置为1秒,最大连接间隔设置为2秒。
我发现如果我把代码放到唤醒计时器回调中,DA14580会死。如果我把代码放在简单的唤醒回调,它也不能工作。
我的想法是:当在唤醒定时回调时,无论连接间隔有多长,代码会延迟唤醒过程,所以它死了。但在简单的唤醒回调中,芯片正确地唤醒,间隔足够长,代码运行,它可以工作。
但DA14580也死了。为什么?所以也许我需要增加睡眠间隔?
有关我的问题的原因吗?
期待您的回音!
在一秒钟,虽然间隔的增加不会解决你的问题,我忽略了一个事实,因为你有一个连接,你也被外部中断唤醒,有可能外部中断可能发生在连接事件之前,理论上,如果事务足够小,应该不会影响连接,因为设备有时间进行传感器事务,并通过调用rwip_schedule函数来服务BLE事件。现在在你的情况中apparenty事务很长,如果它发生在连接事件rwip_schedule()(时间表)的消息的函数不会被称为(因为传感器事务正在进行)所以你将错过的事件,会导致断开连接。您可以尝试的是,如前一篇文章所述,在触发app_easy_message时设置一个标志,而不是在处理程序中进行交互。在主循环(使用回调函数我提到app_on_system_powered)你可以检查标志和传感器交互与KEEP_POWERED在每个小块并返回事务以迫使rwip_schedule()函数来运行调度程序和任何upcomming事件。
所以你的意思是我设置了一个名为samplefull的标志,当传感器使中断时,我在唤醒回调中将标志设置为true,并在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检查国旗,如果它真的,它开始与传感器的交互。不让外围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运行的事实也比app_on_ble_powered运行更多的时间,它是因为第一个只要BLE核心处于活动状态,核心需要一段时间即可运行,对于user_resume_from_sleep(),它只能在唤醒时立即运行一次。如果您想知道为什么每个广告活动中有更多的交互而不是连接事件是因为广告活动持续时间长于连接事件。
谢谢你的回答,芯片现在工作正常。我把所有带传感器的操作都输入回叫器。我要测试它是否处于稳定状态。
还有一个问题,你说增加间隔并不能解决我的问题,你还说这种活动连接间隔太小,所以你错过了连接事件。那么增加间隔有什么帮助呢?降低消费?
问候,丹尼尔
在开始时,我对您的实现感到困惑,我提到的是增加连接间隔(虽然你在每个连接间隔唤醒中与传感器交互的情况下,与传感器的交互将花费太多时间直到下一个连接间隔。)。关于连接间隔的长度,这取决于您想要实现的应用程序。更短的连接间隔意味着您将更频繁地唤醒以便传输,因此您将消耗更多的电源,但如果您对SALINCING这么多的数据并具有短连接间隔,您将能够更快地发送更多的数据和更快。,没有理由唤醒,因为没有数据无法交换,因此没有理由唤醒设备经常唤醒设备。如前所述,作为一般规则,一个可以具有更长的连接间隔来节省更多的电源,但是再次取决于应用程序,并且还有一个权衡。
我测试代码3天,有时它也会死。死亡意味着它再也找不到,而不是我的手机断开。我不知道为什么。
现在我改变了主意,当触发唤醒定时器回调时,我唤醒了核心,在易于唤醒回调中使用传感器进行所有的东西,然后睡觉。
这种方式是否与使用system_powered方式具有相同的消耗?因为我必须保持供电的核心使用system_powered时,与传感器交互?
最好的祝福,丹尼尔
我没有完全搞清楚,你提到的是那些没有从手机断开连接但无法找到的设备的死亡含义(我想你的意思是通告),设备连接它是广告的?
关于第二个问题,如果我错了,请纠正我,但是,我认为这是我们在以前的帖子中处理的情况,我提到了在块中做所有的传感器交互,而不是在唤醒回调中有所有的交互。关于GATT错误,你得到133十进制不是一个有效的GATT错误码,如果你提到这到底发生在哪里,在断开回调?你提到的错误是断开的原因吗?
我不认为这将对您的功耗产生任何重大影响,因为在这两种情况下,您在两种情况下都保持580才能从传感器中读取,或许在块中读取的同时保持设备的方法将保持设备唤醒更多,但我不认为功耗将是重要的。
因为Android没有像Lightblue这样的工具,所以我使用nrf连接器来测试我的芯片。
下载代码后,我扫描芯片,连接它,切换通知,看看结果。
一段时间后,它会断开连接,无法再找到,按钮功能不能再工作,所以我认为芯片已经死了。
错误代码来自nrf连接器。
对不起,我很困惑,你提到你放弃了我建议的方式,以便在触发APP_EASY_WAKEUP时执行数据并在第一次引起的设备引起的时我提到的原因)。由于连接并通知数据时意味着设备在代码中的某个位置被粘在代码中,因此您必须调试才能检查设备困扰的位置。
我试了三种方法,
1.与传感器交互并在易于捕获的唤醒回调中读取数据,而无禁用_sleep_mode(),只有蜂鸣器打开时禁用_sleep_mode()。2.使用disable_sleep_mode()与传感器交互并在简单的唤醒回调中读取数据。3.与传感器交互并读取user_on_system_powered()中的数据,只读取传感器状态并在easy wakeup callback中设置标志,并在蜂鸣器打开时使用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.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:\Dialog\5.0.4\projects\target_apps\template\v2 - ledwake\Keil_5\JLinkSettings.ini"* JLink信息:设备“CORTEX-M0”被选中。
JLink信息:------------DLL:v5.12e,编译4月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 Info: Found Cortex-M0 r0p0, Little endian。* JLink Info: FPUnit: 4代码(BP)槽和0文字槽* JLink信息:CoreSight组件:* JLink Info: ROMTbl 0 @ E00FF000* jlink信息:romtbl 0 [0]:fff0f000,cid:b105e00d,pid:000bb008 scs* JLink Info: ROMTbl 0 [1]: FFF02000, CID: B105E00D, PID: 000BB00A DWT* jlink信息:romtbl 0 [2]:fff03000,cid:b105e00d,pid:000bb00b fpbromtableddr = 0xe00ff000
目标信息:------------设备: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"闪存负荷在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), //选择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), //选择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), //选择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();
}
if(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回调或简单的唤醒回调中?
什么代码应该在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_WAKESUP_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(void)
{
+ +;
返回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从睡眠模式时,所有的管脚配置已经丢失。
像这样
如果(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()执行引脚时,还可以重新配置,以及其状态。为了克服您必须存储PIN(活动,非活动)的值,并且在每个唤醒中根据所存储的状态配置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),
///最小连接事件持续时间(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和蜂鸣器可以在扩展的睡眠模式下工作,但我必须在periph_init()中设置状态?
如果我的产品需要一直连接,可以睡眠模式保存电源?因为我发现连接后,通常被调用Periph_init(),这意味着通常会醒来的话。
嗨daniel59,
关于你把代码放在哪里是否重要,我认为你指的是与外部传感器接口的代码,正如我上面提到的,它取决于设备的状态(连接,广告)和代码执行所需的时间,如果它花费的时间足够长,您可能会错过连接间隔和与外围设备的连接松散。
关于如何提高连接间隔,连接间隔由中央定义,您可以做什么,是发出连接更新请求,中央将决定它是否会接受所请求的连接参数。您已经粘贴的SDK的一部分是设备将与中央连接检查的部分,以及当前参数不匹配将向中央发送请求,以便更新连接参数(请求发送10建立连接后的秒数),因此如果中央接受参数,则连接将在User_connection_param_conf结构中更改为指定的值。
对于连接参数,您的LP时钟没有任何影响。
如上所述,LED可以工作,因为当设备处于睡眠模式时,引脚保持它们的状态,你只需要记住引脚的状态,并在peripher_init()中相应设置它,因为一旦唤醒,peripher_init()将执行,引脚将被重新配置。关于蜂鸣器,我假设你提供一个PWM,定时器在睡眠模式下关闭,因此,当设备处于睡眠模式时,你不能产生一个PWM来驱动蜂鸣器。
是的,睡眠模式可以节省电量,该设备将睡眠状态下降并以排列的连接间隔唤醒,关于periph_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方法中,设备将通过消息同步地开始事务,并且唤醒过程将是可以的,但是,如果过程足够长并延迟从服务延迟设备连接间隔,则可以松开联系。
是的,SDK会根据广告或连接间隔来考虑设备的睡眠时间。
正如上面提到的,是的,你可以发送请求到中央,它取决于中央是否接受外设指示的参数,而且SDK发送请求也需要一些时间(大约10秒)。
不,BLE指定可实现的最大连接间隔不超过4秒。
在上一篇文章中,我提到了一个可以遵循的一般规则,这不是每个设计的情况,并且智能标签上提到的功耗是每个唤醒中的功耗。这意味着在第一种情况下,每次设备将唤醒(并唤醒每500ms时),它将消耗大约752ua,并且每次设备将唤醒(2500ms)它将消耗大约1199在第二种情况下更清晰,该设备将消耗更多,但它将醒来减少次数。因此,这是一个必须考虑的权衡。
谢谢mt_dialog.
嗨mt_dialog,
现在我将最小连接间隔设置为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的标志,当传感器使中断时,我在唤醒回调中将标志设置为true,并在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(void)
{
+ +;
返回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运行的事实也比app_on_ble_powered运行更多的时间,它是因为第一个只要BLE核心处于活动状态,核心需要一段时间即可运行,对于user_resume_from_sleep(),它只能在唤醒时立即运行一次。如果您想知道为什么每个广告活动中有更多的交互而不是连接事件是因为广告活动持续时间长于连接事件。
谢谢mt_dialog.
嗨mt_dialog,
谢谢你的回答,芯片现在工作正常。我把所有带传感器的操作都输入回叫器。我要测试它是否处于稳定状态。
还有一个问题,你说增加间隔并不能解决我的问题,你还说这种活动连接间隔太小,所以你错过了连接事件。那么增加间隔有什么帮助呢?降低消费?
问候,
丹尼尔
嗨daniel59,
在开始时,我对您的实现感到困惑,我提到的是增加连接间隔(虽然你在每个连接间隔唤醒中与传感器交互的情况下,与传感器的交互将花费太多时间直到下一个连接间隔。)。关于连接间隔的长度,这取决于您想要实现的应用程序。更短的连接间隔意味着您将更频繁地唤醒以便传输,因此您将消耗更多的电源,但如果您对SALINCING这么多的数据并具有短连接间隔,您将能够更快地发送更多的数据和更快。,没有理由唤醒,因为没有数据无法交换,因此没有理由唤醒设备经常唤醒设备。如前所述,作为一般规则,一个可以具有更长的连接间隔来节省更多的电源,但是再次取决于应用程序,并且还有一个权衡。
谢谢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.使用disable_sleep_mode()与传感器交互并在简单的唤醒回调中读取数据。
3.与传感器交互并读取user_on_system_powered()中的数据,只读取传感器状态并在easy wakeup callback中设置标志,并在蜂鸣器打开时使用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命名为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:\Dialog\5.0.4\projects\target_apps\template\v2 - ledwake\Keil_5\JLinkSettings.ini"
* JLink信息:设备“CORTEX-M0”被选中。
JLink信息:
------------
DLL:v5.12e,编译4月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 Info: Found Cortex-M0 r0p0, Little endian。
* JLink Info: FPUnit: 4代码(BP)槽和0文字槽
* JLink信息:CoreSight组件:
* JLink Info: ROMTbl 0 @ E00FF000
* jlink信息:romtbl 0 [0]:fff0f000,cid:b105e00d,pid:000bb008 scs
* JLink Info: ROMTbl 0 [1]: FFF02000, CID: B105E00D, PID: 000BB00A DWT
* jlink信息:romtbl 0 [2]:fff03000,cid:b105e00d,pid:000bb00b fpb
romtableddr = 0xe00ff000
目标信息:
------------
设备: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"
闪存负荷在15:40:09完成
最好的祝福,
丹尼尔
嗨daniel59,
我在上面的说明中提到,如果你正在使用最新的SDK的SetBits16(SYS_CTRL_REG, DEBUGGER_ENABLE, 0);当设备进入睡眠状态时,SDK5.0.4不会禁用调试器模块(较老版本的SDK会禁用)。关于你看到的错误,是因为你没有在Keil中指定你将“使用外部工具进行Flash编程”,在“目标选项”的工具选项卡中。
谢谢mt_dialog.