使用timer0时的应用程序

⚠️
嗨,...感谢您来论坛。令人兴奋的消息!我们现在正在迁至我们的新论坛平台,将提供更好的功能,并包含在主对话框网站中。所有帖子和帐户都已迁移。我们现在只接受新论坛上的流量 - 请发布任何新线程https://www.dialog-seminile.com/support.。我们将在未来几天修复错误/优化搜索和标记。
9个帖子/ 0新
最后一篇
感伤
离线
最后一次露面:3年3个月前
加入:2016年11月28日15:55
使用timer0时的应用程序

1 hello对话框,
我有使用定时器0的问题,和应用程序崩溃每次。在我的应用程序,我想使用定时器0采样传感器数据反复,也就是说,每2ms(500Hz的),然后将数据发送回的Android手机。以前我用app_easy_timer运作良好,但由于easy_timer为10ms的最小时间间隔,我切换到定时器0。我测试了定时器0示例项目,似乎工作正常,所以我修改了样品,并添加到我的代码如下所示:

// timer0的标志,从电话端接收
bool的运行= TRUE;
struct user_data_buffer data_buff = {
.SIZE = 20,
。数据= {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
.pos = 0,
};

// 打回来
空隙timer0_general_user_callback_function(无效)
{
uint8_t val_acc [3] = {0,0,0};
get_accel(val_acc);
如果(data_buff.pos <18){
data_buff.data [data_buff.pos ++] = val_acc [0];
data_buff.data [data_buff.pos ++] = val_acc [1];
data_buff.data [data_buff.pos ++] = val_acc [2];
}
别的 {
data_buff.pos = 0;
//通过ble发送数据
struct musts1_val_ntf_req * req = ke_msg_alloc_dyn(custs1_val_ntf_req,
task_custs1,
task_app,
custs1_val_ntf_req,
DEF_CUST1_SENSOR_VAL_CHAR_LEN);
req-> conhdl = app_env-> conhdl;
req->手柄= CUST1_IDX_SENSOR_VAL_VAL;
req->长度= DEF_CUST1_SENSOR_VAL_CHAR_LEN;
的memcpy(req->值,&data_buff.data,DEF_CUST1_SENSOR_VAL_CHAR_LEN);
KE_MSG_SEND(REQ);
}
}

无效timer0_setup()
{
//停止计时器输入设置
timer0_stop();

//注册回调函数SWTIM_IRQn IRQ
timer0_register_callback(timer0_general_user_callback_function);

//允许定时器时钟
set_tmr_enable(CLK_PER_REG_TMR_ENABLED);

//设置TIMER0,TIMER2时钟分频因子为8,所以TIM0 FCLK是F = 16MHz的/ 8 = 2MHZ
set_tmr_div(clk_per_reg_tmr_div_8);

//明确的PWM寄存器设置为不产生PWM
timer0_set_pwm_high_counter(no_pwm);
timer0_set_pwm_low_counter(NO_PWM);

//与2MHz的源时钟设置计时器除以10,从而FCLK = 2MHz的/ 10 = 200kHz的
timer0_init(tim0_clk_32k,pwm_mode_one,tim0_clk_div_by_10);
timer0_set_pwm_on_counter(RELOAD_2000US);// 2000us

//启用SWTIM_IRQN IRQ
timer0_enable_irq();

//启动Timer0.
timer0_start();
在跑步的时候);
set_tmr_enable(clk_per_reg_tmr_disabled);
}

问题是当我调用timer0_setup()来启用计时器时,该应用程序断开电话和崩溃。
你能提供一些建议吗?

设备:
感伤
离线
最后一次露面:3年3个月前
加入:2016年11月28日15:55
为了使用定时器0,我

为了使用定时器0,我还可以通过改变(user_config.h)关闭睡眠模式:
const static sleep_state_t app_default_sleep_mode = arch_ext_sleep_on;

const static sleep_state_t app_default_sleep_mode = arch_sleep_off;
仍然是同样的问题。

PM_DIALOG.
离线
最后一次露面:2天9小时前
职员
加入:2018-02-08 11:03
嗨敏感,

嗨敏感,

你能澄清你在哪里崩溃的地方,以便更好地了解你的问题吗?设备断开连接后,您的代码在哪里?由于我能够在代码段中看到,因此在计时器运行时获得加速度计的值,因此可能是一个问题。您能否请在调试模式下运行代码,以检查WDOG命中或NMI是否已发生?请注意睡眠模式配置不会影响您的应用程序。

谢谢,PM_DIALOG.

感伤
离线
最后一次露面:3年3个月前
加入:2016年11月28日15:55
你好,

你好,
首先我评论了加速部分,只需向手机发送一些常量数字,仍然崩溃。我发现该程序在断开连接后在Wrap_platform_Reset停止:
void wrap_platform_reset(UINT32_T错误)
{
ASSERT_WARNING(错误== RESET_AFTER_SPOTA_UPDATE);//不要在SPOTA复位的情况下,不破
platform_reset_func(错误);
}

似乎错误代码是reset_mem_alloc_fail(0xf2f2f2f2),不确定为什么会发生这种情况。

