跳过主要内容

App_easy_timer不在user_app_on_init上工作

DA14530和DA14531

3个月前

App_easy_timer不在user_app_on_init上工作

发布的gustavo.laureano65点 5回复
0的问题

你好,

我遵循以下指南:

http://lpccs-docs.dialog-semiconductor.com/Tutorial_SDK6/adv_data.html

为了使广告数据动态,但由于某些原因,当从user_app_on_init调用时定时器不会启动,但当从其他地方调用时(如on_disconnect)会工作。

在app_on_init内部调用的函数(用断点检查),它没有落入“return EASY_TIMER_INVALID_TIMER”(也用断点检查)

知道为什么计时器不从init开始吗?

谢谢

致以最亲切的问候
Gustavo

接受答案!

3个月前

PM_Dialog

嗨,Gustavo,

谢谢你的问题。我建议在user_app_on_init()之后设置计时器。请尝试以下更改:

在user_config.h:

#定义USER_ADVERTISE_DATA " \ x12 \ x21 \ x11 \ x11 \ x11 \ x11 \ x11 \ x11 \ x11 \ x11 \ x11 \ x11 \ x11 \ x11 \ x11 \ x11 \ x11 \ x11 \ x00”

在user_callback_config.h:

.default_operation_adv = user_app_adv_start, .app_on_init = user_app_on_init,

在user_empty_peripheral_template.h:

空白user_app_adv_start(无效);空白user_app_on_init(无效);

在user_empty_peripheral_template.c:

uint8_t my_counter __SECTION_ZERO("retention_mem_area0");// @RETENTION MEMORY timer_hnd app_adv_data_update_timer_used __SECTION_ZERO("retention_mem_area0");Void update_adv_data() {my_counter++;//拷贝计数器值到广告数据(忽略扫描响应数据)uint8_t adv_data[USER_ADVERTISE_DATA_LEN];memcpy (&adv_data USER_ADVERTISE_DATA USER_ADVERTISE_DATA_LEN);//将计数器值加载到广告数据的最后一个字节adv_data[USER_ADVERTISE_DATA_LEN -1] = my_counter;//更新发布数据app_easy_gap_update_adv_data(adv_data, USER_ADVERTISE_DATA_LEN, NULL, NULL);//重启定时器app_adv_data_update_timer_used = app_easy_timer(100, update_adv_data);//一秒一次定时器}void user_app_adv_start(void) {app_adv_data_update_timer_used = app_easy_timer(100, update_adv_data);//一秒一次定时器app_easy_gap_undirected_advertise_start(); } void user_app_on_init() { my_counter = 0; // After we have initialized our variable, we call the default handler default_app_on_init(); }

谢谢,PM_Dialog

3个月前

gustavo.laureano 65点

嗨PM_Dialog

谢谢,当我从adv_start用户回调开始时,它工作,我所做的唯一改变是总是取消任何以前的计时器,否则它会生成多个计时器实例并行运行:

Void user_app_adv_start(Void) {app_easy_timer_cancel(app_adv_data_update_timer_used);app_adv_data_update_timer_used = app_easy_timer(APP_ADV_DATA_UPDATE_TO, adv_data_update_timer_cb);//一秒一次定时器app_easy_gap_undirected_advertise_start();}

但是你知道为什么定时器不能从app_init回调开始吗?
我搜索了文档,没有明确的原因为什么它不能工作。

还有一个(不相关的)问题:
我有问题使用UART RX中断当使用UART DA14531 ROM代码(# undef CFG_UART1_SDK),它从未调用注册回调,只能当我设置为使用SDK UART实现(# define CFG_UART1_SDK),但是我发现没有信息说明为什么ROM代码不工作,这是一个错误的ROM代码吗?或者在处理中断时,我总是需要使用编译的驱动程序?

谢谢!
Gustavo

3个月前

PM_Dialog

嗨gustavo.laureano,

能否分享一下你们这边使用的user_app_on_init()和UART函数?

谢谢,PM_Dialog

3个月前

gustavo.laureano 65点

以下是相关部分:

外围初始化在user_peripher_setup .c上

静态常量uart_cfg_t uart_cfg = {.baud_rate = UART_BAUDRATE_115200 .data_bits = UART_DATABITS_8 .parity = UART_PARITY_NONE .stop_bits = UART_STOPBITS_1 .auto_flow_control = UART_AFCE_DIS .use_fifo = UART_FIFO_DIS .tx_fifo_tr_lvl = UART_TX_FIFO_LEVEL_0 .rx_fifo_tr_lvl = UART_RX_FIFO_LEVEL_0 .intr_priority = 2,};void环线init(void){//在Boost模式下使DCDC转换器为使用的gpio提供VBAT_HIGH (syscntl_dcdc_turn_on_in_boost(SYSCNTL_DCDC_LEVEL_3V0);// ROM补丁patch_func;//初始化外围设备uart_initialize(UART1, &uart_cfg);GPIO_ConfigurePin(UARTx_TX_GPIO_PORT, UARTx_TX_GPIO_PIN, OUTPUT, PID_UART1_TX, false);GPIO_ConfigurePin(UARTx_RX_GPIO_PORT, UARTx_RX_GPIO_PIN, INPUT, PID_UART1_RX, false);//启用pads GPIO_set_pad_latch_en(true);}

我的user.c上的代码:

static void uart_read_cb(uint16_t length){//将接收到的字节推入ring-buffer ringbuffer_add(&ringbuffer_inst_rx, &rxbuf_cb);//开始下一个异步读1个字符。uart_receive(UART1, &rxbuf_cb, 1, UART_OP_INTR);} void user_app_on_init(void) {ringbuffer_init(&ringbuffer_inst_rx, ringbufer_buffer_rx, sizeof(uint8_t), 64);uart_register_rx_cb (UART1 uart_read_cb);uart_receive(UART1, &rxbuf_cb, 1, UART_OP_INTR);/*启动UART接收*/ default_app_on_init();}

发送数据(在阻塞模式下使用uart_send)总是可以工作,但是使用中断接收数据只有在我#define CFG_UART1_SDK时才能工作,否则uart_read_cb永远不会被调用

3个月前

PM_Dialog

嗨gustavo.laureano,

谢谢你的评论。为了使用uart_register_rx_cb(),应该定义CFG_UART1_SDK宏。ROM驱动程序是不同的,这就是你看到这种行为的原因。

谢谢,PM_Dialog