嗨,对话,我在DA14681的SDK中没有找到设置看门狗周期的参数。如果没有通知,观看狗的时间会过期多久?有(对某些数据回来发送数据,并等待),这费用由UART很长一段时间与外围设备communitation任务。
谢谢
嗨jamesleo-konka,
这将在UM-B-044-DA1468x软件平台参考文档中记录,请查看第8.6段看门狗服务。关于第二个问题,我不确定我得到它的SDK有一个操作系统,它不会在等待某些东西时停止,除非被指示这样做。
由于MT_dialog
嗨,对话,我查了UM-B-044的第9.6段,默认的看门狗周期为2.6秒。我无法确认watchdog和我的UART输出函数之间的关系,因为以下代码类似:// ------------------------------------------if(notif&HRS\u TIMER\u notif){//我在这里测试UART,每1秒触发一次UART1DEV = AD_UART_OPEN(SERIAL1);
if(uart1dev){http_len=http_postkt(uart1_buf,API_键,开发ID,“温度”,“24.5”)//此函数使用特定参数(*char)填充uart1_buf,buffer长度=1024,我的测试字符串长度=150字节。// printf(“%s”newline,uart1_buf);// < - 这个Printf Fuction工作正常AD_UART_WRITE(UART1DEV,UART1_BUF,HTTP_LEN);// !!!< - 这将导致操作后2次任务后重置}别的{printf(“UART1设备打开失败”换行符);}ad_uart_close(Uart1dev);
.........// -------------------------------------------------'printf'和'ad_uart_write'是什么不同的?我对UART定义是这样的:// ---------------------------------------------#if 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_配置_适配器*///--------------------------------------------
注:“printf的”()”使用UART2为默认,我用UART(UART1)作为我的UART输出端口。(硬件引脚P1.0和P1.4)
// -------------------------------// p10 = tx1,p14 = rx1硬件gpio配置引脚(硬件gpio端口1、硬件gpio引脚4、硬件gpio模式输出、,hw_gpio_func_gpio,1);
硬件gpio设置引脚功能(硬件gpio端口1、硬件gpio引脚0、硬件gpio模式输出、,HW_GPIO_FUNC_UART_TX);硬件gpio设置引脚功能(硬件gpio端口1、硬件gpio引脚4、硬件gpio模式输出、,hw_gpio_func_uart_rx);
// ---------------------------------
有我错过了一些重要的东西呢?
嗨,对话,你在吗?我需要一个同时使用UART1/UART2的示例代码。HRP_Sensor使用UART2 for printf(),我尝试使用UART1(UART)来输出字符串但失败。
我不知道通过UART1(AD_UART_WRITE)发送字符串时会发生什么,使系统重置。如何调试此问题(重置)?
我看不出配置有什么问题
关于打印问题,我使用HRP_Sensor进行了以下测试,并在没有定义的监视程序的情况下运行。
加入在periph_init()函数以下两个线,以便设置为UART适当的引脚,并且为了使用UART2用于printf的functionallity中使用的以下定义:
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(notf&avd_print_notif){custom_printing_via_uart();//从UART接口打印printf(“data \ n \ r”);//从UART2接口打印}
custom_printing_via_uart的代码是以下内容
通过uart进行自定义打印无效(无效){uart_device开发;静态char wbuf [150] =“测试虚拟数据”;dev = ad_uart_open(serial1);ad_uart_write(dev,wbuf,sizeof(wbuf));ad_uart_close(dev);}
注意:i VE在Custom_Config_Qspi.h中定义为DG_Configuart_Adapter并使用默认Platform_Devices.h文件(默认情况下,使用不同DMA通道中的DMA配置两个UART)。
使用FTDI芯片以输出第二UART(Serial1)模块,它运行得很好。
您可以通过连接调试器来检查系统暂停的位置。当系统暂停并按下暂停按钮时,NMI或Hardfault会将PC存储在发生异常的位置,以便您可以追溯到源,如果系统由于NMI或Hardfault处理程序而暂停。
嗨,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);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中定义:// ----------------------------------#if dg_configuart_adapter
#endif/*dg_配置_适配器*/// ---------------------------------
但是我同时enalbe Uart1,尝试与其他外围设备进行沟通。我的UART1通过使用HRS_TIMER_NOTIF每1秒触发每1秒钟。每次当我EXCUTE的ad_uart_write()函数时,RESET会发生。我UART1的缓冲区为1024个字节,这样行吗?(我无法找到缓冲的限制)
顺便说一句,我也使用I2C,它可以正常工作。他们冲突吗?我的I2C触发每0.5秒。后输出2组数据(1秒),UART1分,然后系统复位。
是否有一个示例代码同时使用UART1 / UART2?
没有使用两个UART的具体示例,尽管它不是难以在上面所示的那样难以实现的事情,但您可以尝试在上面的说明来检查是否适用于您。关于两个UART和I2C的冲突,这也是您必须检查的东西,您也可以删除I2C交互并检查此问题是否发生以限制可能的原因。您必须检查系统无反应时究竟发生什么,系统所做的是没有输出的,(在系统摊位并检查系统困扰时,安装调试器),您提到它会重置您是否看到通过UART执行的引导加载程序?
嗨,MT_Dialog,是的,我认为这是一个“简单”的问题,但它阻碍了我两个多星期。坏消息是我无法调试我的代码,因为我的smartsnippets工作错误 - 在调试子菜单中没有attatch / qspi选项。
所以请检查你的其他帖子https://support.dialog-semiconductor.com/forums/post/dialog-smartbond-bl...针对此问题。
嗨,MT_Dialog,我开始调试,程序在这里停止:(hw_uart.c)//--------------------------------------void UART_INTRUPT_HANDLER(HW_UART_ID UART){硬件UART INT id;
为了 (;;) {int_id = hw_uart_get_interrupt_id(UART);开关(int_id){案例HW_UART_INT_超时:hw_uart_rx_timeout_isr(UART);休息;机箱硬件UART内部调制解调器状态:休息;案例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);休息;案例硬件UART内部接收线路统计:休息;案例hw_uart_int_busy_detected:#ifdef来CONFIG_UART_IGNORE_BUSY_DETECThw_uart_transmit_fifo_empty(UART);#否则/**此处停止意味着访问除数闩锁的计时规则不正确*跟着。请参阅注册rbr_thr_dll的描述。* /__bkpt(0);<< --- !!!! ----在这里停下来#恩迪夫休息;}}}// -------------------------------------------------
为什么会发生这种情况?
有没有机会为Printf和项目的自定义打印使用一个UART?UART2在默认引脚,P13和P23上定义,因此在配置其他UART配置的引脚上?当UART忙时,您得到的中断被触发,FIFO已满,并且您将外围设备指示为新的操作。我测试了上面粘贴了上面的代码,在每个间隔中打印了相当大的数据,所以你可以检查上面的代码是否同样的错误?也尝试尝试的东西,打印机在使用retarget操作时不要使用适配器但lld,所以可以检查在190行的config.c文件的_write()函数中。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);返回len个;
嗨,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)”,错误是一样的。
最后,我找到了Comflict的代码:(自定义)// -------------------------------------// ---通过UART1发送命令,然后等待反馈----------BOOL SENDCMD(CHAR * CMD,CHAR *结果,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)//死循环?try_count--;}}
返回false;// 0 =失败}// ---------------------------------------------------它在system_init()中呼叫://---------------------------------------UART1DEV = AD_UART_OPEN(SERIAL1);
if(sendcmd(at,'OK“,100)){// ---发送命令并等待反馈,是'OK'?Printf(“esp8266在这里”换行符);}别的printf(“ESP8266不存在”换行符);
ad_uart_close(Uart1dev);// ---------------------------------
此时,系统看起来正常,它播发配对消息并可以连接。但是,当HRP通知开始时,AD_UART_WRITE()或“Custom_printing_via_uart(void)”将被突出,然后系统重置。
functioncmd中是否有问题?
嗨jamesleo_konka,
我不认为在printf函数使用适配器会导致丢失的COM端口,如果遇到类似的东西,别的东西是问题的原因。我已经提到了这一点(在_write()函数的适配器)的原因是为了确认您没有使用一个UART模块和你访问一个模块都通过UART接口(应用程序),并且直接与底层驱动程序(从printf()的),因为这是我能想到的UART中断您在以前的帖子得到了唯一的可能性。既然你确信你使用的是单独的UART模块printf()和从您的应用程序打印的UART不是这种情况。
我不明白的是,您粘贴的函数是导致您在上一篇文章中提到的问题的函数(不是重置,而是断点和代码暂停)?当您发送通知时,您提到代码会被重置(您的意思是代码会像您之前的帖子一样在断点处暂停?)。
据我所知,你想得到一些外部命令才能做某事,你把它放在system_init()中都知道system_init()只会运行一次,之后它不会再次运行,这意味着AD_UART_READ()函数将阻止,直到超时过去或获取它想要的数据。据我所知,您将等待用户在启动广告之前输入数据,我无法在您使用的功能中看到可能导致问题的功能,我尝试过以下类似的代码在system_init中()函数才能检查问题,并且在启用了HRP_SESNOR的通知时,也没有注意到任何奇怪的内容。
uart_device开发;静态char usart1_snd_buf [4] = {'o','k','\ n','\ r'};静态char usart1_rcv_buf [6];静态炭CMD [6] = “启动\ R”;dev = ad_uart_open(serial1);无符号字符try_计数=5;
while(尝试计数){memset的(usart1_rcv_buf,0×00,的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_);
if(!memcmp(usart1_rc_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,我害怕很久等待UART通信,所以在从UART读取时设置超时。(通常100ms〜1000ms,不是os_event_forever)初始化和任务时使用sendcmd()函数,有必要防止看门狗的超时。当我在system_init中调用sendcmd()时,它可以正常工作。(也许这设置了一个陷阱)。错误发生在hrp_sensor_task - 当调用ad_uart_write()时。我不知道sendcmd()如何影响以下ad_uart_write()?
首先请您尽量大尺寸的UART接收缓冲区?我发现我的1024个字节的缓冲区将杀死系统。如果缓冲区是“静态”型?
静态char usart1_rcv_buf [6];// - >到1024字节
BTW,如何检查堆栈大小?构建结果显示比实际(RECV +发送缓冲区= 2048)的较小的RAM大小。
我的接收器缓冲区增加到1024但没有出现问题,我使用静态的原因是为了不改变我的任务的默认堆栈大小,只要您将堆栈大小保持足够大的堆栈尺寸您功能所需的大小。关于您剩下的堆栈有多少,免费RTOS对此有一些类似于UxtaskGetStackHighwatermark()的工具,以及系统视图或臭氧等工具可以选择监视您创建的每个任务的堆栈。关于您在UART中断处理程序中获取的错误,我相信这是由AD_UART_READ()函数引起的东西,我可以重写您只有在UART上的打印期间看到的内容,即在终端上键入某些内容,那将导致中断你得到。您可以通过定义CONFIG_UART_IGNORE_BUSY_DETECT来避免该问题,但在获得中断时将闪烁TX FIFO。你能检查一下适合你的吗?
嗨,Dialog,这是一个幸运的日子!定义CONFIG_UART_IGNORE_BUSY_DETECT后,系统工作正常!此外,我使用uxTaskGetStackHighWaterMark()的测试堆栈,没关系,约568〜1568〜1432〜。但我不知道为什么/怎么UART BUSY冲突发生。如何调试呢?
正如我所提到的那样,当68x打印时,我只能复制问题我也在在UART中发送字符,所以你可以检查附加的字符是否在FW打印时发送到UART?
嗨,MT_Dialog,新问题出现了。我在UART1上输出许多文本段,并在UART2(printf())上进行监视。AT命令,如“AT?”,“AT+SETMODE”;。。。。。一些用于初始化,一些用于操作。在开始的时候,通信正常。当我输出长文本操作,有一个人物造型(0x08的)在命令文本的开头加入,这样的:// -------------------------------发布/设备/ 3508300 / DataPoints?键入= 5 http / 1.1API-key:2h3d3ywz = nkal57tb7gxkjv = bhi =主机:api.heclouds.com.内容长度:19
,;气温27.59度// ------------------------------------使用printf()同时监视命令文本,如果printf()则可以确定 - 这意味着缓冲区是OK(没有CharAtyor 0x08)。我更改了命令文本,但奇怪的CharAttor仍然是0x08。这是怎么发生的?由于“配置\u UART\u忽略\u忙碌\u检测”?
是的,如果使用#define,显然会产生这种副作用。关于您的问题,请检查您是否在打印时向设备发送数据,因为复制您的问题的唯一方法是在UART打印时从终端向UART发送数据。请检查是否发生了这种情况,并且您得到了指定的中断。另外,请尝试以下取消定义CONFIG_UART_IGNORE_BUSY_DETECT并尝试不调用ad_UART_close()。对于与UART的每次交互,只需打开接口执行写入和读取,停止打印时不调用关闭接口,如果这样可以防止触发检测到的中断HW_UART_INT_BUSY_,请尝试。
嗨,MT_dialog,打开uart设备后,我将尝试禁用“ad_uart_close”。
嗨,MT_Dialog,禁用“AD_UART_CLOSE”的方法具有更好的效果,但并非完全处理UART1数据对恐慌。该系统能正常工作一段时间(半minites,约15倍UART发送),然后将数据受到干扰。
我已经放在对这个问题的内部票,我将我从SDK团队让您的复制问题的答案,尽快报告。我也想请你来测试,如果发生这种情况,如果你不使用的printf functionallity(第二UART打印)。所以,可以请你的测试如果在调试目的取出的printf被消除忙碌中断,因此在0x08的,你得到什么?
嗨jamesleo-konka,
这将在UM-B-044-DA1468x软件平台参考文档中记录,请查看第8.6段看门狗服务。关于第二个问题,我不确定我得到它的SDK有一个操作系统,它不会在等待某些东西时停止,除非被指示这样做。
由于MT_dialog
嗨,对话,
我查了UM-B-044的第9.6段,默认的看门狗周期为2.6秒。
我无法确认watchdog和我的UART输出函数之间的关系,因为以下代码类似:
// ------------------------------------------
if(notif&HRS\u TIMER\u notif){//我在这里测试UART,每1秒触发一次
UART1DEV = AD_UART_OPEN(SERIAL1);
if(uart1dev){
http_len=http_postkt(uart1_buf,API_键,开发ID,“温度”,“24.5”)//此函数使用特定参数(*char)填充uart1_buf,buffer长度=1024,我的测试字符串长度=150字节。
// printf(“%s”newline,uart1_buf);// < - 这个Printf Fuction工作正常
AD_UART_WRITE(UART1DEV,UART1_BUF,HTTP_LEN);// !!!< - 这将导致操作后2次任务后重置
}别的{
printf(“UART1设备打开失败”换行符);
}
ad_uart_close(Uart1dev);
.........
// -------------------------------------------------
'printf'和'ad_uart_write'是什么不同的?
我对UART定义是这样的:
// ---------------------------------------------
#if 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_配置_适配器*/
//--------------------------------------------
注:“printf的”()”使用UART2为默认,我用UART(UART1)作为我的UART输出端口。(硬件引脚P1.0和P1.4)
// -------------------------------
// p10 = tx1,p14 = rx1
硬件gpio配置引脚(硬件gpio端口1、硬件gpio引脚4、硬件gpio模式输出、,
hw_gpio_func_gpio,1);
硬件gpio设置引脚功能(硬件gpio端口1、硬件gpio引脚0、硬件gpio模式输出、,
HW_GPIO_FUNC_UART_TX);
硬件gpio设置引脚功能(硬件gpio端口1、硬件gpio引脚4、硬件gpio模式输出、,
hw_gpio_func_uart_rx);
// ---------------------------------
有我错过了一些重要的东西呢?
谢谢
嗨,对话,
你在吗?
我需要一个同时使用UART1/UART2的示例代码。
HRP_Sensor使用UART2 for printf(),我尝试使用UART1(UART)来输出字符串但失败。
我不知道通过UART1(AD_UART_WRITE)发送字符串时会发生什么,使系统重置。
如何调试此问题(重置)?
谢谢
嗨jamesleo-konka,
我看不出配置有什么问题
关于打印问题,我使用HRP_Sensor进行了以下测试,并在没有定义的监视程序的情况下运行。
加入在periph_init()函数以下两个线,以便设置为UART适当的引脚,并且为了使用UART2用于printf的functionallity中使用的以下定义:
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(notf&avd_print_notif){
custom_printing_via_uart();//从UART接口打印
printf(“data \ n \ r”);//从UART2接口打印
}
custom_printing_via_uart的代码是以下内容
通过uart进行自定义打印无效(无效)
{
uart_device开发;
静态char wbuf [150] =“测试虚拟数据”;
dev = ad_uart_open(serial1);
ad_uart_write(dev,wbuf,sizeof(wbuf));
ad_uart_close(dev);
}
注意:i VE在Custom_Config_Qspi.h中定义为DG_Configuart_Adapter并使用默认Platform_Devices.h文件(默认情况下,使用不同DMA通道中的DMA配置两个UART)。
使用FTDI芯片以输出第二UART(Serial1)模块,它运行得很好。
您可以通过连接调试器来检查系统暂停的位置。当系统暂停并按下暂停按钮时,NMI或Hardfault会将PC存储在发生异常的位置,以便您可以追溯到源,如果系统由于NMI或Hardfault处理程序而暂停。
由于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);
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中定义:
// ----------------------------------
#if 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_配置_适配器*/
// ---------------------------------
但是我同时enalbe Uart1,尝试与其他外围设备进行沟通。我的UART1通过使用HRS_TIMER_NOTIF每1秒触发每1秒钟。
每次当我EXCUTE的ad_uart_write()函数时,RESET会发生。
我UART1的缓冲区为1024个字节,这样行吗?(我无法找到缓冲的限制)
顺便说一句,我也使用I2C,它可以正常工作。他们冲突吗?
我的I2C触发每0.5秒。后输出2组数据(1秒),UART1分,然后系统复位。
是否有一个示例代码同时使用UART1 / UART2?
谢谢
嗨jamesleo-konka,
没有使用两个UART的具体示例,尽管它不是难以在上面所示的那样难以实现的事情,但您可以尝试在上面的说明来检查是否适用于您。关于两个UART和I2C的冲突,这也是您必须检查的东西,您也可以删除I2C交互并检查此问题是否发生以限制可能的原因。您必须检查系统无反应时究竟发生什么,系统所做的是没有输出的,(在系统摊位并检查系统困扰时,安装调试器),您提到它会重置您是否看到通过UART执行的引导加载程序?
由于MT_dialog
嗨,MT_Dialog,
是的,我认为这是一个“简单”的问题,但它阻碍了我两个多星期。
坏消息是我无法调试我的代码,因为我的smartsnippets工作错误 - 在调试子菜单中没有attatch / qspi选项。
谢谢
嗨jamesleo-konka,
所以请检查你的其他帖子https://support.dialog-semiconductor.com/forums/post/dialog-smartbond-bl...针对此问题。
由于MT_dialog
嗨,MT_Dialog,
我开始调试,程序在这里停止:(hw_uart.c)
//--------------------------------------
void UART_INTRUPT_HANDLER(HW_UART_ID UART)
{
硬件UART INT id;
为了 (;;) {
int_id = hw_uart_get_interrupt_id(UART);
开关(int_id){
案例HW_UART_INT_超时:
hw_uart_rx_timeout_isr(UART);
休息;
机箱硬件UART内部调制解调器状态:
休息;
案例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);
休息;
案例硬件UART内部接收线路统计:
休息;
案例hw_uart_int_busy_detected:
#ifdef来CONFIG_UART_IGNORE_BUSY_DETECT
hw_uart_transmit_fifo_empty(UART);
#否则
/*
*此处停止意味着访问除数闩锁的计时规则不正确
*跟着。请参阅注册rbr_thr_dll的描述。
* /
__bkpt(0);<< --- !!!! ----在这里停下来
#恩迪夫
休息;
}
}
}
// -------------------------------------------------
为什么会发生这种情况?
嗨jamesleo-konka,
有没有机会为Printf和项目的自定义打印使用一个UART?UART2在默认引脚,P13和P23上定义,因此在配置其他UART配置的引脚上?当UART忙时,您得到的中断被触发,FIFO已满,并且您将外围设备指示为新的操作。我测试了上面粘贴了上面的代码,在每个间隔中打印了相当大的数据,所以你可以检查上面的代码是否同样的错误?也尝试尝试的东西,打印机在使用retarget操作时不要使用适配器但lld,所以可以检查在190行的config.c文件的_write()函数中。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);
返回len个;
由于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)”,错误是一样的。
最后,我找到了Comflict的代码:(自定义)
// -------------------------------------
// ---通过UART1发送命令,然后等待反馈----------
BOOL SENDCMD(CHAR * CMD,CHAR *结果,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)//死循环?
try_count--;
}
}
返回false;// 0 =失败
}
// ---------------------------------------------------
它在system_init()中呼叫:
//---------------------------------------
UART1DEV = AD_UART_OPEN(SERIAL1);
if(sendcmd(at,'OK“,100)){// ---发送命令并等待反馈,是'OK'?
Printf(“esp8266在这里”换行符);
}
别的
printf(“ESP8266不存在”换行符);
ad_uart_close(Uart1dev);
// ---------------------------------
此时,系统看起来正常,它播发配对消息并可以连接。
但是,当HRP通知开始时,AD_UART_WRITE()或“Custom_printing_via_uart(void)”将被突出,然后系统重置。
functioncmd中是否有问题?
谢谢
嗨jamesleo_konka,
我不认为在printf函数使用适配器会导致丢失的COM端口,如果遇到类似的东西,别的东西是问题的原因。我已经提到了这一点(在_write()函数的适配器)的原因是为了确认您没有使用一个UART模块和你访问一个模块都通过UART接口(应用程序),并且直接与底层驱动程序(从printf()的),因为这是我能想到的UART中断您在以前的帖子得到了唯一的可能性。既然你确信你使用的是单独的UART模块printf()和从您的应用程序打印的UART不是这种情况。
我不明白的是,您粘贴的函数是导致您在上一篇文章中提到的问题的函数(不是重置,而是断点和代码暂停)?当您发送通知时,您提到代码会被重置(您的意思是代码会像您之前的帖子一样在断点处暂停?)。
据我所知,你想得到一些外部命令才能做某事,你把它放在system_init()中都知道system_init()只会运行一次,之后它不会再次运行,这意味着AD_UART_READ()函数将阻止,直到超时过去或获取它想要的数据。据我所知,您将等待用户在启动广告之前输入数据,我无法在您使用的功能中看到可能导致问题的功能,我尝试过以下类似的代码在system_init中()函数才能检查问题,并且在启用了HRP_SESNOR的通知时,也没有注意到任何奇怪的内容。
uart_device开发;
静态char usart1_snd_buf [4] = {'o','k','\ n','\ r'};
静态char usart1_rcv_buf [6];
静态炭CMD [6] = “启动\ R”;
dev = ad_uart_open(serial1);
无符号字符try_计数=5;
while(尝试计数)
{
memset的(usart1_rcv_buf,0×00,的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_);
if(!memcmp(usart1_rc_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
嗨,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个字节的缓冲区将杀死系统。
如果缓冲区是“静态”型?
静态char usart1_rcv_buf [6];// - >到1024字节
BTW,如何检查堆栈大小?构建结果显示比实际(RECV +发送缓冲区= 2048)的较小的RAM大小。
谢谢
嗨jamesleo-konka,
我的接收器缓冲区增加到1024但没有出现问题,我使用静态的原因是为了不改变我的任务的默认堆栈大小,只要您将堆栈大小保持足够大的堆栈尺寸您功能所需的大小。关于您剩下的堆栈有多少,免费RTOS对此有一些类似于UxtaskGetStackHighwatermark()的工具,以及系统视图或臭氧等工具可以选择监视您创建的每个任务的堆栈。关于您在UART中断处理程序中获取的错误,我相信这是由AD_UART_READ()函数引起的东西,我可以重写您只有在UART上的打印期间看到的内容,即在终端上键入某些内容,那将导致中断你得到。您可以通过定义CONFIG_UART_IGNORE_BUSY_DETECT来避免该问题,但在获得中断时将闪烁TX FIFO。你能检查一下适合你的吗?
由于MT_dialog
嗨,Dialog,
这是一个幸运的日子!
定义CONFIG_UART_IGNORE_BUSY_DETECT后,系统工作正常!
此外,我使用uxTaskGetStackHighWaterMark()的测试堆栈,没关系,约568〜1568〜1432〜。
但我不知道为什么/怎么UART BUSY冲突发生。如何调试呢?
谢谢
嗨jamesleo-konka,
正如我所提到的那样,当68x打印时,我只能复制问题我也在在UART中发送字符,所以你可以检查附加的字符是否在FW打印时发送到UART?
由于MT_dialog
嗨,MT_Dialog,
新问题出现了。
我在UART1上输出许多文本段,并在UART2(printf())上进行监视。
AT命令,如“AT?”,“AT+SETMODE”;。。。。。一些用于初始化,一些用于操作。
在开始的时候,通信正常。当我输出长文本操作,有一个人物造型(0x08的)在命令文本的开头加入,这样的:
// -------------------------------
发布/设备/ 3508300 / DataPoints?键入= 5 http / 1.1
API-key:2h3d3ywz = nkal57tb7gxkjv = bhi =
主机:api.heclouds.com.
内容长度:19
,;气温27.59度
// ------------------------------------
使用printf()同时监视命令文本,如果printf()则可以确定 - 这意味着缓冲区是OK(没有CharAtyor 0x08)。
我更改了命令文本,但奇怪的CharAttor仍然是0x08。
这是怎么发生的?由于“配置\u UART\u忽略\u忙碌\u检测”?
谢谢
嗨jamesleo-konka,
是的,如果使用#define,显然会产生这种副作用。关于您的问题,请检查您是否在打印时向设备发送数据,因为复制您的问题的唯一方法是在UART打印时从终端向UART发送数据。请检查是否发生了这种情况,并且您得到了指定的中断。另外,请尝试以下取消定义CONFIG_UART_IGNORE_BUSY_DETECT并尝试不调用ad_UART_close()。对于与UART的每次交互,只需打开接口执行写入和读取,停止打印时不调用关闭接口,如果这样可以防止触发检测到的中断HW_UART_INT_BUSY_,请尝试。
由于MT_dialog
嗨,MT_dialog,
打开uart设备后,我将尝试禁用“ad_uart_close”。
嗨,MT_Dialog,
禁用“AD_UART_CLOSE”的方法具有更好的效果,但并非完全处理UART1数据对恐慌。
该系统能正常工作一段时间(半minites,约15倍UART发送),然后将数据受到干扰。
嗨jamesleo-konka,
我已经放在对这个问题的内部票,我将我从SDK团队让您的复制问题的答案,尽快报告。我也想请你来测试,如果发生这种情况,如果你不使用的printf functionallity(第二UART打印)。所以,可以请你的测试如果在调试目的取出的printf被消除忙碌中断,因此在0x08的,你得到什么?
由于MT_dialog