10个帖子/ 0个新帖子
最后发表
cxzs1234
离线
最后看到:3周3天前
加入:2017-06-23 07:28
关于systick_wait()的使用

我使用DA14580读取DS18B20的数据,在裸机的时候通过调用systick_wait()进行延时可以正常的读取温度数据,但是移植到祝福系统是就直接导致死机。这个函数在祝福系统时候不能用么?有其他延时函数替代么?

设备:
PW_Dialog
离线
最后看到:4天23小时前
工作人员
加入:2019-04-03 02:54
请具体描述一下你说的裸机系统和BLE系统,以及如何移植的。

请具体描述一下你说的裸机系统和BLE系统,以及如何移植的。

cxzs1234
离线
最后看到:3周3天前
加入:2017-06-23 07:28
裸机系统就是简单的读取温度数据

裸机系统就是简单的读取温度数据,通过串口将数据传输到电脑端方便观察数据,我单独写了一个DS18B20驱动文件,裸机是通过SDK5.0.4样例SDK 5.0.4 \ SDK 5.0.4 \ DA1458x_SDK \ 5.0.4 \ target_apps \ peripheral_examples \ \项目uart修改而成。主要修改mian.c中添加对DS18B20初始化引脚函数和在而循环中不断的调用获取温度函数。如代码

int主要(空白)

uint16_t阀= 0;
uint32_t temperatureValve = 0;;
int i = 0;
system_init ();
periph_init ();
如果(ds18b20_init () = = 1)
printf_string("\n\r*温度传感器不存在* n\r");
其他的
printf_string("\n\r*温度传感器是存在*\n\r");
uart_test ();
而(1)

我+ +;
if (LED_OFF_THRESHOLD == i)

GPIO_SetActive (LED_PORT LED_PIN);
printf_string("\n\r *LED ON* ");

if (LED_ON_THRESHOLD == i)

GPIO_SetInactive (LED_PORT LED_PIN);
阀= ds18b20_get_tem ();
printf_string("*\n\r *LED OFF* ");
printf_string(“\ n \ r *温度:”);
printf_num(阀);

如果(我= = 2 * LED_ON_THRESHOLD)

我= 0;

};

其他未做修改,可以整合长读取温度值。

驱动函数参考sdk通过的dht11.c设计的,dht11.c也是1线通信的。

CYibin
离线
最后看到:5个月3天前
工作人员
加入:2017-12-14 02:48
你好,

你好,

请描述下你在“祝福系统”中,对DHT11驱动接口的使用方式。

祝福系统运行在rw内核之上,是一个基于消息机制的内核;写应用程序时,需要注意不能有阻塞,否则会导致系统实时性变差,触发看门狗死机等问题。

cxzs1234
离线
最后看到:3周3天前
加入:2017-06-23 07:28
在app_htpt_task.c文件中的app_htpt

在app_htpt_task.c文件中的app_htpt_timer_handler函数中有一个获取温度值的语句app_htpt_env。temp_value = ds18b20_get_tem();调用这个函数后就死机了

但是仅仅让系统进行自加,是可以正常获得这个温度值的,app_htpt_env。temp_value + = 0 x01;

Static int app_htpt_timer_handler(ke_msg_id_t const msgid,
空白const *参数,
ke_task_id_t const dest_id,
ke_task_id_t const src_id)

if (ke_state_get(dest_id) == APP_CONNECTED) / /获取当前已连接状态

//随机生成一个温度值
uint32_t rand_temp_step;
//用于知道温度将增加或减少的符号
int8_t标志;

//生成温度步骤
rand_temp_step = 22;
//增加或减少温度值
符号= (int8_t)(rand_temp_step & 0x00000001);

如果(!)

标志= 1;

/ / app_htpt_env。temp_value + = * rand_temp_step迹象;
app_htpt_env。temp_value + = 0 x01;//为了调试方便
/ / app_htpt_env。temp_value = ds18b20_get_tem ();
//发送新的温度
app_htpt_temp_send ();


// Reset the Timer (Measurement Interval is not 0 if we are here)定时器以时间单位(TU is 10ms)编程
ke_timer_set (APP_HTPT_TIMER dest_id 200);

返回(KE_MSG_CONSUMED);

app_htpt_task.c文件和app_htpt.c是自己从SDK3中移植过来的文件,不知道为啥SDK5中没有。没有调用哪个函数而是用自加时可以在手机软件上观察到数据是正常的,应该移植比较成功。

我是个菜鸟,第一次使用这个芯片和这个系统,还有好多不懂的地方,请指正。

PW_Dialog
离线
最后看到:4天23小时前
工作人员
加入:2019-04-03 02:54
请描述如何移植到祝福系统的,基于某个祝福项目

请问systick_wait()的参数是多少吗?死机时ds18b20_get_tem()里代码停在哪里,有什么打印信息吗?

cxzs1234
离线
最后看到:3周3天前
加入:2017-06-23 07:28
app_htpt_task.c文件和app_htpt

app_htpt_task.c文件和app_htpt.c这两个文件时根据你们论坛上有一个关于移植的帖子,然后对比其他相似的app_xxx_task.c文件和app_xxx.c,理解后修改的,而且可以使用。systick_wait()参数最小的值是3,最大是300000年最后一个值是为了等待温度转换而等待250 ms。

CYibin
离线
最后看到:5个月3天前
工作人员
加入:2017-12-14 02:48
你好,

你好,

你的单线外设驱动可以裸机运行,功能正常;而在有祝福功能的系统中,该驱动会导致系统死机。

以上问题,基于之前的讨论,猜测死机原因和你系统中有比较大的阻塞有关。你应该想办法,把较大的阻塞(250毫秒)从你的外设驱动中去除。

kongxiangmin
离线
最后看到:1年2个月前
加入:2019-01-02 01:33
你好,

你好,

有没有关于去除阻塞的建议,原有的传感器驱动中是需要一定的延时的,这些延时会造成阻塞,请问有没有好的方法代替这种延时?

CYibin
离线
最后看到:5个月3天前
工作人员
加入:2017-12-14 02:48
你好,

你好,

参考以下方式:

/ /实现延迟1 s (i = 0;我< 20;我+ +){wdg_freeze ();rwip_schedule ();delay_50ms ();}

原理是在大延时的中间,喂狗并给予rw内核执行的机会。

这样做,需要注意防止形成递归调用。

建议实际应用中,还是尽量设计一个合理的状态机,通过app_easy_timer来驱动状态机,实现延时等方式。