DA14681中看门狗的时间段

22个帖子/ 0个新
最后发表
jamesleo-konka
离线
最后看到:4年2个月前
加入:2017-01-22 02:42
DA14681中看门狗的时间段

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

谢谢

关键词:
设备:
MT_dialog
离线
最后看到:4个月2周前
工作人员
加入:2015-06-08 34
嗨jamesleo-konka,

嗨jamesleo-konka,

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

由于MT_dialog

jamesleo-konka
离线
最后看到:4年2个月前
加入: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_postkt (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设备打开失败"NEWLINE);

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)

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, 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年2个月前
加入:2017-01-22 02:42
嗨,对话框中,

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

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

谢谢

MT_dialog
离线
最后看到:4个月2周前
工作人员
加入:2015-06-08 34
嗨jamesleo-konka,

嗨jamesleo-konka,

我看不出配置有什么问题

关于打印问题,我使用hrp_sensor进行了以下测试,并在定义看门狗的情况下正常运行。

在外围init()函数中添加以下两行,以便为UART设置适当的引脚,并使用以下定义,以便为printf函数使用UART2:

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
#定义HW_UART2

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

print_timer = 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开发;
静态字符wbuf[150] = "test dummy data";
dev = ad_uart_open(SERIAL1);
Ad_uart_write (dev, wbuf, sizeof(wbuf));
ad_uart_close (dev);

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

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

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

由于MT_dialog

jamesleo-konka
离线
最后看到:4年2个月前
加入: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)

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,尝试与其他外围设备通信。使用HRS_TIMER_NOTIF每1秒触发一次UART1。
每次执行ad_uart_write()函数时,都会发生RESET。
我的UART1的缓冲区是1024字节,这是可以的吗?(我找不到缓冲区的限制)

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

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

谢谢

MT_dialog
离线
最后看到:4个月2周前
工作人员
加入:2015-06-08 34
嗨jamesleo-konka,

嗨jamesleo-konka,

没有使用这两个uart的具体示例,尽管如上所述实现起来并不困难,但您可以尝试实现上面的说明,以检查它是否适合您。关于冲突的两个UARTS和I2C,这也是您必须检查的事情,您可以删除I2C相互作用并检查该问题是否发生,以限制可能的原因。您必须检查当系统无响应时究竟发生了什么,当没有输出时系统会做什么,(当系统停止时附加调试器并检查系统卡住的位置),您提到它得到RESET,您看到引导加载程序通过UART执行吗?

由于MT_dialog

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

嗨,MT_Dialog,
是的,我认为这是一个“简单”的问题,但它让我困扰了两周多。
坏消息是我不能调试我的代码,因为我的SmartSnippets工作错误——在调试子菜单中没有附件/QSPI选项。

谢谢

MT_dialog
离线
最后看到:4个月2周前
工作人员
加入:2015-06-08 34
嗨jamesleo-konka,

嗨jamesleo-konka,

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

由于MT_dialog

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

嗨,MT_Dialog,
我开始我的调试,并暂停在这里:(hw_uart.c)
//--------------------------------------
void UART_Interrupt_Handler(HW_UART_ID)

HW_UART_INT int_id;

For (;;) {
Int_id = hw_uart_get_interrupt_id(uart);
Switch (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_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);< <——! !----停在这里
# endif
打破;



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

为什么会发生这种情况?

MT_dialog
离线
最后看到:4个月2周前
工作人员
加入:2015-06-08 34
嗨jamesleo-konka,

嗨jamesleo-konka,

是否有可能同时为项目的printf和自定义打印只使用一个UART ?UART2定义在默认引脚P13和P23上,那么另一个UART配置在什么引脚上?当UART繁忙时,FIFO已满,并且您指示外围设备进行新操作时,将触发您获得的中断。我已经测试了上面粘贴的代码,在每个间隔中都打印了大量的数据,所以你能检查一下上面的代码是否会出现同样的错误吗?还有一些事情要尝试,printf实现时,你正在使用重定向操作不使用适配器,但LLD,所以你可以检查如果你替换在config.c文件的_write()函数在190行,hw_uart_send(CONFIG_RETARGET_UART, ptr, len, NULL, NULL);使用适配器写例如:

uart_device开发;
dev = ad_uart_open(SERIAL2);
Ad_uart_write (dev, ptr, len);
ad_uart_close (dev);
返回兰;

由于MT_dialog

jamesleo-konka
离线
最后看到:4年2个月前
加入: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发送命令,然后等待反馈-----------
bool SendCmd(char* cmd, char* result, int timeOut)

Unsigned char try_count=5;
而(try_count)

USART1_Clear ();//清除usart1_rcv_buf的内存
Ad_uart_write (uart1dev, cmd, 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——;

返回错误;/ / 0 =失败

//---------------------------------------------------
它在system_init()中是这样调用的:
//---------------------------------------
uart1dev = ad_uart_open(SERIAL1);

if(SendCmd(AT,"OK",100)){//——发送命令并等待反馈,是'OK'吗?
printf("ESP8266在这里"NEWLINE);

其他的
printf("ESP8266不存在");

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

此时,系统显示OK,发布配对消息,可以连接了。
但是当hrp通知开始时,ad_uart_write()或您的'custom_printing_via_uart(void)'将被执行,然后系统得到RESET。

SendCmd函数有问题吗?

谢谢

MT_dialog
离线
最后看到:4个月2周前
工作人员
加入: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_sesnor的通知被启用时,也没有注意到任何奇怪的事情。

uart_device开发;
静态字符usart1_snd_buf[4] ={‘O’,‘K’,' \ n ', ' \ r '};
静态字符usart1_rcv_buf[6];
静态字符cmd[6] = "start\r";
dev = ad_uart_open(SERIAL1);
Unsigned char 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年2个月前
加入: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 + send buffer =2048)。

谢谢

MT_dialog
离线
最后看到:4个月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年2个月前
加入:2017-01-22 02:42
嗨,对话框中,

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

非常感谢

MT_dialog
离线
最后看到:4个月2周前
工作人员
加入:2015-06-08 34
嗨jamesleo-konka,

嗨jamesleo-konka,

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

由于MT_dialog

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

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

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

谢谢

MT_dialog
离线
最后看到:4个月2周前
工作人员
加入:2015-06-08 34
嗨jamesleo-konka,

嗨jamesleo-konka,

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

由于MT_dialog

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

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

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

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

MT_dialog
离线
最后看到:4个月2周前
工作人员
加入:2015-06-08 34
嗨jamesleo-konka,

嗨jamesleo-konka,

我已经就这个问题提出了内部意见,一旦我从SDK团队那里得到你的重复问题的答案,我就会报告。我还想请您测试一下,如果您不使用printf功能(第二个UART打印),是否会发生这种情况。那么,您能否测试一下,为了调试目的而删除printf是否消除了BUSY中断,从而消除了您得到的0x08 ?

由于MT_dialog