DA14681中看门狗的时间周期

22个员额/ 0个新员额
最后发表
jamesleo-konka
离线
最后看到:4年5个月前
加入:2017年1月22日02:42
DA14681中看门狗的时间周期

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

谢谢

关键词:
设备:
MT_dialog
离线
最后看到:6个月3周前
工作人员
加入:2015-06-08 34
嗨,康佳先生,

嗨,康佳先生,

这在UM-B-044-DA1468x软件平台参考文档中有记录,请查看第8.6段“看门狗服务”。关于第二个问题,我不确定我是否了解SDK有操作系统,除非得到指示,否则它不会暂停等待。

由于MT_dialog

jamesleo-konka
离线
最后看到:4年5个月前
加入:2017年1月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次其他任务后重置
}别的{
printf("UART1设备打开失败"换行);

ad_uart_close(uart1dev);

.........
//-------------------------------------------------
什么是的“printf的”和“ad_uart_write”有什么不同?
我对UART的定义如下:
//---------------------------------------------
#如果dg_配置_适配器

hw_uart_bus (uart1, serial1, hw_uart_baudrate_115200, hw_uart_databits_8, hw_uart_parity_none, hw_uart_bus, 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)

hw_uart_bus (uart2, serial2, hw_uart_baudrate_115200, hw_uart_databits_8, hw_uart_parity_none, hw_uart_bus, 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,P14=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年5个月前
加入:2017年1月22日02:42
嗨,对话框中,

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

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

谢谢

MT_dialog
离线
最后看到:6个月3周前
工作人员
加入:2015-06-08 34
嗨,康佳先生,

嗨,康佳先生,

我看不出配置有什么问题

关于打印问题,我使用hrp_传感器进行了以下测试,并且使用定义的看门狗运行时没有问题。

在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);

#定义CONFIG_RETARGET
#定义CONFIG_RETARGET_UART HW_UART2

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

print_timer = OS_TIMER_CREATE( “PRT”,OS_MS_2_TICKS(1000),OS_TIMER_SUCCESS,(无效*)OS_GET_CURRENT_TASK(),print_timer_cb);

操作系统定时器启动(打印定时器,10);

if(notif&ADV\u PRINT\u notif){
通过uart()自定义打印//从UART接口打印
的printf( “数据\ n \ r”);//从UART2接口打印

通过uart进行自定义打印的代码如下

空白custom_printing_via_uart(空白)

uart_device开发;
静态字符wbuf[150]=“测试虚拟数据”;
dev=ad_uart_open(SERIAL1);
ad_uart_write(DEV,WBUF,的sizeof(WBUF));
自动关闭(开发);

注:我已经在custom_config_qspi.h文件dg_configUART_ADAPTER定义和使用的默认platform_devices.h文件(默认两个UART使用在不同的DMA通道中的DMA被配置)。

为了使用FTDI芯片输出的第二个UART(SERIAL1)模块,它的工作就好了。

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

由于MT_dialog

jamesleo-konka
离线
最后看到:4年5个月前
加入:2017年1月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_配置_适配器

hw_uart_bus (uart1, serial1, hw_uart_baudrate_115200, hw_uart_databits_8, hw_uart_parity_none, hw_uart_bus, 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)

hw_uart_bus (uart2, serial2, hw_uart_baudrate_115200, hw_uart_databits_8, hw_uart_parity_none, hw_uart_bus, 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每1秒使用HRS\u定时器\u NOTIF触发一次。
每次当我执行ad_uart_write()函数时,都会发生RESET。
我的UART1的缓冲区是1024字节,这样可以吗?(我找不到缓冲区的限制)

顺便说一句,我也使用I2C,而且效果很好。它们冲突吗?
我的I2C每0.5秒触发一次。输出2组数据后(1秒),UART1星,然后系统复位。

有没有办法使用UART1 / UART2在同一时间一个示例代码?

谢谢

MT_dialog
离线
最后看到:6个月3周前
工作人员
加入:2015-06-08 34
嗨,康佳先生,

嗨,康佳先生,

还有的是,同时使用的UART,虽然它不是,这是很难才达到我VE如上所示,你可以尝试推行以上面的说明,检查是否适合你没有具体的例子。关于冲突的两个UART和I2C的,那是后话,你必须检查为好,可以去掉I2C互动,如果为了跌停的原因可能会出现这个问题进行检查。你必须检查到底发生了什么,当系统变得反应迟钝,当没有输出,(附加调试摊位制时,检查在系统粘连)系统做什么,你提到它得到RESET你看引导加载程序通过UART执行?

由于MT_dialog

jamesleo-konka
离线
最后看到:4年5个月前
加入:2017年1月22日02:42
嗨,MT_Dialog,

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

谢谢

MT_dialog
离线
最后看到:6个月3周前
工作人员
加入:2015-06-08 34
嗨,康佳先生,

嗨,康佳先生,

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

由于MT_dialog

jamesleo-konka
离线
最后看到:4年5个月前
加入:2017年1月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_rx_timeout_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_已接收\u可用:
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\U THR\U DLL的说明。
* /
__BKPT(0);<< --- !!!! ----停在这里
# endif
打破;



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

为什么会发生这种情况?

MT_dialog
离线
最后看到:6个月3周前
工作人员
加入:2015-06-08 34
嗨,康佳先生,

嗨,康佳先生,

您是否有可能在printf和项目的自定义打印中仅使用一个UART?UART2在默认引脚P13和P23上定义,因此在配置其他UART的引脚上?当UART忙时,FIFO满,并且您指示外围设备执行新操作时,会触发您得到的中断我已经测试了上面粘贴的代码,每个间隔都有大量的数据要打印,所以你能检查一下上面的代码是否会出现同样的错误吗?还有一些东西需要尝试,当你使用重定目标操作时,printf实现不使用适配器,而是使用LLD,所以你能检查一下是否替换了I吗在第190行中config.c文件的_write()函数中,hw_uart_send(config_RETARGET_uart,ptr,len,NULL,NULL);例如,使用适配器write:

uart_device开发;
dev = ad_uart_open (SERIAL2);
ad_uart_write(dev、ptr、len);
自动关闭(开发);
返回兰;

由于MT_dialog

jamesleo-konka
离线
最后看到:4年5个月前
加入:2017年1月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)',错误是相同的。

最后,我发现comflicted代码:(自定义)
//-------------------------------------
//---通过UART1发送命令,然后等待反馈-----------
布尔SendCmd(字符* CMD,字符*结果,INT超时)

无符号字符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))) //比较接收到的结果

