嗨对话框,我没有发现在DA14681的SDK设置看门狗周期参数。如未获通知,看门狗只将届满多久?通过UART与外围设备通信(发送数据并等待一些数据返回)是一项耗时较长的任务。
谢谢
嗨jamesleo-konka,
这将在UM-B-044-DA1468x软件平台参考文档中记录,请查看第8.6段看门狗服务。关于第二个问题,我不确定我得到它的SDK有一个操作系统,它不会在等待某些东西时停止,除非被指示这样做。
由于MT_dialog
嗨对话框,我检查了UM-B-044的9.6段,默认的监控周期是2.6秒。我无法证实看门狗和我的UART输出功能之间的关系,因为下面类似的代码://------------------------------------------如果(通知符&HRS_TIMER_NOTIF){//在我这里测试UART,triggled每1个sencondUART1DEV = AD_UART_OPEN(SERIAL1);
如果(uart1dev) {http_len = HTTP_PostPkt(uart1_buf,API_KEY,DEV_ID, “温度”, “24.5”);//此功能填充特定参数(* CHAR),bufffer长度= 1024和我的测试串长度= 150个字节的uart1_buf。// 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
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 = 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);
#定义CONFIG_RETARGET#定义CONFIG_RETARGET_UART HW_UART2
创建了一个计时器,每隔1秒钟每次超过一次,并通知HRP_Sensor_Task以便从该任务中打印:
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(“\ n \ r数据”);//打印UART2接口}
custom_printing_via_uart的代码是以下内容
空隙custom_printing_via_uart(无效){uart_device开发;静态char wbuf [150] =“测试虚拟数据”;dev = ad_uart_open(serial1);ad_uart_write (dev, wbuf sizeof (wbuf));ad_uart_close(dev);}
注意:我在custom_config_qpi .h文件中定义了dg_configUART_ADAPTER并使用了默认的platform_devices.h文件(默认情况下,两个UART都是在不同的DMA通道中使用DMA配置的)。
使用FTDI芯片来输出第二个uart (SERIAL1)模块,它工作得很好。
您可以检查,其中通过安装调试时,系统卡住熄火系统,按暂停键时,NMI或Hardfault将在PC存储在其中的例外发生,这样就可以,如果追溯到源,点由于NMI或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()函数时,都会发生RESET。我的UART1的缓冲区是1024字节,这样可以吗?(我找不到缓冲区的限制)
顺便说一句,我也使用I2C,它可以正常工作。他们冲突吗?我的I2C每0.5秒触发一次。输出2组数据后(1秒),UART1星,然后系统复位。
是否有同时使用UART1/UART2的示例代码?
没有使用这两种UARTs的具体示例,尽管正如我上面指出的那样,这不是很难实现的事情,但您可以尝试实现上面的说明,以检查它是否对您有效。对于冲突的两个UARTS和I2C,您也必须检查这一点,您可以删除I2C交互并检查是否发生了该问题,以限制可能的原因。你需要检查什么当系统变得反应迟钝,当没有什么系统的输出(附加调试器当系统摊位并检查系统卡住了),你提到会重置你看到通过UART引导装载程序执行吗?
嗨,MT_Dialog,是的,我认为这是一个“简单”的问题,但它阻止我要超过2周。坏消息是我不能调试我的代码,因为我的SmartSnippets工作错误——在调试子菜单中没有attach /QSPI选项。
所以,请检查您的其他职位https://support.dialog-semicondiondiondum/forums/post/dialog-smartbond-bl ...对于这个问题。
嗨,MT_Dialog,我得到我开始调试,并在这里proram站:(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_DETECThw_uart_transmit_fifo_empty (uart);#别的/ **停在这里是指用于锁存没有访问除数是时序规则*跟着。请参阅注册rbr_thr_dll的描述。*/__BKPT (0);< <——! !---- stopped at here#万一打破;}}}//-------------------------------------------------
为什么会发生这种情况?
有没有机会为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);返回兰;
嗨,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端口丢失!——尽管它存在于设备管理器中,但无法打开。
我测试你的函数“无效custom_printing_via_uart(无效)”,错误是一样的。
最后,我找到了冲突的代码:(自定义)//-------------------------------------// ---通过UART1发送命令,然后等待反馈----------SendCmd(char* cmd, char* result, int timeOut)输出{无符号字符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,超时);//不知道长度如果((NULL!=的strstr((为const char *)usart1_rcv_buf,结果)))//将接收到的结果{返回true;/ / 1 =成功;打破;}别的 {mDelay(100);//死循环?try_count--;}}
返回错误;/ / 0 =失败}//---------------------------------------------------它在system_init()中被这样调用:// ---------------------------------------UART1DEV = AD_UART_OPEN(SERIAL1);
if(SendCmd(AT,"OK",100)){//——发送命令并等待反馈,它是'OK' ?Printf(“esp8266在这里”换行符);}其他的的printf( “ESP8266不存在” 新行);
ad_uart_close (uart1dev);//---------------------------------
此时,系统看起来像OK,它做广告对消息和可以连接。但是当hrp notify开始时,ad_uart_write()或custom_printing_via_uart(void)将被执行,然后系统将得到RESET。
functioncmd中是否有问题?
嗨jamesleo_konka,
我不认为在printf函数中使用适配器会导致COM端口丢失,如果你正在经历类似的事情,其他事情是导致这个问题的原因。我提到这个的原因(_write()函数中的适配器)是为了验证您没有使用一个UART模块,并且您是通过UART适配器(您的应用程序)和直接使用低级驱动程序(从printf())访问该模块,因为这是我能想到的唯一可能的UART中断,你在之前的职位。由于您确定您正在为printf()和从应用程序打印UART使用单独的UART模块,因此情况并非如此。
什么我不明白,是你粘贴的功能,是一个使你在以前的帖子提到的问题(不复位,但断点和代码摊位)?而且,当你发送你提到的代码得到一个RESET通知的事实(你的意思是再代码摊位喜欢你以前的帖子断点?)。
据我所知,你想得到一些外部命令才能做某事,你把它放在system_init()中都知道system_init()只会运行一次,之后它不会再次运行,这意味着AD_UART_READ()函数将阻止,直到超时过去或获取它想要的数据。据我所知,您将等待用户在启动广告之前输入数据,我无法在您使用的功能中看到可能导致问题的功能,我尝试过以下类似的代码在system_init中()函数才能检查问题,并且在启用了HRP_SESNOR的通知时,也没有注意到任何奇怪的内容。
uart_device开发;静态char usart1_snd_buf [4] = {'o','k','\ n','\ r'};静态字符usart1_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);
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字节缓冲区将杀死系统。缓冲区应该是“静态”类型吗?
静态字符usart1_rcv_buf [6];//——>到1024字节
顺便说一下,如何检查堆栈大小?构建结果显示一个比实际内存更小的RAM大小(recv + send buffer =2048)。
我我的接收缓冲区增加到1024,但没有发生问题,我使用了静态的原因是为了不改变默认的堆栈大小我的任务,您可以使用局部变量,只要你保持所需的堆栈大小足够大,以适应大小从你的函数。关于你还剩下多少堆栈,Free RTOS有一些工具,比如uxTaskGetStackHighWaterMark(),还有像System View或Ozone这样的工具,让你可以选择监控你创建的每个任务的堆栈。关于您在UART中断处理程序中得到的错误,我相信这是由ad_uart_read()函数引起的,我可以复制您所看到的,只有当在UART上打印时,我在终端上键入一些东西,这将导致您得到的中断。你可以通过定义CONFIG_UART_IGNORE_BUSY_DETECT来避免这个问题,但是当你得到那个中断时,它将闪烁TX fifo。你能检查一下这对你是否有效吗?
嗨,对话,这是一个幸运的日子!定义CONFIG_UART_IGNORE_BUSY_DETECT后,系统工作正常!我还使用uxTaskGetStackHighWaterMark()测试了堆栈,它是OK的,大约568~1568~1432~。但是我不知道为什么/如何发生UART BUSY冲突。如何调试它?
非常感谢
正如我提到的,我只能复制这个问题,当68x打印时,我也在UART中发送字符,所以你可以检查一下,当fw打印时,是否有额外的字符发送到UART ?
嗨,MT_Dialog,新问题的用武之地。在UART1 I输出许多文本段,并在UART2监测(的printf())。AT命令,如 '在哪里?', 'AT + SETMODE'; ......一些用于初始化,对于一些操作。一开始,沟通是可以的。当我输出长文本进行操作时,在命令文本的开头添加了一个字符(0x08),像这样://-----------------------------------POST /设备/ 3508300 /点吗?类型= 5 HTTP / 1.1api密匙:2 h3d3ywz = 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次UART发送),然后数据被干扰。
我已经放置了一个关于这个问题的内部票据,我将尽快报告,当我从SDK团队得到你复制的问题的答案。我还想请您测试一下,如果您不使用printf功能(第二次UART打印),是否会发生这种情况。因此,您能否测试一下,为了调试目的而删除printf是否消除了BUSY中断,从而消除了您得到的0x08 ?
嗨jamesleo-konka,
这将在UM-B-044-DA1468x软件平台参考文档中记录,请查看第8.6段看门狗服务。关于第二个问题,我不确定我得到它的SDK有一个操作系统,它不会在等待某些东西时停止,除非被指示这样做。
由于MT_dialog
嗨对话框,
我检查了UM-B-044的9.6段,默认的监控周期是2.6秒。
我无法证实看门狗和我的UART输出功能之间的关系,因为下面类似的代码:
//------------------------------------------
如果(通知符&HRS_TIMER_NOTIF){//在我这里测试UART,triggled每1个sencond
UART1DEV = AD_UART_OPEN(SERIAL1);
如果(uart1dev) {
http_len = HTTP_PostPkt(uart1_buf,API_KEY,DEV_ID, “温度”, “24.5”);//此功能填充特定参数(* CHAR),bufffer长度= 1024和我的测试串长度= 150个字节的uart1_buf。
// 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
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);
//---------------------------------
我是不是错过了什么重要的事情?
谢谢
嗨对话框,
你在吗?
我需要使用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);
#定义CONFIG_RETARGET
#定义CONFIG_RETARGET_UART HW_UART2
创建了一个计时器,每隔1秒钟每次超过一次,并通知HRP_Sensor_Task以便从该任务中打印:
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(“\ n \ r数据”);//打印UART2接口
}
custom_printing_via_uart的代码是以下内容
空隙custom_printing_via_uart(无效)
{
uart_device开发;
静态char wbuf [150] =“测试虚拟数据”;
dev = ad_uart_open(serial1);
ad_uart_write (dev, wbuf sizeof (wbuf));
ad_uart_close(dev);
}
注意:我在custom_config_qpi .h文件中定义了dg_configUART_ADAPTER并使用了默认的platform_devices.h文件(默认情况下,两个UART都是在不同的DMA通道中使用DMA配置的)。
使用FTDI芯片来输出第二个uart (SERIAL1)模块,它工作得很好。
您可以检查,其中通过安装调试时,系统卡住熄火系统,按暂停键时,NMI或Hardfault将在PC存储在其中的例外发生,这样就可以,如果追溯到源,点由于NMI或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
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 /
//---------------------------------
但是我同时enalbe Uart1,尝试与其他外围设备进行沟通。我的UART1通过使用HRS_TIMER_NOTIF每1秒触发每1秒钟。
每次当我执行ad_uart_write()函数时,都会发生RESET。
我的UART1的缓冲区是1024字节,这样可以吗?(我找不到缓冲区的限制)
顺便说一句,我也使用I2C,它可以正常工作。他们冲突吗?
我的I2C每0.5秒触发一次。输出2组数据后(1秒),UART1星,然后系统复位。
是否有同时使用UART1/UART2的示例代码?
谢谢
嗨jamesleo-konka,
没有使用这两种UARTs的具体示例,尽管正如我上面指出的那样,这不是很难实现的事情,但您可以尝试实现上面的说明,以检查它是否对您有效。对于冲突的两个UARTS和I2C,您也必须检查这一点,您可以删除I2C交互并检查是否发生了该问题,以限制可能的原因。你需要检查什么当系统变得反应迟钝,当没有什么系统的输出(附加调试器当系统摊位并检查系统卡住了),你提到会重置你看到通过UART引导装载程序执行吗?
由于MT_dialog
嗨,MT_Dialog,
是的,我认为这是一个“简单”的问题,但它阻止我要超过2周。
坏消息是我不能调试我的代码,因为我的SmartSnippets工作错误——在调试子菜单中没有attach /QSPI选项。
谢谢
嗨jamesleo-konka,
所以,请检查您的其他职位https://support.dialog-semicondiondiondum/forums/post/dialog-smartbond-bl ...对于这个问题。
由于MT_dialog
嗨,MT_Dialog,
我得到我开始调试,并在这里proram站:(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);< <——! !---- stopped at here
#万一
打破;
}
}
}
//-------------------------------------------------
为什么会发生这种情况?
嗨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);
返回兰;
由于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端口丢失!——尽管它存在于设备管理器中,但无法打开。
我测试你的函数“无效custom_printing_via_uart(无效)”,错误是一样的。
最后,我找到了冲突的代码:(自定义)
//-------------------------------------
// ---通过UART1发送命令,然后等待反馈----------
SendCmd(char* cmd, char* result, int timeOut)输出
{
无符号字符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,超时);//不知道长度
如果((NULL!=的strstr((为const char *)usart1_rcv_buf,结果)))//将接收到的结果
{
返回true;/ / 1 =成功;打破;
}
别的 {
mDelay(100);//死循环?
try_count--;
}
}
返回错误;/ / 0 =失败
}
//---------------------------------------------------
它在system_init()中被这样调用:
// ---------------------------------------
UART1DEV = AD_UART_OPEN(SERIAL1);
if(SendCmd(AT,"OK",100)){//——发送命令并等待反馈,它是'OK' ?
Printf(“esp8266在这里”换行符);
}
其他的
的printf( “ESP8266不存在” 新行);
ad_uart_close (uart1dev);
//---------------------------------
此时,系统看起来像OK,它做广告对消息和可以连接。
但是当hrp notify开始时,ad_uart_write()或custom_printing_via_uart(void)将被执行,然后系统将得到RESET。
functioncmd中是否有问题?
谢谢
嗨jamesleo_konka,
我不认为在printf函数中使用适配器会导致COM端口丢失,如果你正在经历类似的事情,其他事情是导致这个问题的原因。我提到这个的原因(_write()函数中的适配器)是为了验证您没有使用一个UART模块,并且您是通过UART适配器(您的应用程序)和直接使用低级驱动程序(从printf())访问该模块,因为这是我能想到的唯一可能的UART中断,你在之前的职位。由于您确定您正在为printf()和从应用程序打印UART使用单独的UART模块,因此情况并非如此。
什么我不明白,是你粘贴的功能,是一个使你在以前的帖子提到的问题(不复位,但断点和代码摊位)?而且,当你发送你提到的代码得到一个RESET通知的事实(你的意思是再代码摊位喜欢你以前的帖子断点?)。
据我所知,你想得到一些外部命令才能做某事,你把它放在system_init()中都知道system_init()只会运行一次,之后它不会再次运行,这意味着AD_UART_READ()函数将阻止,直到超时过去或获取它想要的数据。据我所知,您将等待用户在启动广告之前输入数据,我无法在您使用的功能中看到可能导致问题的功能,我尝试过以下类似的代码在system_init中()函数才能检查问题,并且在启用了HRP_SESNOR的通知时,也没有注意到任何奇怪的内容。
uart_device开发;
静态char usart1_snd_buf [4] = {'o','k','\ n','\ r'};
静态字符usart1_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);
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字节缓冲区将杀死系统。
缓冲区应该是“静态”类型吗?
静态字符usart1_rcv_buf [6];//——>到1024字节
顺便说一下,如何检查堆栈大小?构建结果显示一个比实际内存更小的RAM大小(recv + send buffer =2048)。
谢谢
嗨jamesleo-konka,
我我的接收缓冲区增加到1024,但没有发生问题,我使用了静态的原因是为了不改变默认的堆栈大小我的任务,您可以使用局部变量,只要你保持所需的堆栈大小足够大,以适应大小从你的函数。关于你还剩下多少堆栈,Free RTOS有一些工具,比如uxTaskGetStackHighWaterMark(),还有像System View或Ozone这样的工具,让你可以选择监控你创建的每个任务的堆栈。关于您在UART中断处理程序中得到的错误,我相信这是由ad_uart_read()函数引起的,我可以复制您所看到的,只有当在UART上打印时,我在终端上键入一些东西,这将导致您得到的中断。你可以通过定义CONFIG_UART_IGNORE_BUSY_DETECT来避免这个问题,但是当你得到那个中断时,它将闪烁TX fifo。你能检查一下这对你是否有效吗?
由于MT_dialog
嗨,对话,
这是一个幸运的日子!
定义CONFIG_UART_IGNORE_BUSY_DETECT后,系统工作正常!
我还使用uxTaskGetStackHighWaterMark()测试了堆栈,它是OK的,大约568~1568~1432~。
但是我不知道为什么/如何发生UART BUSY冲突。如何调试它?
非常感谢
嗨jamesleo-konka,
正如我提到的,我只能复制这个问题,当68x打印时,我也在UART中发送字符,所以你可以检查一下,当fw打印时,是否有额外的字符发送到UART ?
由于MT_dialog
嗨,MT_Dialog,
新问题的用武之地。
在UART1 I输出许多文本段,并在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(没有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次UART发送),然后数据被干扰。
嗨jamesleo-konka,
我已经放置了一个关于这个问题的内部票据,我将尽快报告,当我从SDK团队得到你复制的问题的答案。我还想请您测试一下,如果您不使用printf功能(第二次UART打印),是否会发生这种情况。因此,您能否测试一下,为了调试目的而删除printf是否消除了BUSY中断,从而消除了您得到的0x08 ?
由于MT_dialog