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.

[参考译文] MSP430FR6928:关于 UART 中的 UCTXIFG 信号的问题

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1234520/msp430fr6928-question-about-the-uctxifg-signal-in-the-uart

器件型号:MSP430FR6928

根据手册:

UCTXIFG 中断标志被发送器置位来表示 UCAxTXBUF 已准备好接收另一个字符。 如果 UCTXIE 和 GIE 也被置位、就会产生一个中断请求。 如果一个字符被写入 UCAxTXBUF、那么 UCTXIFG 会自动复位。 在一个 PUC 后或当 UCSWRST=1时、UCTXIFG 被置位。 在一个 PUC 后或当 UCSWRST=1时、UCTXIE 被复位。

这些问题是:
如果我没有使用中断, 我监测 UCTXIFG 标志,并且我没有尝试发送另一个字符,我只是清除 UCTXIFG 标志... 因为 UCAxTXBUF 仍然为空、UCTXIFG 会在之后被立即置位吗? 在这种情况下、可以肯定地说 UCTXIFG 和"UCAxTXBUF 为空"(假定存在这样一个信号)是互补的吗?

如果我正在使用中断,我正在使用 UCAIV 监测 UCTXIFG (我有 UCTXIE 和 GIE 设置)... 当 UCAxTXBUF 为空时、将生成一个中断。  我处理中断,但我不写入任何东西在 Tx 寄存器... 我可以预期 在我完成中断例程并返回到主程序后立即发生另一个 Tx 中断吗?

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

    我一直希望用户指南能更明确地说明这一点。 根据观察到的行为:UCTXIFG 表示 TX 缓冲区变为空的事件;它不是状态标志。 这意味着:

    1) 1) 如果您明确清除 UCTXIFG、它将在将另一个字节放入 TXBUF 并传递到移位寄存器之前不会返回。

    2) 2)读取 UCAIV (并恢复 UCTXIFG 指示器)会清除 UCTXIFG、因此这与上面的(1)相同。

    一个推论是,如果你做(1)或(2),你需要跟踪的事实 IFG 被设置(最近)。 我个人避免这样做--我要么写 TXBUF,要么清除 UCTXIE。

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

    串行发送中断总是很棘手的、通常需要一小段试错来弄明白。 已经有一段时间了、但是在查看我的代码(汇编代码)...

    读取 UCAIV 会清除中断源、因此如果您只是返回、将不会立即产生中断。 或者至少我的代码是这样编写的。

            .func txint
    txint:  pushm.w #3,r15          ; save registers used (r13-r15)
            mov     #txqueue,r15    ; get char from queue
            call    #dequeue
            tst     r15
            jn      txempty         ; queue empty?
            mov.b   r15,&UCA0TXBUF  ; no, transmit char
            jmp     txdone
    txempty:
    
    txdone: popm.w  #3,r15          ; restore registers
            reti
            .endfunc
      

    如果要发送新数据、这会使情况复杂化。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    2)读取 UCAIV (并取回 UCTXIFG 指示符)会清除 UCTXIFG,因此这与上面的(1)相同。

    我对此不是很确定。 自从我这么做已经有一段时间了、但是我的代码读取了 UCAIV。 发送字符(或放入 FIFO 队列)的代码会检查 TXIFG。 该代码起作用、似乎读取 UCAIV 会清除发送中断、但保持 TXIFG 置1。

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

    感谢您的快速响应。 我仍然认为我对这个问题没有深入的了解。 但我遵循此拇指规则:那里的 IV 向量用于处理 IFG 标志并提供到正确代码段的跳转(我使用 TI 使用 C 语言推荐的开关/案例模板)。 我允许这些提供的硬件 寄存器处理所有标志。 每次需要通过串行端口发送字符串时、我都要准备好要发送的数组和字符数、然后我启用 UCTXIE。 中断发生并且当我到达要发送的最后一个字符时、我禁用 UCTXIE 并在中断例程中将最后一个字符写入 Tx 缓冲器。 我独自离开 UCTXIFG。 当我需要发送另一个字符串时、我重复前面的过程并启用 UCTXIFG。

    此致  

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

    尊敬的 Carlos:

    我看到您向我们的 CSC 团队提交了另一个问题、但首先回答错误:

     I also tried to look for an example that uses UCAIV in the service routine and I found nothing clear. In the user manual, there is the Example 30-1 you can read
    
    switch(__even_in_range(UCA0IV,18))
    
     I don’t think the 18 is right. 0x08 is more like it (unless I’m wrong). There is no explanation for why this number is there, anyways.

    我在这里同意您的看法、这可能是 SDK 中该特定示例的拼写错误或疏忽。  

    switch (__even_in_range (UCA0IV、USCI_UART_UCTXCPTIFG)) 是典型用法、其中 USCI_UART_UCTXCPTIFG 是您期望看到的最高值中断矢量。  

    两个版本都可以使用、使用0x08只能使编译器的效率比使用18 (0x12)时高一点。  

    对于您最初提出的问题、请尽量直接回答这些问题、如果其他人也需要这些信息。  


    这些问题是:
    如果我没有使用中断, 我监测 UCTXIFG 标志,并且我没有尝试发送另一个字符,我只是清除 UCTXIFG 标志... 因为 UCAxTXBUF 仍然为空、UCTXIFG 会在之后被立即置位吗? 在这种情况下,可以说 UCTXIFG 和"UCAxTXBUF 为空"(假设存在这样的信号)是互补的吗?

    不、 就像 Bruce 说的那样、不应再次将 UCTXIFG 置位。 当 UCAxTXBUF 为另一个字符做好准备时、它被置位。 该值被 传输到发送移位寄存器时发生一次。  

    我不知道如果你没有利用中断、为什么你会想要清除 UCTXIFG、你可以将其保留在一边、当你准备好传输时、你就知道缓冲区之前已经准备好了。  

    如果我正在使用中断,我正在使用 UCAIV 来监控 UCTXIFG (我有 UCTXIE 和 GIE 设置)... 当 UCAxTXBUF 为空时、将生成一个中断。  我处理中断,但我不写入任何东西在 Tx 寄存器... 我可以预期 在我完成中断例程并返回到主程序后立即发生另一个 Tx 中断吗?

    不可以、如果你像在我们的大多数示例中那样在处理程序中打开 UCAxIV、那么你将清除缓冲区被清除时触发的 UCTXIFG、所以你将不会再得到另一个。

    当您准备好再次传输时、您 可以写入 UCATXIFG 以触发另一个中断。 您也可以在 ISR 中执行一些操作、例如禁用发送中断、设置 UCTXIFG、然后在您准备好再次开始处理发送中断时重新启用它。 如果我理解你在第二篇文章中的解释,这基本上就是你现在所做的。  

    此致、
    布兰登·费舍尔

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

    正如我刚才所说,我所做的工作(我在跟进过程中作了解释)是有效的。 我希望能够对该模块有一个清晰的了解。 实际上、当我使用 TM320系列和串行模块时、我遇到了一个类似的问题。 底线,事件设定的标志(在我的脑海中... 边沿而不是电平会设置标志)。 我也理解你的代码... 特定控制器的.h 文件为每个情况定义名称、而不是使用案例2、案例4等。 在大多数情况下,名称比数字更有意义,特别是当代码必须在一个月或几年后复审时。

    此致