DA14681中的监视时间段

22帖子/ 0新
最后发表
jamesleo-konka
离线
最后看到:4年3个星期前
加入:2017-01-22 02:42
DA14681中的监视时间段

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

谢谢

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

嗨jamesleo-konka,

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

由于MT_dialog

jamesleo-konka
离线
最后看到:4年3个星期前
加入:2017-01-22 02:42
嗨对话框,

嗨对话框,
我查了UM-B-044的9.6段,默认看门狗的时间是2.6秒。
我无法确认看门狗和我的UART输出函数之间的关系,因为以下类似的代码:
//------------------------------------------
if(notef&hrs_timer_notif){//我在这里测试UART,每1次突破一次
uart1dev = ad_uart_open (SERIAL1);

如果(uart1dev) {
http_len = http_postpkt(uart1_buf,api_key,dev_id,“温度”,“24.5”);//此函数填充UART1_BUF,具有特定参数(* char),缓冲长度= 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_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年3个星期前
加入:2017-01-22 02:42
嗨对话框,

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

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

谢谢

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

嗨jamesleo-konka,

我没有看到任何错误的配置

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

在外围_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_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的代码如下所示

void custom_printing_via_uart(void)

uart_device开发;
Static char wbuf[150] = "测试虚拟数据";
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处理程序,系统已经停止了。

由于MT_dialog

jamesleo-konka
离线
最后看到:4年3个星期前
加入: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每1秒通过使用HRS_TIMER_NOTIF触发一次。
每次当我执行ad_uart_write()函数时,RESET将发生。
我的UART1的缓冲区是1024字节,这样可以吗?(我找不到缓冲区的限制)

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

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

谢谢

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

嗨jamesleo-konka,

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

由于MT_dialog

jamesleo-konka
离线
最后看到:4年3个星期前
加入:2017-01-22 02:42
嗨,mt_dialog,

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

谢谢

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

嗨jamesleo-konka,

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

由于MT_dialog

jamesleo-konka
离线
最后看到:4年3个星期前
加入:2017-01-22 02:42
嗨,mt_dialog,

嗨,mt_dialog,
我开始了我的调试,在这里开始proram stop :( 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_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);< <——! !----停在这里
#万一
打破;



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

为什么会发生这种情况?

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

嗨jamesleo-konka,

是否有可能在项目的打印tf和自定义打印中只使用一个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 = ad_uart_open (SERIAL2);
ad_uart_write (dev ptr, len);
ad_uart_close (dev);
返回兰;

由于MT_dialog

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

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_rc_buf,结果))//比较所接收的结果

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

别的 {
mdelay(100);//死循环?
try_count--;

返回错误;/ / 0 =失败

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

如果(SendCmd(AT,"OK",100)){//——发送命令并等待反馈,它是'OK' ?
printf(“ESP8266 is at here”NEWLINE);

其他的
printf(“esp8266不存在”换行符);

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

此时,系统看起来好像,它宣传了一封对消息并且可以连接。
但是,当启动hrp notify时,ad_uart_write()或'custom_printing_via_uart(void)'将被执行,然后系统获得RESET。

在函数SendCmd有任何问题吗?

谢谢

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

嗨jamesleo_konka,

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

我不明白的是你粘贴的函数是导致你在上一篇文章中提到的问题的函数(不重置但断点和你的代码摊位)?事实上,当您发送通知时,您提到代码获得重置(您的代码在前一篇文章中的断点中的代码丢失?)。

据我所知,您希望获得某种外部命令,以便做一些事情,事实是,您已经将它放在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];
Static char cmd[6] = "start\r";
dev = ad_uart_open (SERIAL1);
unsigned char 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--;

ad_uart_close (dev);

pm_set_sleep_mode (pm_mode_extended_sleep);

由于MT_dialog

jamesleo-konka
离线
最后看到:4年3个星期前
加入:2017-01-22 02:42
嗨,mt_dialog,

嗨,mt_dialog,
我害怕长时间等待UART通信,所以设置从UART读取时的超时。(通常100ms~1000ms,不是OS_EVENT_FOREVER)
函数SendCmd()在do初始化和任务时使用,这是必要的,以防止看门狗超时。
当我在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_dialog
离线
最后看到:2个月1周前
工作人员
加入:2015-06-08 11:34
嗨jamesleo-konka,

嗨jamesleo-konka,

我我的接收缓冲区增加到1024,但没有发生问题,我使用了静态的原因是为了不改变默认的堆栈大小我的任务,您可以使用局部变量,只要你保持所需的堆栈大小足够大,以适应大小从你的函数。关于你有多少堆栈,免费RTOS有一些工具,如uxTaskGetStackHighWaterMark(),也有工具,如系统视图或臭氧给你的选项,以监视你创建的每个任务的堆栈。关于你在UART中断处理程序中得到的错误,我相信这是由ad_uart_read()函数引起的东西,我可以复制你看到的只有当在UART上打印i类型的东西在终端上,这将导致你得到的中断。您可以通过定义CONFIG_UART_IGNORE_BUSY_DETECT来避免这个问题,但是当您得到那个中断时,它会闪光TX fifo。你能帮我检查一下吗?

由于MT_dialog

jamesleo-konka
离线
最后看到:4年3个星期前
加入:2017-01-22 02:42
嗨,对话框,

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

非常感谢

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

嗨jamesleo-konka,

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

由于MT_dialog

jamesleo-konka
离线
最后看到:4年3个星期前
加入: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
离线
最后看到:2个月1周前
工作人员
加入:2015-06-08 11:34
嗨jamesleo-konka,

嗨jamesleo-konka,

是的,显然#define如果使用,则具有这种副作用。关于您的问题,请检查您在打印时向设备发送数据,因为唯一的复制问题是在UART打印时从终端发送数据到UART。请检查是否会发生这种情况,您可以获得指定的中断。另外尝试以下undefine the config_uart_ignore_busy_detect并尝试为您使用UART拥有的每个交互调用AD_UART_CLOSE(),只需打开界面执行写入并读取并在停止打印时,不要调用接口的关闭,尝试防止中断HW_UART_INT_BUSY_DETCEDTED触发。

由于MT_dialog

jamesleo-konka
离线
最后看到:4年3个星期前
加入:2017-01-22 02:42
嗨,mt_dialog,

嗨,mt_dialog,
我会在宣传UART设备后尝试禁用“ad_uart_close”。

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

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

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

嗨jamesleo-konka,

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

由于MT_dialog