DA14681中看门狗的时间周期

22个员额/ 0个新员额
最后一篇
jamesleo-konka
离线
最后一次露面:4年4个月前
加入:2017-01-22 02:42
DA14681中看门狗的时间周期

嗨,对话框中,
我在DA14681的SDK中没有找到设置watch dog period的参数。
如未获通知,看门狗只将届满多久?
有一项任务是通过UART与外围设备通信长时间(发送数据并等待某些数据回来)。

谢谢

关键词:
设备:
mt_dialog.
离线
最后一次露面:6个月2个星期前
职员
加入:2015-06-08 34
嗨jamesleo-konka,

嗨jamesleo-konka,

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

谢谢mt_dialog.

jamesleo-konka
离线
最后一次露面:4年4个月前
加入:2017-01-22 02:42
嗨,对话框中,

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

如果(uart1dev) {
http_len = HTTP_PostPkt (uart1_buf API_KEY DEV_ID,“温度”,“24.5”);//这个函数用特定的参数(*char)填充uart1_buf,缓冲区长度=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_BUS(UART1,Serial1,HW_UART_BAUDRATE_115200,HW_UART_DATABITS_8,HW_UART_PARITY_NONE,
hw_uart_stopbits_1,0,0,hw_dma_channel_1,hw_dma_channel_0,0,0)

UART_BUS(UART2,Serial2,HW_UART_BAUDRATE_115200,HW_UART_DATABITS_8,HW_UART_PARITY_NONE,
hw_uart_stopbits_1,0,1, hw_dma_channel_3, hw_dma_channel_2, 0,0)

#endif /* dg_configUART_ADAPTER */
//--------------------------------------------

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

// ---------------------------
/ / P10 = TX1好= RX1
hw_gpio_configure_pin (HW_GPIO_PORT_1 HW_GPIO_PIN_4 HW_GPIO_MODE_OUTPUT,
HW_GPIO_FUNC_GPIO, 1);

hw_gpio_set_pin_function (HW_GPIO_PORT_1 HW_GPIO_PIN_0 HW_GPIO_MODE_OUTPUT,
hw_gpio_func_uart_tx);
hw_gpio_set_pin_function (HW_GPIO_PORT_1 HW_GPIO_PIN_4 HW_GPIO_MODE_OUTPUT,
HW_GPIO_FUNC_UART_RX);

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

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

谢谢

jamesleo-konka
离线
最后一次露面:4年4个月前
加入:2017-01-22 02:42
嗨,对话框中,

嗨,对话框中,
你在那里么?
我需要一个使用UART1/UART2同时的样本代码。
hrp_sensor使用UART2作为printf(),我尝试使用UART1(UART)输出字符串,但失败了。

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

谢谢

mt_dialog.
离线
最后一次露面:6个月2个星期前
职员
加入:2015-06-08 34
嗨jamesleo-konka,

嗨jamesleo-konka,

我看不出配置有什么问题

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

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

hw_gpio_set_pin_function(HW_GPIO_PORT_1, HW_GPIO_PIN_2, HW_GPIO_MODE_OUTPUT, HW_GPIO_FUNC_UART_TX);
hw_gpio_set_pin_function(HW_GPIO_PORT_1, HW_GPIO_PIN_7, HW_GPIO_MODE_OUTPUT, HW_GPIO_FUNC_UART_RX);

#define config_retarget.
#define config_retarget_uart hw_uart2.

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

