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 中断(HWI)

Guru**** 2015290 points
Other Parts Discussed in Thread: IWR6843AOP, IWR6843
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/sensors-group/sensors/f/sensors-forum/973215/iwr6843aop-generate-uart-interrupt-hwi

器件型号:IWR6843AOP
主题中讨论的其他器件: IWR6843

您好!

我正在基于 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

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    经过进一步的研究和支付后、我现在是一些进一步的步骤。

    1. 我无法在通道上创建 HWI。 这是因为我使用的是 UART 驱动程序、它在该通道上创建了一个 HWI。
      在这个驱动程序中、一个读取或/和写入信号量被创建以在接收/写入时阻断任务。
    2. HWI 将通过以下方式创建(从此处开始):
      hwi0 = Hwi_create (64、&hwi0Fxn、&hwiParams、&EB); 
      intNum   - 中断编号(VIM 中断通道)
      hwiFxn    — ISR 函数的指针
      Params — 按实例配置参数、或 NULL、用于选择默认值(仅限目标域)
      EB            — 活动错误处理块、或 NULL、用于选择默认策略(仅限目标域)

    但我的问题没有得到解决。
    正如我在开始时提到的、当所有数据都已发送时、我需要一个中断。
    两个 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