我试图创建一个任务,负责从串行使用UART1读取。我发现调用ad_uart_read几次之后,最终ad_uart_read()将永远阻塞。我使用的是一个USB to TTL适配器,我可以使用逻辑分析仪探测它,因此我知道消息将发送到线路上,但ad_uart_read()仍然没有返回。
通过添加打印,我知道ad_uart_read()在这一行是阻塞的:
OS_EVENT_WAIT(设备- > bus_data - > event_read,超时);
关于如何配置UARTs的一些细节(UART1用于通信,UART2用于printf)
c:
Static const gpio_config gpio_cfg[] = {
HW_GPIO_PINCONFIG(HW_GPIO_PORT_1, HW_GPIO_PIN_3, OUTPUT, UART2_TX, false),
HW_GPIO_PINCONFIG(HW_GPIO_PORT_2, HW_GPIO_PIN_3, INPUT, UART2_RX, false),
HW_GPIO_PINCONFIG(HW_GPIO_PORT_3,HW_GPIO_PIN_2, OUTPUT, UART_TX, false),
HW_GPIO_PINCONFIG(HW_GPIO_PORT_3, HW_GPIO_PIN_3, INPUT, UART_RX, false),
HW_GPIO_PINCONFIG_END
};
..
hw_gpio_configure (gpio_cfg);
在custom_config_qspi.h:
#定义CONFIG_RETARGET
#定义CONFIG_RETARGET_UART HW_UART2
#定义dg_configUART_ADAPTER (1)
/ / # define dg_configUART_SOFTWARE_FIFO (1)
#定义dg_configUART_RX_CIRCULAR_DMA (1)
#定义dg_configUART1_RX_CIRCULAR_DMA_BUF_SIZE (100)
/ / # define dg_configUART1_SOFTWARE_FIFO_SIZE (100)
注意,我已经尝试切换使用软件FIFO和DMA,我得到相同的行为。
在platform_device.h:
Uart_bus (uart1, serial1, hw_uart_baudrate_19200, hw_uart_databits_8, hw_uart_parity_none,
Hw_uart_stopbits_1, 1,1, 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)
在mytask.c:
ad_uart_init ();
uart_device uart = ad_uart_open(SERIAL1);
(,) {
Int len = ad_uart_read()
...
}
嗨ainwood87,
我相信你所经历的问题是由延长睡眠时间引起的。当您使用延长睡眠时,设备将不会被UART Rx引脚上的流量自动唤醒。只有使用CTS引脚的UART2支持这种从睡眠中唤醒的函数。UART1不支持任何流控制,因此不使用位就无法从睡眠中唤醒。我们通过测试您发布的代码来复制您的问题,我们得出结论,您的代码停止的原因是睡眠配置问题。强烈建议将缓冲区大小更改为比dma循环缓冲区大小小1。
建议:
谢谢,PM_Dialog
嗨,对话框中,
能解释一下如何配置单板使用CTS引脚吗?这是我需要手动分配到GPIO引脚的东西,还是它内置到USB连接?
嗨,对话框中,
您提到FIFO大小应该比DMA循环缓冲区大小小1。然而,当我尝试编译两个选项启用,我得到以下警告:
#错误UART2不能同时配置使用软件FIFO和循环DMA FIFO
这似乎与你的建议相矛盾。
嗨ainwood87,
根据DA14680 datasheet, UART2用一个16字节深度的FIFO实现硬件流控制,所以您不能将它配置为软件UART。只有UART1支持软件实现。对于完整的UART功能,您应该在头文件(J15)中添加RTS - P1_5和CTS - P1_6之间的跳线。强烈建议调查一下5.3.4 HCI / UART报头(J15)段落的«DA1468x/DA1510x PRODevelopment kit UM-B-060»用户手册文档。注意,CTS引脚通过跳线J8与K1按钮复用。然后,在外围_init()函数中配置CTS pin,如下所示:
hw_gpio_configure_pin (HW_GPIO_PORT_1,HW_GPIO_PIN_6,HW_GPIO_MODE_INPUT_PULLUP,
HW_GPIO_FUNC_UART2_CTSN1);
谢谢,PM_Dialog