嗨,对话框中,
我目前在一个项目中使用这两种uart。
我创建了两个任务,它们持续调用ad_uart_read,超时时间为1000ms,以填充缓冲区。
所有工作正常,直到我启用extended_sleep。
从那时起,我就遇到了由ad_uart_signal_event_read函数调用的硬错误处理程序。
到目前为止我一直在努力
-使用pm_stay_alive与UART设备通信和pm_resume_sleep当我完成这个。我还实现了一个方法,等待两个任务停止调用ad_uart_read保存没有读取操作正在进行时,进入睡眠。相同的结果。
-打开和关闭uart之前,每个读和写操作。相同的结果。
-禁用一个任务的测试目的,如果我禁用uart1-使用任务问题消失。
我已经读到DA14580有两个不同实现的驱动程序的uart1和uart2,这对我的DA14680重要吗?
你有什么建议能帮我解决这个问题吗?
关键词:
设备:
你好韩国乐团,
使用pm_stay_alive有什么特殊原因吗?由于存在UART活动,设备将不会进入睡眠模式。你能解释一下你从哪里得到的硬件故障吗?PC和LR在哪个位置?.此外,我强烈建议您看一下第12.3.1章的UART适配器示例UM-B-044用户手册:DA1468x软件平台参考(HTML)从我们的支持门户。
谢谢,PM_Dialog
嗨PM_Dialog,
我使用pm_stay_alive,因为我认为问题将在UART Rx进行时休眠。如果没有pm_stay_alive和pm_resume_sleep,问题将继续存在。
请查看我所附的图像,您可以看到PC指向ad_uart_signal_event_read()在行OS_EVENT_SIGNAL_FROM_ISR(cd->device->bus_data->event_read);.
对于PC它是地址0x800cf1c和LR它是0x8009841(函数:static void hw_uart_fire_callback(UART_Data *ud))。
以下是导致Hardfault的简化任务:
UART_BUS(UART1, uartex, HW_UART_BAUDRATE_9600, HW_UART_DATABITS_8, HW_UART_PARITY_NONE,
Hw_uart_stopbits_1, 0,0, hw_dma_channel_1, hw_dma_channel_0,0,0)
空白rx_task (void * params)
{
uart_dev = ad_uart_open (uartex);
uint8_t buf [1];
而(1){
int r = ad_uart_read(uart_dev, buf, 1, OS_MS_2_TICKS(1000));
If (r != 1) {
//没有收到任何东西
继续;
}
//如果接收到任何东西,把它放在缓冲区中
}
}
我读过UART示例,我写过当我从UART1和UART2中读取时出现问题,但当我用几乎相同的UART1和UART2的读取任务仅从UART2中读取时就不存在问题
编辑:在每个ad_uart_write_async和ad_uart_read之前和之后使用ad_uart_bus_acquire和ad_uart_bus_release不会改变任何东西。
你好韩国乐团,
根据数据表,UART2用一个16字节深度的FIFO实现硬件流控制,所以你不能将它配置为软件UART。UART1支持软件实现。这意味着你不能通过UART1唤醒,因为它不支持RTS/CTS。通常,由于设备进入睡眠状态,您不能使用UART1。如果你禁用睡眠模式,你可以让我知道,如果你得到相同的错误,当你试图阅读超过UART1?如果您能够提供任何类型的配置或正在使用的任何代码片段,这将非常有帮助。
谢谢,PM_Dialog
嗨PM_Dialog,
如果我关闭睡眠模式,一切运行正常。
我不需要UART处于睡眠模式。这意味着我不在乎在睡眠模式下丢失数据,但不幸的是,设备崩溃了。
正如我所说的,除了变量名之外,您可以复制我上面的文章中的代码用于UART1和2。这是唯一一段产生错误的代码。
如果我取消启动rx_task的注释,它就不会崩溃。我的平台-设备如下所示:
UART_BUS(UART1, uartex, HW_UART_BAUDRATE_9600, 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, uartey, HW_UART_BAUDRATE_9600, HW_UART_DATABITS_8, HW_UART_PARITY_NONE,
hw_uart_stopbits_1,0,1, hw_dma_channel_3, hw_dma_channel_2, 0,0)
你有什么想法吗?
你好再次,
如果我的UART设备在DA处于睡眠模式时仍向我发送数据,会不会有问题?
我不能强迫他们停止发送数据,我想念他们也不是坏事。
看到附加的最小化固件,我用来测试这个。
固件正在devkit上工作,因为在睡眠模式下没有UART设备向DA发送数据。
你好韩国乐团,
正如之前提到的,你不能通过UART1醒来,因为它不支持RTS/CTS。这就是为什么如果你关闭睡眠模式,一切都运行良好。如果设备进入睡眠模式,那么所有外设(包括UART块)都将通电,并且在设备醒来后不会有UART活动。如果您正在使用适配器,如果您有挂起的UART事务,DA1460将处于活动模式,而当UART事务结束时,设备将进入睡眠模式。因此,如果芯片处于睡眠模式,就不可能有UART事务。
谢谢,PM_Dialog
嗨PM_Dialog,
我明白这一点。我不需要一觉醒来就收到那些信息。问题仍然是,设备由于某些原因硬件故障,因为UART想要触发一个“空”读事件,就像我之前写的那样。
问候
你好韩国乐团,
你能澄清你的意思是“因为UART想要发射一个“空”读事件,正如我之前写的”?如果你使用睡眠模式,你应该配置RTC/CTS引脚,以便唤醒。另外,请看看UART_BUS()注释。_auto_flow_control应该定义为1。如果您能够探测UART信号并提供一些屏幕截图,将会非常有帮助。
谢谢,PM_Dialog