嗨,对话框中,我在DA14681的SDK中没有找到设置watch dog period的参数。多久时间将看门狗过期,如果没有通知呢?有一项任务是通过UART与外围设备通信长时间(发送数据并等待某些数据回来)。
谢谢
嗨jamesleo-konka,
这将在UM-B-044-DA1468x软件平台参考文档中记录,请查看第8.6段看门狗服务。关于第二个问题,我不确定我得到它的SDK有一个操作系统,它不会在等待某些东西时停止,除非被指示这样做。
谢谢mt_dialog.
嗨,对话框中,我检查了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”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_configUART_ADAPTER *///--------------------------------------------
注意:'printf'()'使用uart2默认,我使用UART(UART1)作为我的UART输出端口。(硬件引脚P1.0和P1.4)
// ---------------------------// p10 = tx1,p14 = rx1hw_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);
// ------------------------------
我错过了一些重要的事情吗?
嗨,对话框中,你在吗?我需要一个使用UART1/UART2同时的样本代码。该hrp_sensor使用UART2的printf()和我尝试使用UART1(UART)输出字符串,但失败了。
我不知道通过UART1(AD_UART_WRITE)发送字符串时会发生什么,使系统重置。如何调试此问题(重置)?
我看不出配置有什么问题
关于打印问题,我使用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以便从该任务中打印:
print_timer = OS_TIMER_CREATE( “PRT”,OS_MS_2_TICKS(1000),OS_TIMER_SUCCESS,(无效*)OS_GET_CURRENT_TASK(),print_timer_cb);
os_timer_start(print_timer,10);
if(notf&avd_print_notif){custom_printing_via_uart();//从UART接口打印的printf( “数据\ n \ r”);//从UART2接口打印}
custom_printing_via_uart的代码是以下内容
空白custom_printing_via_uart(空白){UART_DEVICE DEV;静态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)模块,它的工作就好了。
你可以检查系统停滞时通过将调试器附加卡,按下暂停按钮,敝中断或Hardfault将存储个人电脑的异常发生,这样您就可以追溯到源代码,如果系统由于敝中断或停滞不前Hardfault处理程序。
嗨,MT_Dialog,我使用printf()@ uart2工作正常(通过调试芯片输出)。'printf()'使用p13,p23作为UART2输出/输入引脚如下:// ------------------------------/ /——TX2 = P13 RX2 = P23hw_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定义:// -------------------------------#if dg_configuart_adapter
#endif /* dg_configUART_ADAPTER */// ------------------------------
但是我同时enalbe Uart1,尝试与其他外围设备进行沟通。我的UART1通过使用HRS_TIMER_NOTIF每1秒触发每1秒钟。每次何时默认AD_UART_WRITE()函数时,将发生重置。我的UART1的缓冲区是1024字节,这是好吗?(我找不到缓冲区的限制)
顺便说一句,我也使用I2C,它可以正常工作。他们冲突吗?我的i2c每0.5秒触发。输出2组数据组(1秒)后,UART1星,然后系统复位。
有没有办法使用UART1 / UART2在同一时间一个示例代码?
还有的是,同时使用的UART,虽然它不是,这是很难才达到我VE如上所示,你可以尝试推行以上面的说明,检查是否适合你没有具体的例子。关于冲突的两个UART和I2C的,那是后话,你必须检查为好,可以去掉I2C互动,如果为了跌停的原因可能会出现这个问题进行检查。你必须检查到底发生了什么,当系统变得反应迟钝,当没有输出,(附加调试摊位制时,检查在系统粘连)系统做什么,你提到它得到RESET你看引导加载程序通过UART执行?
嗨,MT_Dialog,是的,我认为这是一个“简单”的问题,但它阻碍了我超过2周。坏消息是,我不能调试我的代码,因为我的工作SmartSnippets错误 - 在调试子菜单没有ATTATCH / QSPI选项。
所以请检查你的其他帖子https://support.dialog-semiconductor.com/forums/post/dialog-smartbond-bl..。对于这个问题。
嗨,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);<< --- !!!! ----停在这里# endif休息;}}}// -------------------------------------------------------
为什么会发生这种情况?
有没有机会为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;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_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))) //比较接收到的结果{返回真;// 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,然后系统会马上重新设置。
functioncmd中是否有问题?
嗨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;静态char usart1_snd_buf [4] = {'o','k','\ n','\ r'};静态char 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);
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〜1000毫秒,而不是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,如何检查堆栈大小?构建结果显示比真实的RAM大小(recv +发送缓冲区= 2048)。
我已经我的接收缓存增加至1024,但没有问题发生,我用的是静态的原因是为了不改变我的任务中的缺省堆栈大小,你不停的堆栈大小足够大,以适应您可以使用局部变量,只要从功能所需的大小。关于你还剩多少栈,免费RTOS有一些工具,这就像uxTaskGetStackHighWaterMark()和也喜欢系统查看或臭氧给你监视你创建的每个任务的堆栈选项工具。关于您在UART中断处理程序出现错误,我相信这是造成ad_uart_read()函数的东西,我可以复制你所看到的只有在UART i型终端上的东西打印时,将导致中断你得到。你可以避开这个问题通过定义CONFIG_UART_IGNORE_BUSY_DETECT但会闪烁TX FIFO当你得到该中断。您可以检查是否适合你?
嗨,对话框中,这是一个幸运的日子!defining config_uart_ignore_busy_detect后,系统工作正常!我也通过使用uxtaskgetstackhighwatermark()来测试堆栈,它是可以的,大约568〜1568〜1432〜。但我不知道为什么/如何忙着冲突。如何调试它?
非常感谢
正如我提到的VE,我只能复制问题时,而68X被打印我也是在UART发送字符,这样,可以检查而fw是打印的其他字符发送到UART?
嗨,mt_dialog,新问题出现了。我在UART1上输出许多文本段,并在UART2上监视(printf())。AT命令,比如“AT?””、“在+ SETMODE ';…一些用于初始化,一些用于操作。一开始,沟通还可以。当我输出用于操作的长文本时,在命令文本的开头时会添加CharAttor(0x08),如下所示:// -----------------------------------POST /装置/ 3508300 /数据点?类型= 5 HTTP / 1.1API-键:2H3d3ywz = nKaL57TB7gXKjV = BHI =主持人:api.heclouds.com内容长度:19
,温度,27.59// ---------------------------------使用printf()同时监视命令文本,如果printf()则可以确定 - 这意味着缓冲区是OK(没有CharAtyor 0x08)。我更改了命令文本,但奇怪的CharAttor仍然是0x08。这是怎么发生的?由于“CONFIG_UART_IGNORE_BUSY_DETECT”?
是的,如果使用#define,显然会有这个副作用。关于您的问题,请检查在打印时是否向设备发送数据,因为复制您的问题的唯一方法是在UART打印时从终端向UART发送数据。请检查如果这是发生的,你得到指定的中断。还试着取消定义CONFIG_UART_IGNORE_BUSY_DETECT,并试着不要调用ad_uart_close()为您与UART的每次交互,只打开接口执行写和读,当您停止打印时不要调用关闭接口,如果这样做可以防止中断HW_UART_INT_BUSY_DETECTED被触发,请尝试。
嗨,MT_dialog,我将尝试在打开uart设备后禁用'ad_uart_close'。
嗨,mt_dialog,禁用“AD_UART_CLOSE”的方法具有更好的效果,但并非完全处理UART1数据对恐慌。系统正常工作一段时间(半个月,约15次,发送),然后数据受到干扰。
我在这个问题上放了一个内部票证,我会尽快报告你的SDK团队的复制问题。如果您不使用Printf Funcessity(第二个UART打印),我还想要求您进行测试。所以你可以通过删除打印f来测试调试目的是否消除了繁忙的中断,从而实现了0x08?
嗨jamesleo-konka,
这将在UM-B-044-DA1468x软件平台参考文档中记录,请查看第8.6段看门狗服务。关于第二个问题,我不确定我得到它的SDK有一个操作系统,它不会在等待某些东西时停止,除非被指示这样做。
谢谢mt_dialog.
嗨,对话框中,
我检查了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”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_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);
// ------------------------------
我错过了一些重要的事情吗?
谢谢
嗨,对话框中,
你在吗?
我需要一个使用UART1/UART2同时的样本代码。
该hrp_sensor使用UART2的printf()和我尝试使用UART1(UART)输出字符串,但失败了。
我不知道通过UART1(AD_UART_WRITE)发送字符串时会发生什么,使系统重置。
如何调试此问题(重置)?
谢谢
嗨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以便从该任务中打印:
print_timer = OS_TIMER_CREATE( “PRT”,OS_MS_2_TICKS(1000),OS_TIMER_SUCCESS,(无效*)OS_GET_CURRENT_TASK(),print_timer_cb);
os_timer_start(print_timer,10);
if(notf&avd_print_notif){
custom_printing_via_uart();//从UART接口打印
的printf( “数据\ n \ r”);//从UART2接口打印
}
custom_printing_via_uart的代码是以下内容
空白custom_printing_via_uart(空白)
{
UART_DEVICE DEV;
静态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)模块,它的工作就好了。
你可以检查系统停滞时通过将调试器附加卡,按下暂停按钮,敝中断或Hardfault将存储个人电脑的异常发生,这样您就可以追溯到源代码,如果系统由于敝中断或停滞不前Hardfault处理程序。
谢谢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定义:
// -------------------------------
#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_configUART_ADAPTER */
// ------------------------------
但是我同时enalbe Uart1,尝试与其他外围设备进行沟通。我的UART1通过使用HRS_TIMER_NOTIF每1秒触发每1秒钟。
每次何时默认AD_UART_WRITE()函数时,将发生重置。
我的UART1的缓冲区是1024字节,这是好吗?(我找不到缓冲区的限制)
顺便说一句,我也使用I2C,它可以正常工作。他们冲突吗?
我的i2c每0.5秒触发。输出2组数据组(1秒)后,UART1星,然后系统复位。
有没有办法使用UART1 / UART2在同一时间一个示例代码?
谢谢
嗨jamesleo-konka,
还有的是,同时使用的UART,虽然它不是,这是很难才达到我VE如上所示,你可以尝试推行以上面的说明,检查是否适合你没有具体的例子。关于冲突的两个UART和I2C的,那是后话,你必须检查为好,可以去掉I2C互动,如果为了跌停的原因可能会出现这个问题进行检查。你必须检查到底发生了什么,当系统变得反应迟钝,当没有输出,(附加调试摊位制时,检查在系统粘连)系统做什么,你提到它得到RESET你看引导加载程序通过UART执行?
谢谢mt_dialog.
嗨,MT_Dialog,
是的,我认为这是一个“简单”的问题,但它阻碍了我超过2周。
坏消息是,我不能调试我的代码,因为我的工作SmartSnippets错误 - 在调试子菜单没有ATTATCH / QSPI选项。
谢谢
嗨jamesleo-konka,
所以请检查你的其他帖子https://support.dialog-semiconductor.com/forums/post/dialog-smartbond-bl..。对于这个问题。
谢谢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);<< --- !!!! ----停在这里
# endif
休息;
}
}
}
// -------------------------------------------------------
为什么会发生这种情况?
嗨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;
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_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))) //比较接收到的结果
{
返回真;// 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,然后系统会马上重新设置。
functioncmd中是否有问题?
谢谢
嗨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;
静态char usart1_snd_buf [4] = {'o','k','\ n','\ r'};
静态char 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);
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〜1000毫秒,而不是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,如何检查堆栈大小?构建结果显示比真实的RAM大小(recv +发送缓冲区= 2048)。
谢谢
嗨jamesleo-konka,
我已经我的接收缓存增加至1024,但没有问题发生,我用的是静态的原因是为了不改变我的任务中的缺省堆栈大小,你不停的堆栈大小足够大,以适应您可以使用局部变量,只要从功能所需的大小。关于你还剩多少栈,免费RTOS有一些工具,这就像uxTaskGetStackHighWaterMark()和也喜欢系统查看或臭氧给你监视你创建的每个任务的堆栈选项工具。关于您在UART中断处理程序出现错误,我相信这是造成ad_uart_read()函数的东西,我可以复制你所看到的只有在UART i型终端上的东西打印时,将导致中断你得到。你可以避开这个问题通过定义CONFIG_UART_IGNORE_BUSY_DETECT但会闪烁TX FIFO当你得到该中断。您可以检查是否适合你?
谢谢mt_dialog.
嗨,对话框中,
这是一个幸运的日子!
defining config_uart_ignore_busy_detect后,系统工作正常!
我也通过使用uxtaskgetstackhighwatermark()来测试堆栈,它是可以的,大约568〜1568〜1432〜。
但我不知道为什么/如何忙着冲突。如何调试它?
非常感谢
嗨jamesleo-konka,
正如我提到的VE,我只能复制问题时,而68X被打印我也是在UART发送字符,这样,可以检查而fw是打印的其他字符发送到UART?
谢谢mt_dialog.
嗨,mt_dialog,
新问题出现了。
我在UART1上输出许多文本段,并在UART2上监视(printf())。
AT命令,比如“AT?””、“在+ SETMODE ';…一些用于初始化,一些用于操作。
一开始,沟通还可以。当我输出用于操作的长文本时,在命令文本的开头时会添加CharAttor(0x08),如下所示:
// -----------------------------------
POST /装置/ 3508300 /数据点?类型= 5 HTTP / 1.1
API-键:2H3d3ywz = nKaL57TB7gXKjV = BHI =
主持人:api.heclouds.com
内容长度:19
,温度,27.59
// ---------------------------------
使用printf()同时监视命令文本,如果printf()则可以确定 - 这意味着缓冲区是OK(没有CharAtyor 0x08)。
我更改了命令文本,但奇怪的CharAttor仍然是0x08。
这是怎么发生的?由于“CONFIG_UART_IGNORE_BUSY_DETECT”?
谢谢
嗨jamesleo-konka,
是的,如果使用#define,显然会有这个副作用。关于您的问题,请检查在打印时是否向设备发送数据,因为复制您的问题的唯一方法是在UART打印时从终端向UART发送数据。请检查如果这是发生的,你得到指定的中断。还试着取消定义CONFIG_UART_IGNORE_BUSY_DETECT,并试着不要调用ad_uart_close()为您与UART的每次交互,只打开接口执行写和读,当您停止打印时不要调用关闭接口,如果这样做可以防止中断HW_UART_INT_BUSY_DETECTED被触发,请尝试。
谢谢mt_dialog.
嗨,MT_dialog,
我将尝试在打开uart设备后禁用'ad_uart_close'。
嗨,mt_dialog,
禁用“AD_UART_CLOSE”的方法具有更好的效果,但并非完全处理UART1数据对恐慌。
系统正常工作一段时间(半个月,约15次,发送),然后数据受到干扰。
嗨jamesleo-konka,
我在这个问题上放了一个内部票证,我会尽快报告你的SDK团队的复制问题。如果您不使用Printf Funcessity(第二个UART打印),我还想要求您进行测试。所以你可以通过删除打印f来测试调试目的是否消除了繁忙的中断,从而实现了0x08?
谢谢mt_dialog.