This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
您好!
我正在基于 IWR6843AOP 的"开箱即用"固件开发定制固件。
对于与外部器件的串行通信、我尝试在 UART 上使用中断。
为此、引脚按照"开箱即用"演示的方式创建、并初始化 UART。
/******* PINMUX UART //* 设置 PINMUX 以显示 UART-1 */ Pinmux_set_OverrideCtrl (SOC_XWR6843AOP_PINU16_PADBE、PINMUX_OUTEN_RETAIN_HW_CTRL、PINMUX_INPEN_RETAIN_HW_CTRL); Pinmux_Set_FuncSel (SOC_XWR6843AOP_PINU16_PADBE、SOC_XWR6843AOP_PINU16_PADBE_MSS_UARTA_TX); Pinmux_set_OverrideCtrl (SOC_XWR6843AOP_PINV16_PADBD、PINMUX_OUTEN_RETAIN_HW_CTRL、PINMUX_INPEN_RETAIN_HW_CTRL); Pinmux_Set_FuncSel (SOC_XWR6843AOP_PINV16_PADBD、SOC_XWR6843AOP_PINV16_PADBD_MSS_UARTA_RX);
和
/*设置默认 UART 参数*/ UART_PARAMS_INIT (uartParams); uartParams.writeDataMode = UART_DATA_BINARY; uartParams.readDataMode = UART_DATA_BINARY; uartParams.clockFrequency = gMmwMCB.cfg.platformCfg.sysClockFrequency; uartParams.baudrate = gMmwMCB.cfg.platformCfg.commandBaudRate; uartParams.isPinMuxDone = 1; uartParams.readTimeout = 13; uartParams.readEcho = UART_ECHO_OFF; uartParams.parityType = UART_PAR_LEVen;
在 BIOS_start()被执行之前,使用以下参数创建一个硬件中断:
hwi_handle hwi0; Hwi_Params HwiParams; ERROR_Block EB; ERROR_INIT (&EB); Hwi_Params_init (hwiParams); hwiParams.arg = 64; hwiParams.enableInt = 1; hwi0 = Hwi_create (5、&hwi0Fxn、&hwiParams、&EB); if (hwi0 == NULL){ system_abort ("Hwi 创建失败"); } Hwi_enableInterrupt (5); Hwi_enable();
还插入了回调函数:
void hwi0Fxn (UArg arg){ System_printf ("HWI 0"、0); }
在一个任务中、数据通过从 UART 逐次读取
uartReadBytes = UART_Read (gMmwMCB.commandUartHandle、singleBuffer、1);
但是、回调函数永远不会执行。
回调用于在稍后切换用于 RS485通信的 GPIO。
我是否必须设置其他值?
此致
Felix
更多信息:
毫米波 SDK:3.5.0.4
器件:IWR6843AOP
你(们)好、Fel
您能否详细说明在何处定义 SOC_XWR6843AOP_PINU16_PADBE 或 SOC_XWR6843AOP_PINV16_PADBD 等输入?
此致、
AG
您好、Akash、
感谢您的快速回复。
IWR6843和 IWR6843AOP 的引脚分配不同、因此我需要使用其他引脚多路复用设置作为演示中的。
我在 SDK 中找不到一个非典型的 TI 文件。 首先、我使用此 线程中的用户 QumJo 显示的配置。
UART 连接正常、我是 Abel、无法发送接收数据。
我认为我缺少一些其他中断设置。
这些设置是否正确?
hwiParams.arg = 64; hwiParams.enableInt = 1; hwi0 = Hwi_create (5、&hwi0Fxn、&hwiParams、 &EB);
hwiParams.arg = 64:64是 MSS_SCIA (UART1) 0级中断的默认 VIM 中断通道(技术参考手册中的第274页)
hwiParams.enableInt = 1:启用中断
Hwi_create (5、&hwi0Fxn、&hwiParams、&EB);5是我用来标识中断的数字
我是否必须设置附加问候语,可能在 UartSci 驱动程序中?
或者、我是否对中断机制产生了一般误解?
此致
Felix
经过进一步的研究和支付后、我现在是一些进一步的步骤。
hwi0 = Hwi_create (64、&hwi0Fxn、&hwiParams、&EB);
但我的问题没有得到解决。
正如我在开始时提到的、当所有数据都已发送时、我需要一个中断。
两个 UART_writePolling (...) 和 UART_WRITE (...) 似乎在发送所有数据之前返回。 是否使用 DMA 无关紧要。
使用以下代码、GPIO_RS485DE 将在发送所有数据之前写入。
UART_writePolling (gMmwMCB.commandUartHandle,(uint8_t*) msgPayload、300); GPIO_write (gMmwMCB.cfg.platformCfg.GPIO_RS485DE、0U);
但是、如果插入了延迟、则引脚将"足够晚"写入
UART_writePolling (gMmwMCB.commandUartHandle,(uint8_t*) msgPayload、300); Task_sleep (3); GPIO_write (gMmwMCB.cfg.platformCfg.GPIO_RS485DE、0U);
我认为这不是一种处理 GPIO 的好方法。
您能给我一个更好的方法来解决这个问题吗?
此致
Felix
您好、再说一次、
我仍在处理这个问题。
如果未插入 Task_sleep()、GPIO 将在 UART-Write 完成前切换。 (正在使用 DMA)
UART_writePolling (gMmwMCB.commandUartHandle、emtymsgPayload、720); GPIO_write (gMmwMCB.cfg.platformCfg.GPIO_RS485DE、0U);
黄色:UART Tx
绿色:GPIO
蓝色: RS485 Rx/TX-
该图像显示、GPIO 的切换时间约为190usec。
如何避免这种行为?
其他问题:如果使用 UART_WRITE (...) 而不是 UART_writePolling (...) 只会发送少量字节、GPIO 也会保持"高电平"。
我对吗、此任务可能会被中止而不会返回?
此致
Felix
你(们)好、Fel
很抱歉耽误你的时间,我仍在研究为什么会发生这种情况。
如果您有任何状态更新、请告知我们。
此致、
AG
你好
您能否解释一下您尝试生成的两个变量
1.外部 UART -->毫米波器件-->在毫米波器件内部生成 HWI
2.
您是否尝试使用与 UART 相同的引脚来生成与外部世界相同的硬件中断
或
是向毫米波器件发送和中断的外部世界。
这样我们就可以更好地指导您。
谢谢你
Vaibhav
您好!
我通过 UART 使用 RS485通信。 因此、我需要一个"驱动器使能"引脚才能按照 RS485发送数据。
问题是 UART_Write 方法在发送所有数据之前结束。
请看 这里。
我的第一个想法是使用 UART 中断、但这是不可能的、因为 UART 驱动程序使用此中断。
是否可以在发送所有数据后切换 GPIO?
此致
Felix
你(们)好、Fel
您可以使用 UART_writePolling 来代替 UART_write。 使用 UART_writePolling 会一直等待、直到发送完所有字节后才退出函数、然后您将能够触发 GPIO。
该函数在毫米波 SDK 中的以下位置定义:
C:\ti\mmwave_sdk_03_05_00_04\packages/ti\drivers\uart\UART.h
此致、
AG