OS_TIMER_CREATE("prt", OS_MS_2_TICKS(1000), OS_TIMER_SUCCESS, (void *) OS_GET_CURRENT_TASK(), print_timer_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的代码如下所示

空白custom_printing_via_uart(空白)
{
UART_DEVICE DEV;
Static char wbuf[150] = "测试虚拟数据";
dev = ad_uart_open (SERIAL1);
ad_uart_write (dev, wbuf sizeof (wbuf));
ad_uart_close (dev);
}

注意:我在custom_config_qpi .h文件中定义了dg_configUART_ADAPTER并使用了默认的platform_devices.h文件(默认情况下,两个UART都是在不同的DMA通道中使用DMA配置的)。

使用FTDI芯片来输出第二个uart (SERIAL1)模块,它工作得很好。

你可以检查系统停滞时通过将调试器附加卡,按下暂停按钮,敝中断或Hardfault将存储个人电脑的异常发生,这样您就可以追溯到源代码,如果系统由于敝中断或停滞不前Hardfault处理程序。

谢谢mt_dialog.

jamesleo-konka
离线
最后一次露面:4年4个月前
加入:2017-01-22 02:42
嗨,MT_Dialog,

嗨,MT_Dialog,
我使用printf() @ UART2工作正常(通过调试芯片输出)。'printf()'使用P13,P23作为UART2输出/输入引脚如下:
// ------------------------------
/ /——TX2 = P13 RX2 = P23
hw_gpio_configure_pin (HW_GPIO_PORT_2 HW_GPIO_PIN_3 HW_GPIO_MODE_OUTPUT,
HW_GPIO_FUNC_GPIO, 1);

hw_gpio_set_pin_function (HW_GPIO_PORT_1 HW_GPIO_PIN_3 HW_GPIO_MODE_OUTPUT,
hw_gpio_func_uart2_tx);
hw_gpio_set_pin_function(hw_gpio_port_2,hw_gpio_pin_3,hw_gpio_mode_output,
HW_GPIO_FUNC_UART2_RX);
// -------------------------------
我已经测试了UART2,您可以使用ad_uart_write()来输出字符串,就像printf()一样。
DMA通道也在我的platform_device.h中定义:
// -------------------------------
#如果dg_configUART_ADAPTER

UART_BUS(UART1,Serial1,HW_UART_BAUDRATE_115200,HW_UART_DATABITS_8,HW_UART_PARITY_NONE,
hw_uart_stopbits_1,0,0,hw_dma_channel_1,hw_dma_channel_0,0,0)

UART_BUS(UART2,Serial2,HW_UART_BAUDRATE_115200,HW_UART_DATABITS_8,HW_UART_PARITY_NONE,
hw_uart_stopbits_1,0,1, hw_dma_channel_3, hw_dma_channel_2, 0,0)

#endif /* dg_configUART_ADAPTER */
// ------------------------------

但是我在启用UART1的同时,尝试与其他外围设备通信。我的UART1是通过使用HRS_TIMER_NOTIF每1秒触发一次的。
每次何时默认AD_UART_WRITE()函数时,将发生重置。
我的UART1的缓冲区是1024字节,这是好吗?(我找不到缓冲区的限制)

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

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

谢谢

mt_dialog.
离线
最后一次露面:6个月2个星期前
职员
加入:2015-06-08 34
嗨jamesleo-konka,

嗨jamesleo-konka,

没有使用这两种UARTs的具体示例,尽管正如我上面指出的那样,这不是很难实现的事情,但您可以尝试实现上面的说明,以检查它是否对您有效。对于冲突的两个UARTS和I2C,您也必须检查这一点,您可以删除I2C交互并检查是否发生了该问题,以限制可能的原因。你需要检查什么当系统变得反应迟钝,当没有什么系统的输出(附加调试器当系统摊位并检查系统卡住了),你提到会重置你看到通过UART引导装载程序执行吗?

谢谢mt_dialog.

jamesleo-konka
离线
最后一次露面:4年4个月前
加入:2017-01-22 02:42
嗨,MT_Dialog,

嗨,MT_Dialog,
是的,我认为这是一个“简单”的问题,但它阻碍了我超过2周。
坏消息是我不能调试我的代码,因为我的SmartSnippets工作错误——在调试子菜单中没有attach /QSPI选项。

谢谢

mt_dialog.
离线
最后一次露面:6个月2个星期前
职员
加入:2015-06-08 34
嗨jamesleo-konka,

嗨jamesleo-konka,

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

谢谢mt_dialog.

jamesleo-konka
离线
最后一次露面:4年4个月前
加入:2017-01-22 02:42
嗨,MT_Dialog,

嗨,MT_Dialog,
我开始调试,程序在这里停止:(hw_uart.c)
//--------------------------------------
空白UART_Interrupt_Handler (HW_UART_ID uart)
{
HW_UART_INT int_id;

(,) {
int_id = hw_uart_get_interrupt_id (uart);
切换(INT_ID){
案例HW_UART_INT_TIMEOUT:
hw_uart_rxtimeout_isr(UART);
休息;
案例HW_UART_INT_MODEM_STAT:
休息;
案例HW_UART_INT_NO_INT_PEND:
返回;
休息;
案例HW_UART_INT_THR_EMPTY:
hw_uart_tx_isr(UART);
休息;
案例HW_UART_INT_RECEIVED_AVAILABLE:
hw_uart_rx_isr(UART);
休息;
案例HW_UART_INT_RECEIVE_LINE_STAT:
休息;
案例HW_UART_INT_BUSY_DETECTED:
#ifdef config_uart_ignore_busy_detect.
hw_uart_transmit_fifo_empty (uart);
其他#
/*
*停止这里意味着访问除数锁存的计时规则没有
*。请参见寄存器RBR_THR_DLL说明。
*/
__BKPT (0);< <——! !----stopped at here
# endif
休息;
}
}
}
// -------------------------------------------------------

为什么会发生这种情况?

mt_dialog.
离线
最后一次露面:6个月2个星期前
职员
加入:2015-06-08 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_DEVICE DEV;
dev = ad_uart_open(serial2);
ad_uart_write (dev ptr, len);
ad_uart_close (dev);
返回len;

谢谢mt_dialog.

jamesleo-konka
离线
最后一次露面: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_printing_via_uart(void)',错误是相同的。

最后,我找到了冲突的代码:(自定义)
// ----------------------------------
//——通过UART1发送命令,然后等待反馈-----------
SendCmd(char* cmd, char* result, int timeOut)输出
{
无符号字符try_count = 5;
而(try_count)
{
USART1_Clear ();//清除usart1_rcv_buf的内存
ad_uart_write (cmd, uart1dev strlen (cmd));
ad_uart_read (uart1dev usart1_rcv_buf MAX_RCV_LEN,超时);//不知道长度
if((NULL != strstr((const char *)usart1_rcv_buf, result))) //比较接收到的结果
{
返回真;// 1 =成功;休息;
}
其他{
mDelay (100);/ /死循环?
try_count——;
}
}

返回错误;/ / 0 =失败
}
//---------------------------------------------------
它在system_init()中被这样调用:
//---------------------------------------
uart1dev = ad_uart_open (SERIAL1);

if(SendCmd(AT,"OK",100)){//——发送命令并等待反馈,它是'OK' ?
printf("ESP8266 is at here"换行符);
}
其他的
printf (" ESP8266不存在“换行符);

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

此时,系统看起来OK,它发布了对消息,可以连接了。
但是当hrp notify开始时,ad_uart_write()或custom_printing_via_uart(void)将被执行,然后系统将得到RESET。

SendCmd函数有什么问题吗?

谢谢

mt_dialog.
离线
最后一次露面:6个月2个星期前
职员
加入:2015-06-08 34
嗨jamesleo_konka,

嗨jamesleo_konka,

我不认为通过在Printf函数中使用适配器将导致COM端口丢失,如果您遇到类似的东西,其他内容就是该问题的原因。我提到的原因(_write()函数中的适配器)是验证您是否不使用一个UART模块,并且您正在通过UART适配器(您的应用程序)和直接使用低级驱动程序访问该模块(来自PrintF()),因为这是我可以考虑您在上一篇文章中获得的UART中断的唯一可能性。由于您确信您正在使用PrintF()的Seperate UART模块,并且从您的应用程序中打印UART这不是这种情况。

我不明白的是,你粘贴的函数是导致你在之前的帖子中提到的问题(不是RESET,而是断点和你的代码暂停)?事实上,当你发送通知时,你提到了代码会得到一个RESET(你的意思是代码会像你之前的帖子一样在断点中停滞?)

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

UART_DEVICE DEV;
静态字符usart1_snd_buf[4] ={‘O’,‘K’,' \ n ', ' \ r '};
静态字符usart1_rcv_buf [6];
静态char cmd [6] =“开始\ r”;
dev = ad_uart_open (SERIAL1);
无符号字符try_count = 5;

而(try_count)
{
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_FOREVER);

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

try_count——;
}
ad_uart_close (dev);

pm_set_sleep_mode(pm_mode_extended_sleep);

谢谢mt_dialog.

jamesleo-konka
离线
最后一次露面:4年4个月前
加入:2017-01-22 02:42
嗨,MT_Dialog,

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

请您尝试大尺寸的UART接收缓冲区?我发现我的1024字节缓冲区将杀死系统。
缓冲区应该是'静态'类型?

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

BTW,如何检查堆栈大小?构建结果显示比真实的RAM大小(recv +发送缓冲区= 2048)。

谢谢

mt_dialog.
离线
最后一次露面:6个月2个星期前
职员
加入:2015-06-08 34
嗨jamesleo-konka,

嗨jamesleo-konka,

我我的接收缓冲区增加到1024,但没有发生问题,我使用了静态的原因是为了不改变默认的堆栈大小我的任务,您可以使用局部变量,只要你保持所需的堆栈大小足够大,以适应大小从你的函数。关于你还剩下多少堆栈,Free RTOS有一些工具,比如uxTaskGetStackHighWaterMark(),还有像System View或Ozone这样的工具,让你可以选择监控你创建的每个任务的堆栈。关于您在UART中断处理程序中得到的错误,我相信这是由ad_uart_read()函数引起的,我可以复制您所看到的,只有当在UART上打印时,我在终端上键入一些东西,这将导致您得到的中断。你可以通过定义CONFIG_UART_IGNORE_BUSY_DETECT来避免这个问题,但是当你得到那个中断时,它将闪烁TX fifo。你能检查一下这对你是否有效吗?

谢谢mt_dialog.

jamesleo-konka
离线
最后一次露面:4年4个月前
加入:2017-01-22 02:42
嗨,对话框中,

嗨,对话框中,
今天是幸运的一天!
defining config_uart_ignore_busy_detect后,系统工作正常!
我也通过使用uxtaskgetstackhighwatermark()来测试堆栈,它是可以的,大约568〜1568〜1432〜。
但我不知道为什么/如何忙着冲突。如何调试它?

非常感谢

mt_dialog.
离线
最后一次露面:6个月2个星期前
职员
加入:2015-06-08 34
嗨jamesleo-konka,

嗨jamesleo-konka,

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

谢谢mt_dialog.

jamesleo-konka
离线
最后一次露面:4年4个月前
加入:2017-01-22 02:42
嗨,mt_dialog,

嗨,mt_dialog,
新问题出现了。
我在UART1上输出许多文本段,并在UART2上监视(printf())。
AT命令,比如“AT?””、“在+ SETMODE ';…一些用于初始化,一些用于操作。
一开始,沟通还可以。当我输出用于操作的长文本时,在命令文本的开头时会添加CharAttor(0x08),如下所示:
//-----------------------------------
POST /设备/ 3508300 /点吗?类型= 5 HTTP / 1.1
api密匙:2 h3d3ywz = nKaL57TB7gXKjV = bhI =
主持人:api.heclouds.com
内容长度:19

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

谢谢

mt_dialog.
离线
最后一次露面:6个月2个星期前
职员
加入:2015-06-08 34
嗨jamesleo-konka,

嗨jamesleo-konka,

是的,如果使用#define,显然会有这个副作用。关于您的问题,请检查在打印时是否向设备发送数据,因为复制您的问题的唯一方法是在UART打印时从终端向UART发送数据。请检查如果这是发生的,你得到指定的中断。还试着取消定义CONFIG_UART_IGNORE_BUSY_DETECT,并试着不要调用ad_uart_close()为您与UART的每次交互,只打开接口执行写和读,当您停止打印时不要调用关闭接口,如果这样做可以防止中断HW_UART_INT_BUSY_DETECTED被触发,请尝试。

谢谢mt_dialog.

jamesleo-konka
离线
最后一次露面:4年4个月前
加入:2017-01-22 02:42
嗨,MT_dialog,

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

jamesleo-konka
离线
最后一次露面:4年4个月前
加入:2017-01-22 02:42
嗨,mt_dialog,

嗨,mt_dialog,
禁用'ad_uart_close'方法效果较好,但不能完全处理UART1数据冲突。
系统正常工作一段时间(半个月,约15次,发送),然后数据受到干扰。

mt_dialog.
离线
最后一次露面:6个月2个星期前
职员
加入:2015-06-08 34
嗨jamesleo-konka,

嗨jamesleo-konka,

我在这个问题上放了一个内部票证,我会尽快报告你的SDK团队的复制问题。如果您不使用Printf Funcessity(第二个UART打印),我还想要求您进行测试。所以你可以通过删除打印f来测试调试目的是否消除了繁忙的中断,从而实现了0x08?

谢谢mt_dialog.