DA14681中看门狗的时间周期

22个员额/0个新员额
最后一篇文章
康佳
离线
最后一次见到:4年4个月前
加入:2017-01-22 02:42
DA14681中看门狗的时间周期

嗨,对话,
我在DA14681的SDK中没有找到设置看门狗周期的参数。
如果不通知看门狗,看门狗将过期多长时间?
通过UART(发送数据并等待一些数据返回)与外围设备通信需要花费很长时间。

谢谢

关键词:
设备:
MT_对话框
离线
最后一次见到:6个月2个星期前
工作人员
加入:2015-06-08 11:34
嗨jamesleo-konka,

嗨jamesleo-konka,

这在UM-B-044-DA1468x软件平台参考文档中有记录,请检查8.6看门狗服务。关于第二个问题,我不确定我得到它的SDK有一个操作系统,它不会在等待什么,除非指示这样做。

谢谢你的对话

康佳
离线
最后一次见到:4年4个月前
加入:2017-01-22 02:42
嗨,对话,

嗨,对话,
我检查了UM-B-044的第9.6段,默认的看门狗周期是2.6秒。
我无法确认watchdog和我的UART输出函数之间的关系,因为以下代码类似:
//------------------------------------------
if(notif&HRS\u TIMER\u notif){//我在这里测试UART,每1秒触发一次
uart1dev = ad_uart_open (SERIAL1);

如果(uart1dev){
http_len=http_postkt(uart1_buf,API_键,开发ID,“温度”,“24.5”)//此函数使用特定参数(*char)填充uart1_buf,buffer长度=1024,我的测试字符串长度=150字节。
/ / printf (" % s "换行,uart1_buf);//<——这个printf函数工作正常
ad_uart_write (uart1dev uart1_buf http_len);/ / ! !<——这将导致操作其他任务2次后RESET
}否则{
printf(“UART1设备打开失败”换行符);
}
ad_uart_close(uart1dev);

.........
//-------------------------------------------------
“printf”和“ad_uart_write”有什么不同?
我对UART的定义如下:
//---------------------------------------------
#如果dg_configUART_ADAPTER

UART_总线(UART1,串行1,硬件UART_波特率115200,硬件UART_数据位8,硬件UART_奇偶校验无,
硬件UART_停止位_1,0,0,硬件DMA_信道_1,硬件DMA_信道_0,0)

UART_总线(UART2,串行2,硬件UART_波特率115200,硬件UART_数据位8,硬件UART_奇偶校验无,
硬件UART_停止位_1,0,1,硬件DMA_信道_3,硬件DMA_信道_2,0,0)

#endif/*dg_配置_适配器*/
//--------------------------------------------

注意:'printf'()'默认使用UART2,我使用UART(UART1)作为我的UART输出端口(硬件引脚P1.0和P1.4)

//-------------------------------
/ / P10 = TX1好= RX1
硬件gpio配置引脚(硬件gpio端口1、硬件gpio引脚4、硬件gpio模式输出、,
HW_GPIO_FUNC_GPIO,1);

硬件gpio设置引脚功能(硬件gpio端口1、硬件gpio引脚0、硬件gpio模式输出、,
硬件、GPIO、FUNC、UART和TX);
硬件gpio设置引脚功能(硬件gpio端口1、硬件gpio引脚4、硬件gpio模式输出、,
硬件(GPIO函数、UART函数和RX);

//---------------------------------

我错过了一些重要的事情吗?

谢谢

康佳
离线
最后一次见到:4年4个月前
加入:2017-01-22 02:42
嗨,对话,

嗨,对话,
你在那里么?
我需要一个同时使用UART1/UART2的示例代码。
hrp_传感器对printf()使用UART2,我尝试使用UART1(UART)输出字符串,但失败。

我不知道当我通过UART1(ad_uart_write)发送字符串时发生了什么,它使系统复位。
如何调试这个问题(RESET)?

谢谢

MT_对话框
离线
最后一次见到:6个月2个星期前
工作人员
加入:2015-06-08 11:34
嗨jamesleo-konka,

嗨jamesleo-konka,

我看不出配置有什么问题

关于打印问题,我用hrp_sensor做了下面的测试,用定义的看门狗运行没有问题。

在periph_init()函数中添加了以下两行,以便为UART设置正确的引脚,并使用了以下定义,以便将UART2用于printf功能:

硬件gpio设置引脚功能(硬件gpio端口1、硬件gpio引脚2、硬件gpio模式输出、硬件gpio功能UART发送);
硬件gpio设置引脚功能(硬件gpio端口1、硬件gpio引脚7、硬件gpio模式输出、硬件gpio功能UART接收);

#定义配置重定目标
#定义配置\重定目标\ UART硬件\ UART2

创建了一个计时器,每隔1秒运行一次,并通知hrp_sensor_task,以便从该任务中打印:

打印计时器=操作系统计时器创建(“prt”,操作系统计时器2个刻度(1000),操作系统计时器成功,(无效*)操作系统获取当前任务(),打印计时器cb);

OS_TIMER_START (print_timer 10);

if (notif & ADV_PRINT_NOTIF){
custom_printing_via_uart ();//从UART接口打印
printf(“数据\n\r”)//从UART2接口打印
}

custom_printing_via_uart的代码如下所示

通过uart进行自定义打印无效(无效)
{
uart_设备开发;
Static char wbuf[150] = "测试虚拟数据";
dev = ad_uart_open (SERIAL1);
ad_uart_write(dev、wbuf、sizeof(wbuf));
ad_uart_close (dev);
}

注意:我已经在自定义配置qspi.h文件中定义了dg\u configUART\u适配器,并使用了默认的platform\u devices.h文件(默认情况下,两个UART都是在不同的DMA通道中使用DMA配置的)。

使用FTDI芯片输出第二个uart(串行1)模块,工作正常。

您可以通过连接调试器来检查系统暂停的位置。当系统暂停并按下暂停按钮时,NMI或Hardfault会将PC存储在发生异常的位置,以便您可以追溯到源,如果系统由于NMI或Hardfault处理程序而暂停。

谢谢你的对话

康佳
离线
最后一次见到:4年4个月前
加入:2017-01-22 02:42
嗨,MT_Dialog,

嗨,MT_Dialog,
我使用printf() @ UART2工作正常(通过调试芯片输出)。'printf()'使用P13,P23作为UART2输出/输入引脚如下:
//---------------------------------
//------TX2=P13,RX2=P23
硬件gpio配置引脚(硬件gpio端口2、硬件gpio引脚3、硬件gpio模式输出、,
HW_GPIO_FUNC_GPIO,1);

硬件gpio设置引脚功能(硬件gpio端口1、硬件gpio引脚3、硬件gpio模式输出、,
HW_GPIO_FUNC_UART2_TX);
硬件gpio设置引脚功能(硬件gpio端口2、硬件gpio引脚3、硬件gpio模式输出、,
硬件、GPIO、功能、UART2、RX);
//----------------------------------
我已经测试了UART2,您可以使用ad_uart_write()来输出字符串,就像printf()一样。
此外,DMA信道在我的平台_设备中定义。h:
//----------------------------------
#如果dg_configUART_ADAPTER

UART_总线(UART1,串行1,硬件UART_波特率115200,硬件UART_数据位8,硬件UART_奇偶校验无,
硬件UART_停止位_1,0,0,硬件DMA_信道_1,硬件DMA_信道_0,0)

UART_总线(UART2,串行2,硬件UART_波特率115200,硬件UART_数据位8,硬件UART_奇偶校验无,
硬件UART_停止位_1,0,1,硬件DMA_信道_3,硬件DMA_信道_2,0,0)

#endif/*dg_配置_适配器*/
//---------------------------------

但是我在启用UART1的同时,尝试与其他外围设备通信。我的UART1是通过使用HRS_TIMER_NOTIF每1秒触发一次的。
每次执行ad_uart_write()函数时,都会发生重置。
我的UART1的缓冲区是1024字节,可以吗(我找不到缓冲区的限制)

顺便说一下,我也用I2C,它工作得很好。他们的冲突吗?
我的I2C每0.5秒触发一次。输出2组数据(1秒)后,UART1启动,然后系统复位。

是否有同时使用UART1/UART2的示例代码?

谢谢

MT_对话框
离线
最后一次见到:6个月2个星期前
工作人员
加入:2015-06-08 11:34
嗨jamesleo-konka,

嗨jamesleo-konka,

没有使用这两种UART的具体示例,尽管正如我上面所指出的,这并不是很难实现的,但是您可以尝试执行上面的说明,以检查这是否适用于您。关于冲突的两个UART和I2C,这也是您必须检查的问题,您可以删除I2C交互,并检查是否出现该问题,以限制可能的原因。您必须检查当系统无响应时会发生什么,当没有输出时系统会做什么,(当系统暂停时连接调试器并检查系统卡住的位置),您提到它会被重置您是否看到引导加载程序通过UART执行?

谢谢你的对话

康佳
离线
最后一次见到:4年4个月前
加入:2017-01-22 02:42
嗨,MT_Dialog,

嗨,MT_Dialog,
是的,我认为这是一个“简单”的问题,但它阻碍了我两个多星期。
坏消息是我无法调试我的代码,因为我的SmartSnippets工作错误——调试子菜单中没有ATTATCH/QSPI选项。

谢谢

MT_对话框
离线
最后一次见到:6个月2个星期前
工作人员
加入:2015-06-08 11:34
嗨jamesleo-konka,

嗨jamesleo-konka,

所以请检查你的其他帖子https://support.dialog-semiconductor.com/forums/post/dialog-smartbond-bl...对于这个问题。

谢谢你的对话

康佳
离线
最后一次见到:4年4个月前
加入:2017-01-22 02:42
嗨,MT_Dialog,

嗨,MT_Dialog,
我开始调试,程序在这里停止:(hw_uart.c)
//--------------------------------------
无效UART\U中断处理程序(硬件UART\U ID UART)
{
硬件UART INT id;

对于(;;){
int_id = hw_uart_get_interrupt_id (uart);
开关(int_id){
案例HW_UART_INT_超时:
硬件uart接收超时isr(uart);
打破;
机箱硬件UART内部调制解调器状态:
打破;
案例HW_UART_INT_NO_INT_PEND:
返回;
打破;
案例HW_UART_INT_THR_EMPTY:
硬件uart发送isr(uart);
打破;
案例HW_UART_INT_RECEIVED_AVAILABLE:
硬件uart接收isr(uart);
打破;
案例硬件UART内部接收线路统计:
打破;
检测到情况HW_UART_INT_BUSY_:
#ifdef CONFIG\u UART\u IGNORE\u BUSY\u DETECT
硬件uart发送fifo空(uart);
#否则
/*
*此处停止意味着访问除数闩锁的计时规则不正确
*。请参见寄存器RBR_THR_DLL说明。
*/
__BKPT(0);<<--!!!!--停在这里
#恩迪夫
打破;
}
}
}
//-------------------------------------------------

为什么会发生这种情况?

MT_对话框
离线
最后一次见到:6个月2个星期前
工作人员
加入:2015-06-08 11:34
嗨jamesleo-konka,

嗨jamesleo-konka,

是否有可能对项目的printf和定制打印都只使用一个UART ?UART2是在默认引脚P13和P23上定义的,那么另一个UART是在哪个引脚上配置的?当UART繁忙、FIFO满时触发中断,并指示外围设备处理新操作。我已经测试了我粘贴上面的代码与相当大的数据打印在每个间隔,所以你可以检查是否与上面的代码你得到相同的错误?也试试,printf实现当你使用gdp8 %操作多恩不使用适配器但LLD,所以你能检查如果你更换_write config.c文件的()函数在第190行,的hw_uart_send (CONFIG_RETARGET_UART ptr, len, NULL, NULL);使用适配器编写实例:

uart_设备开发;
dev=ad_uart_open(SERIAL2);
ad_uart_write (dev ptr, len);
ad_uart_close (dev);
回程透镜;

谢谢你的对话

康佳
离线
最后一次见到:4年4个月前
加入:2017-01-22 02:42
嗨,MT_Dialog,

嗨,MT_Dialog,
起初,我认为UART1是默认的printf()输出。因此,我编写了初始化GPIO和UART2的代码,然后使用ad_uart_write()输出数据。我发现它与printf()输出到同一个管道检查之后,我了解了printf()的用法UART2。但在UART2上同时使用printf()和ad_uart_write()是可以的。

我的新代码使用UART1作为我的私有UART,与UART2 (printf())分离,保持原来的设置:使用P13,P23作为UART2的引脚——它们连接到调试芯片,我一直使用它们来调试我的代码。

不允许使用方法代替config.c中的_write():这将导致COM端口丢失虽然它存在于设备管理器中,但无法打开。

我测试了你的函数“void custom\u printing\u via_uart(void)”,错误是一样的。

最后,我找到了冲突代码:(自定义)
//-------------------------------------
//——通过UART1发送命令,然后等待反馈-----------
bool SendCmd(char*cmd,char*result,int超时)
{
无符号字符try_计数=5;
while(尝试计数)
{
USART1_Clear()//清除usart1_rcv_buf的内存
ad_uart_write(uartdev、cmd、strlen(cmd));
ad_uart_read(uart1dev、usart1_rcv_buf、MAX_rcv_LEN、超时)//我不知道长度
如果((空!=strstr((const char*)usart1\u rcv\u buf,result))//比较收到的结果
{
返回true;//1=成功;打破
}
否则{
mDelay(100)//死循环?
试试看;
}
}

返回false//0=失败
}
//---------------------------------------------------
它在system_init()中调用如下:
//---------------------------------------
uart1dev = ad_uart_open (SERIAL1);

如果(SendCmd(AT,“OK”,100)){/--send命令并等待反馈,是否为“OK”?
printf("ESP8266 is at here"换行符);
}
其他的
printf(“ESP8266不存在”换行符);

ad_uart_close(uart1dev);
//---------------------------------

此时,系统看起来正常,它播发配对消息并可以连接。
但当hrp notify开始时,将执行ad_uart_write()或您的“通过_uart(void)自定义打印”,然后重置系统。

SendCmd函数有什么问题吗?

谢谢

MT_对话框
离线
最后一次见到:6个月2个星期前
工作人员
加入:2015-06-08 11:34
嗨,詹姆斯里奥·康卡,

嗨,詹姆斯里奥·康卡,

我不认为在printf函数中使用适配器会导致COM端口丢失,如果您遇到类似的情况,则是其他原因导致了该问题。我提到这一点的原因(函数_write()中的适配器)是为了验证您没有使用一个UART模块,并且您是通过UART适配器(您的应用程序)和直接使用低级驱动程序(来自printf())访问该模块,因为这是我所能想到的唯一可能的UART中断,你在上一篇文章中得到的。由于您确信printf()和从应用程序打印UART时使用的是单独的UART模块,因此情况并非如此。

我不明白的是,您粘贴的函数是导致您在上一篇文章中提到的问题的函数(不是重置,而是断点和代码暂停)?当您发送通知时,您提到代码会被重置(您的意思是代码会像您之前的帖子一样在断点处暂停?)。

就我所能理解的,你想要得到某种外部命令来做一些事情,事实上,你已经把它放在了system_init()要知道,system_init()将只运行一次,之后它不会再次运行,这意味着ad_uart_read()函数将阻塞,直到超时结束或获得它想要的数据。据我所知,你会等待用户输入数据之前,你开始广告,我不能看到一些东西,在功能,你正在使用,可能导致一个问题,为了检查问题,我在system_init()函数中尝试了以下类似的代码,即使启用了hrp_sesnor的通知,也没有注意到任何奇怪的地方。

uart_设备开发;
静态字符usart1_snd_buf[4] ={‘O’,‘K’,' \ n ', ' \ r '};
静态字符usart1_rcv_buf [6];
静态字符cmd[6]=“开始\r”;
dev = ad_uart_open (SERIAL1);
无符号字符try_计数=5;

while(尝试计数)
{
memset(usart1_rcv_buf,0x00,sizeof(usart1_rcv_buf));
ad_uart_-write(dev,usart1_-snd_-buf,strlen(usart1_-snd_-buf));
ad_uart_read(dev、usart1_rcv_buf、sizeof(usart1_rcv_buf)、OS_EVENT_);

如果(! memcmp (usart1_rcv_buf cmd 6))
{
printf(“成功\n\r”);
打破;
}
其他的
printf(“失败\n\r”);

试试看;
}
ad_uart_close (dev);

pm_设置_睡眠_模式(pm_模式_延长睡眠);

谢谢你的对话

康佳
离线
最后一次见到:4年4个月前
加入:2017-01-22 02:42
嗨,MT_Dialog,

嗨,MT_Dialog,
我担心UART通信等待时间太长,所以在从UART读取时设置一个超时。(通常为100ms~1000ms,而不是永远的OS_事件_)
函数SendCmd()用于初始化和任务时,有必要防止看门狗超时。
当我在system_init中调用SendCmd()时,它工作正常。(也许这是一个陷阱)。错误发生在hrp_sensor_task——当ad_uart_write()被调用时。
我不知道SendCmd()如何影响以下ad_uart_write()?

您能试试大尺寸的uart接收缓冲区吗?我发现我的1024字节缓冲区将杀死系统。
缓冲区应该是“静态”类型吗?

静态字符usart1_rcv_buf[6];/>到1024字节

顺便问一下,如何检查堆栈大小?构建结果显示的RAM大小比实际的更小(recv+send buffer=2048)。

谢谢

MT_对话框
离线
最后一次见到:6个月2个星期前
工作人员
加入:2015-06-08 11:34
嗨jamesleo-konka,

嗨jamesleo-konka,

我已将接收器缓冲区增加到1024,但没有出现任何问题,我使用static的原因是为了不更改任务的默认堆栈大小,您可以使用局部变量,只要您保持堆栈大小足够大,以适合函数所需的大小。关于剩余的堆栈数量,Free RTOS提供了一些工具,如uxTaskGetStackHighWaterMark(),以及系统视图或Ozone等工具,让您可以选择监视您创建的每个任务的堆栈。关于UART中断处理程序中出现的错误,我相信这是由ad_UART_read()函数引起的,只有在UART上打印时,我在终端上键入一些东西,这将导致您得到的中断,我才能复制您看到的内容。您可以通过定义CONFIG_UART_IGNORE_BUSY_DETECT来避免这个问题,但是当您得到中断时,它将闪烁TX fifo。你能检查一下这对你是否有效吗?

谢谢你的对话

康佳
离线
最后一次见到:4年4个月前
加入:2017-01-22 02:42
嗨,Dialog,

嗨,Dialog,
今天是幸运的一天!
定义配置\u UART\u忽略\u忙\u检测后,系统工作正常!
此外,我还使用uxTaskGetStackHighWaterMark()测试了堆栈,它还可以,大约568~1568~1432~。
但我不知道UART忙冲突发生的原因/方式。如何调试它?

谢谢

MT_对话框
离线
最后一次见到:6个月2个星期前
工作人员
加入:2015-06-08 11:34
嗨jamesleo-konka,

嗨jamesleo-konka,

正如我提到的,我只能在68x打印时复制这个问题,我也在UART中发送字符,所以你能检查在fw打印时是否有额外的字符发送到UART吗?

谢谢你的对话

康佳
离线
最后一次见到:4年4个月前
加入:2017-01-22 02:42
嗨,MT_Dialog,

嗨,MT_Dialog,
新问题出现了。
我在UART1上输出许多文本段,并在UART2(printf())上进行监视。
AT命令,如“AT?”,“AT+SETMODE”;。。。。。一些用于初始化,一些用于操作。
一开始,沟通还可以。当我输出用于操作的长文本时,在命令文本的开头添加一个字符(0x08),如下所示:
//-----------------------------------
POST/devices/3508300/datapoints?类型=5 HTTP/1.1
api键:2H3d3ywz=NKAL57TB7GXJV=bhI=
主持人:api.heclouds.com
内容长度:19

,;气温27.59度
//------------------------------------
同时使用printf()监视命令文本,如果printf()是正常的——这意味着缓冲区是正常的(没有字符0x08)。
我更改了命令文本,但奇怪的字符仍然是0x08。
这是怎么发生的?由于“配置\u UART\u忽略\u忙碌\u检测”?

谢谢

MT_对话框
离线
最后一次见到:6个月2个星期前
工作人员
加入:2015-06-08 11:34
嗨jamesleo-konka,

嗨jamesleo-konka,

是的,如果使用#define,显然会产生这种副作用。关于您的问题,请检查您是否在打印时向设备发送数据,因为复制您的问题的唯一方法是在UART打印时从终端向UART发送数据。请检查是否发生了这种情况,并且您得到了指定的中断。另外,请尝试以下取消定义CONFIG_UART_IGNORE_BUSY_DETECT并尝试不调用ad_UART_close()。对于与UART的每次交互,只需打开接口执行写入和读取,停止打印时不调用关闭接口,如果这样可以防止触发检测到的中断HW_UART_INT_BUSY_,请尝试。

谢谢你的对话

康佳
离线
最后一次见到:4年4个月前
加入:2017-01-22 02:42
嗨,MT_dialog,

嗨,MT_dialog,
打开uart设备后,我将尝试禁用“ad_uart_close”。

康佳
离线
最后一次见到:4年4个月前
加入:2017-01-22 02:42
嗨,MT_Dialog,

嗨,MT_Dialog,
禁用'ad_uart_close'方法效果较好,但不能完全处理UART1数据冲突。
系统正常工作一段时间(半分钟,大约是UART发送的15倍),然后数据被干扰。

MT_对话框
离线
最后一次见到:6个月2个星期前
工作人员
加入:2015-06-08 11:34
嗨jamesleo-konka,

嗨jamesleo-konka,

我已经就这个问题提交了一份内部通知单,我将在从SDK团队获得您的复制问题的答案后立即报告。我还想请您测试如果不使用printf功能(第二个UART打印),是否会发生这种情况。因此,为了调试目的删除printf是否可以消除繁忙中断,从而消除您得到的0x08?

谢谢你的对话