感伤
离线
最后一次露面:3年3个月前
加入:2016年11月28日15:55
现在,我试图让定时器0

现在,我试图让timer0_general_user_callback_function一个空的功能,但应用程序仍崩溃,我发现它停在(运行),同时。

感伤
离线
最后一次露面:3年3个月前
加入:2016年11月28日15:55
修改:

修改:

挥发性UINT8_T TIMES = 100;
处理程序:
空隙timer0_general_user_callback_function(无效)
{
uint8_t val_acc [4] = {0,1,2,3};
val_acc [0] = times--;
struct musts1_val_ntf_req * req = ke_msg_alloc_dyn(custs1_val_ntf_req,task_custs1,task_app,custs1_val_ntf_req,def_cust1_sensor_val_char_len);
req-> conhdl = app_env-> conhdl;
req->手柄= CUST1_IDX_SENSOR_VAL_VAL;
req->长度= DEF_CUST1_SENSOR_VAL_CHAR_LEN;
memcpy(req->值,&val_acc,def_cust1_sensor_val_char_len);
KE_MSG_SEND(REQ);
}

设置:
无效timer0_setup()
{
//停止计时器输入设置
timer0_stop();
倍= 100;

//注册回调函数SWTIM_IRQn IRQ
timer0_register_callback(timer0_general_user_callback_function);

//允许定时器时钟
set_tmr_enable(CLK_PER_REG_TMR_ENABLED);

//设置TIMER0,TIMER2时钟分频因子为8,所以TIM0 FCLK是F = 16MHz的/ 8 = 2MHZ
set_tmr_div(clk_per_reg_tmr_div_8);

//明确的PWM寄存器设置为不产生PWM
timer0_set_pwm_high_counter(no_pwm);
timer0_set_pwm_low_counter(NO_PWM);

//与2MHz的源时钟设置计时器除以10,从而FCLK = 2MHz的/ 10 = 200kHz的
timer0_init(tim0_clk_32k,pwm_mode_one,tim0_clk_div_by_10);

//重新加载值100US()
timer0_set_pwm_on_counter(reload_100us * 20);// 2ms.

//启用SWTIM_IRQN IRQ
timer0_enable_irq();

//启动Timer0.
timer0_start();
//有限延迟
for(int i = 0; i <0xffff; i ++){
for(int j = 0; j <0x10; j ++){}
}

set_tmr_enable(clk_per_reg_tmr_disabled);
}

我在循环到循环时替换,并打开有限延迟,该应用应该发送数据包,从100,99,98等中减少次数。
1,使用当前延迟参数,手机可以接收3个数据包。但所有这些都与98开始的相同,而不是{100,...},{99,...},{98,...}。
2,当增加延迟参数或在循环时使用时,应用程序与手机断开连接并点击看门狗。

PM_DIALOG.
离线
最后一次露面:2天9小时前
职员
加入:2018-02-08 11:03
嗨敏感,

嗨敏感,

关于对wrap_platform_reset(),最明显的原因而发生是由于内存分配失败,这意味着在你的软件内存泄漏,你分配数据的地方,你永远不释放他们(你可以验证的是,在的功能,这应该是RESET_MEM_ALLOC_FAIL的参数误差)。选择最佳的堆您的应用程序,你应该通过改变堆的大小在da1458x_config_advanced.h文件进行实验。There is no way to know exactly what should be the exact size of the heap that your application should have, but in case my assumption is correct and there is an memory leakage, increasing your heap won’t help, it will just increase the time that the device would eventually halt in a platform reset.

当您尝试制作空Timer0_general_user_callback_function函数时,您的应用程序仍然崩溃在Wrap_platform_reset()或其他某处?看门狗击中,因为某些东西延迟了你的代码,所以你不应该长时间延迟。你能澄清看门狗击中的地方吗?

谢谢,PM_DIALOG.

感伤
离线
最后一次露面:3年3个月前
加入:2016年11月28日15:55
你好,

你好,
关于wrap_platform_reset()问题我认为我通过减少连接间隔来修复它。但是,看门狗问题没有解决。你可以在2018-05-18 02张Fri,2018-05-18 02下发布的修订问题吗?:41Since你没有提到你的帖子。
如我上一篇文章所述,看门狗命中循环延迟模块(参见Fri,2018-05-18 02:41)如果我不使用长延迟,如何长时间重复运行计时器,说,1小时或更长时间?根据我的理解,只有在延迟期间,定时器处理程序事件将反复开火。

PM_DIALOG.
离线
最后一次露面:2天9小时前
职员
加入:2018-02-08 11:03
嗨敏感,

嗨敏感,

我不知道如果我得到看门狗问题,或者什么情况是,你正在尝试做的,但我想,对于你正在经历的原因是因为你有定时器运行在看门狗到期时间和你保持设备活性。我想,发生的问题,因为你不经过主循环的结束,因此你不更新看门狗定时器,在SDK的main_func()函数有一个while循环,将不断更新看门狗wdg_reload(WATCHDOG_DEFAULT_PERIOD);如果你不经历,为了刷新该值,则会发生看门狗和NMI()发出中断。你将要做的是保持其到期之前更新看门狗的价值。

谢谢,PM_DIALOG.