清除STM32中的USART(UART)中断标志?


8

我正在使用STM32F105通过UART与Linx GPS芯片进行通信。

如果我不使用中断(如果我只是轮询RX标志),那么它将正常工作。但是当尝试使用中断时,我得到了意外的结果。

例如,如果仅使用启用RXNE(“ RX不为空”)中断USART_ITConfig(USARTx, USART_IT_RXNE),则该代码仅应针对该特定事件引导至ISR。但是,中断也会因溢出条件而触发。

至于清除标志,似乎方法取决于标志。为了清除溢出标志(USART_IT_ORE),用户手册说明我应该先读取USARTx_SR寄存器,然后再读取USARTx_DR寄存器。这确实有效;该标志被清除。

还有一个USART_ClearITPendingBit()功能,但是只接受一小部分标志。

有八个可以选择使能的中断源,以及十个不同的标志。 是否有关于如何管理所有这些标志的摘要?

Answers:


16

通常,您只需要处理已通过专门启用的中断标志USART_ITConfig()

但是,如果启用了RXNE中断(USART_ITConfig(USARTx, USART_IT_RXNE)),那么还将启用溢出中断!因此,您必须同时处理这两个问题。

内图

USART标志可能会造成混淆。有单独的状态标志和中断标志,它们共享相似的名称。例如:USART_IT_RXNEUSART_FLAG_RXNE

此外,还有多种清除这些标志的方法。例如,该USART_ClearITPendingBit()函数仅适用于十个可能的标志中的四个。

这是中断标志及其使用方法的摘要。这些特定于STM32F105,但具有代表性:


USART_IT_TXE- “发送数据寄存器为空”

  • 通话时自动清除 USART_SendData()

USART_IT_RXNE- “接收数据寄存器不为空”

  • 通话时自动清除 USART_ReceiveData(USARTx)

  • 可以通过调用手动清除 USART_ClearITPendingBit(USARTx, USART_IT_RXNE)


USART_IT_TC- “传输完成”

  • 它可以通过以下方式自动清除:

    • USART_GetITStatus(USARTx, USART_IT_TC) 其次是
    • USART_SendData()
  • 也可以通过调用手动清除它 USART_ClearITPendingBit(USARTx, USART_IT_TC)


USART_IT_CTS- “更改CTS”

  • 通过调用清除 USART_ClearITPendingBit(USARTx, USART_IT_CTS)

USART_IT_LBD- “检测到LIN中断”

  • 通过调用清除 USART_ClearITPendingBit(USARTx, USART_IT_LBD)

USART_IT_PE- “奇偶校验错误”

  • 清除者:
    • USART_GetITStatus(USARTx, USART_IT_PE) 其次是
    • USART_ReceiveData(USARTx)

USART_IT_NE- “噪音错误”

  • 清除者:
    • USART_GetITStatus(USARTx, USART_IT_NE) 其次是
    • USART_ReceiveData(USARTx)

USART_IT_ORE- “超限错误”

  • 清除者:
    • USART_GetITStatus(USARTx, USART_IT_ORE) 其次是
    • USART_ReceiveData(USARTx)()

USART_IT_IDLE- “检测到空闲线”

  • 清除者:
    • USART_GetITStatus(USARTx, USART_IT_IDLE) 其次是
    • USART_ReceiveData(USARTx)()

是的,我回答了我自己的问题:)如果我早先找到了这样的列表,那将为我节省大量时间。希望对您有所帮助!
bitsmack

2
这个答案是金;关于如何清除这些中断的非常清楚的参考。
jjmilburn

2

只是想补充一下我对这个问题的经验,请按照以下说明进行操作:

USART_IT_ORE-“超限错误”

已清除:USART_GetITStatus(USARTx,USART_IT_ORE),然后是USART_ReceiveData(USARTx)()

似乎不起作用,而是以下命令对我有用:

USART_GetFlagStatus(USARTx,USART_IT_ORE)后跟USART_ReceiveData(USARTx)

如果您查看这些功能:

USART_GetFlagStatus()和USART_ReceiveData()

您将找到Bitsmack之前确切写的内容……“首先读取USARTx_SR寄存器,然后读取USARTx_DR寄存器。”

希望它为您工作,并在此问题上节省更多时间。=)


感谢您的信息!我不认识USART_GetFlat()。你能告诉我它来自哪里吗?
–bitsmack

抱歉,我在命令上输入的错误,应该是USART_GetFlagStatus(),然后是USART_ReceiveData(),原始文章已得到纠正。谢谢Bitsmack。
LostInCoding

非常好,谢谢!函数名称似乎已更改。您正在使用标准外围设备库还是STMCube HAL之一?哪个微控制器系列?
–bitsmack
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.