嗨,对话框中,
我目前正在一个项目中使用这两个UARTs。
我创建了两个连续调用ad_uart_read超时1000ms来填充缓冲区的任务。
所有的工作都很好,直到我启用extended_sleep。
从那时起,我就遇到了由函数ad_uart_signal_event_read调用的硬故障处理程序。
到目前为止我努力过
在与UART设备通信时使用pm_stay_alive,并在完成此操作后使用pm_resume_sleep。我还实现了一个方法,等待两个任务停止调用ad_uart_read被保存,当进入睡眠时没有读操作正在进行。相同的结果。
-在每次读写操作之前打开和关闭uart。相同的结果。
-禁用一个任务进行测试,如果禁用uart1-using任务,问题就消失了。
我读到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(函数:静态void hw_uart_fire_callback(UART_Data *ud))。
这里是我的简化任务,导致Hardfault:
hw_uart_bus (UART1, uartex, HW_UART_BAUDRATE_9600, HW_UART_DATABITS_8, HW_UART_PARITY_NONE, hw_uart_bus, 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_ticks(1000)); / /执行操作
If (r != 1) {
//没有收到任何东西
继续;
}
//如果接收到任何内容,将其放入缓冲区
}
}
我已经阅读了UART示例,我写道,当我从UART1和UART2读取数据时,问题就出现了,但当我仅从UART2读取数据时,问题就不存在了,UART1和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的注释,它就不会崩溃。我的平台设备如下所示:
hw_uart_bus (UART1, uartex, HW_UART_BAUDRATE_9600, HW_UART_DATABITS_8, HW_UART_PARITY_NONE, hw_uart_bus, 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)
hw_uart_bus (UART2, uartey, HW_UART_BAUDRATE_9600, HW_UART_DATABITS_8, HW_UART_PARITY_NONE, hw_uart_bus)
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