返回true;/ / 1 =成功;打破;

其他{
mDelay (100);/ /死循环?
try_count——;

返回false;// 0 =失败

//---------------------------------------------------
这就是所谓的system_init()是这样的:
//---------------------------------------
uart1dev=ad_uart_open(SERIAL1);

如果(SendCmd(AT, “OK”,100)){// ---反馈发送命令和等待,是 'OK'?
printf(“ESP8266在这里”新行);

别的
printf (" ESP8266不存在“换行符);

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

此时,系统看起来OK,它发布了对消息,可以连接了。
但是,当HRP通知开始时,ad_uart_write()或你的“custom_printing_via_uart(无效)”将被excuted,然后系统会马上重新设置。

SendCmd函数中是否存在任何问题?

谢谢

MT_dialog
离线
最后看到:6个月3周前
工作人员
加入:2015-06-08 34
嗨jamesleo_konka,

嗨jamesleo_konka,

我不认为在printf函数中使用适配器会导致COM端口丢失,如果你正在经历类似的事情,其他事情是导致这个问题的原因。我提到这个的原因(_write()函数中的适配器)是为了验证您没有使用一个UART模块,并且您是通过UART适配器(您的应用程序)和直接使用低级驱动程序(从printf())访问该模块,因为这是我能想到的唯一可能的UART中断,你在之前的职位。由于您确定您正在为printf()和从应用程序打印UART使用单独的UART模块,因此情况并非如此。

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

据我所知,您希望获得某种外部命令以便执行某些操作,事实上,您已将其放置在system_init()中。请注意,system_init()将只运行一次,之后它将不会再次运行,这意味着ad_uart_read()函数将一直阻塞,直到超时时间过去或获取所需的数据为止。据我所知,在开始播发之前,您需要等待用户输入数据,我无法在您使用的函数中看到可能导致问题的内容,我已在system_init()中尝试了以下类似代码功能检查问题,即使启用了hrp SESSOR的通知,也没有发现任何奇怪的情况。

uart_device开发;
静态字符usart1_snd_buf[4]={'O','K','\n','\r'};
静态字符使用1_rcv_buf[6];
Static char cmd[6] = "开始\r";
dev=ad_uart_open(SERIAL1);
无符号字符try_count = 5;

而(try_count)

memset (0 x00 usart1_rcv_buf, 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——;

自动关闭(开发);

pm_set_sleep_mode (pm_mode_extended_sleep);

由于MT_dialog

jamesleo-konka
离线
最后看到:4年5个月前
加入:2017年1月22日02:42
嗨,MT_Dialog,

嗨,MT_Dialog,
我怕的很长一段时间等待UART通信,所以设置从UART读取时的超时。(一般为100ms〜1000毫秒,而不是OS_EVENT_FOREVER)
函数SendCmd()用于初始化和执行任务,需要防止看门狗超时。
当我在system_init中调用SendCmd()时,它工作正常。(也许这会设下圈套)。错误发生在hrp_sensor_任务中——调用ad_uart_write()时。
我不知道SendCmd()如何影响下面的ad_uart_write()?

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

静态字符使用1_rcv_buf[6];// - >为1024个字节

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

谢谢

MT_dialog
离线
最后看到:6个月3周前
工作人员
加入:2015-06-08 34
嗨,康佳先生,

嗨,康佳先生,

我已经我的接收缓存增加至1024,但没有问题发生,我用的是静态的原因是为了不改变我的任务中的缺省堆栈大小,你不停的堆栈大小足够大,以适应您可以使用局部变量,只要从功能所需的大小。关于你还剩多少栈,免费RTOS有一些工具,这就像uxTaskGetStackHighWaterMark()和也喜欢系统查看或臭氧给你监视你创建的每个任务的堆栈选项工具。关于您在UART中断处理程序出现错误,我相信这是造成ad_uart_read()函数的东西,我可以复制你所看到的只有在UART i型终端上的东西打印时,将导致中断你得到。你可以避开这个问题通过定义CONFIG_UART_IGNORE_BUSY_DETECT但会闪烁TX FIFO当你得到该中断。您可以检查是否适合你?

由于MT_dialog

jamesleo-konka
离线
最后看到:4年5个月前
加入:2017年1月22日02:42
嗨,对话框中,

嗨,对话框中,
今天真幸运!
定义CONFIG_UART_IGNORE_BUSY_DETECT后,系统工作正常!
我还使用uxTaskGetStackHighWaterMark()测试了堆栈,它是OK的,大约568~1568~1432~。
但是我不知道为什么/如何发生UART BUSY冲突。如何调试它?

非常感谢

MT_dialog
离线
最后看到:6个月3周前
工作人员
加入:2015-06-08 34
嗨,康佳先生,

嗨,康佳先生,

正如我提到的VE,我只能复制问题时,而68X被打印我也是在UART发送字符,这样,可以检查而fw是打印的其他字符发送到UART?

由于MT_dialog

jamesleo-konka
离线
最后看到:4年5个月前
加入:2017年1月22日02:42
嗨,MT_Dialog,

嗨,MT_Dialog,
新问题出现了。
我在UART1上输出许多文本段,并在UART2上监视(printf())。
AT命令,比如“AT?””、“在+ SETMODE ';…一些用于初始化,一些用于操作。
一开始,沟通是可以的。当我输出长文本进行操作时,在命令文本的开头添加了一个字符(0x08),像这样:
// -----------------------------------
POST /装置/ 3508300 /数据点?类型= 5 HTTP / 1.1
API-键:2H3d3ywz = nKaL57TB7gXKjV = BHI =
主持人:api.heclouds.com
内容长度:19

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

谢谢

MT_dialog
离线
最后看到:6个月3周前
工作人员
加入:2015-06-08 34
嗨,康佳先生,

嗨,康佳先生,

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

由于MT_dialog

jamesleo-konka
离线
最后看到:4年5个月前
加入:2017年1月22日02:42
嗨,MT_dialog,

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

jamesleo-konka
离线
最后看到:4年5个月前
加入:2017年1月22日02:42
嗨,MT_Dialog,

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

MT_dialog
离线
最后看到:6个月3周前
工作人员
加入:2015-06-08 34
嗨,康佳先生,

嗨,康佳先生,

我已经放置了一个关于这个问题的内部票据,我将尽快报告,当我从SDK团队得到你复制的问题的答案。我还想请您测试一下,如果您不使用printf功能(第二次UART打印),是否会发生这种情况。因此,您能否测试一下,为了调试目的而删除printf是否消除了BUSY中断,从而消除了您得到的0x08 ?

由于MT_dialog