Xóa cờ ngắt USART (UART) trong STM32?


8

Tôi đang sử dụng STM32F105 để liên lạc với chip Linx GPS bằng UART.

Nếu tôi không sử dụng ngắt (nếu tôi chỉ thăm dò cờ RX) thì nó hoạt động tốt. Nhưng tôi nhận được kết quả bất ngờ khi cố gắng sử dụng ngắt.

Ví dụ: nếu tôi chỉ kích hoạt ngắt RXNE ("RX không trống") USART_ITConfig(USARTx, USART_IT_RXNE), thì mã chỉ nên chuyển sang ISR cho một sự kiện cụ thể này. Nhưng ngắt cũng được kích hoạt cho một điều kiện tràn ngập.

Theo như xóa cờ, có vẻ như phương pháp này phụ thuộc vào cờ. Để xóa cờ tràn ( USART_IT_ORE), Hướng dẫn sử dụng giải thích rằng trước tiên tôi nên đọc thanh USARTx_SRghi, sau đó đọc thanh USARTx_DRghi. Điều này không hoạt động; cờ được xóa

Ngoài ra còn có một USART_ClearITPendingBit()chức năng, nhưng nó chỉ chấp nhận một tập hợp nhỏ các cờ.

Có tám nguồn ngắt khác nhau có thể được kích hoạt có chọn lọc và mười cờ khác nhau. Có một bản tóm tắt ở đâu đó về cách quản lý tất cả các cờ này?

Câu trả lời:


16

Nói chung, bạn chỉ cần xử lý các cờ ngắt mà bạn đã bật cụ thể USART_ITConfig().

Tuy nhiên, nếu bạn kích hoạt ngắt RXNE ( USART_ITConfig(USARTx, USART_IT_RXNE)) thì điều này cũng cho phép ngắt tràn! Vì vậy, bạn phải xử lý cả hai.

intmap

Các cờ USART có thể gây nhầm lẫn. Có cờ trạng thái riêng và cờ ngắt và chúng chia sẻ tên tương tự. Ví dụ: USART_IT_RXNEUSART_FLAG_RXNE.

Ngoài ra, có nhiều phương pháp khác nhau để xóa những lá cờ này. Ví dụ, USART_ClearITPendingBit()hàm chỉ hoạt động cho bốn (trong số mười) cờ có thể.

Dưới đây là tóm tắt về các cờ ngắt và cách sử dụng chúng. Đây là những đặc trưng cho STM32F105, nhưng là đại diện:


USART_IT_TXE - "Truyền dữ liệu đăng ký trống"

  • Nó sẽ tự động bị xóa khi gọi USART_SendData()

USART_IT_RXNE - "Nhận đăng ký dữ liệu không trống"

  • Nó sẽ tự động bị xóa khi gọi USART_ReceiveData(USARTx)

  • Nó có thể được xóa bằng tay bằng cách gọi USART_ClearITPendingBit(USARTx, USART_IT_RXNE)


USART_IT_TC - "Truyền hoàn tất"

  • Nó được xóa tự động bởi:

    • USART_GetITStatus(USARTx, USART_IT_TC) theo dõi bởi
    • USART_SendData()
  • Nó cũng có thể được xóa bằng tay bằng cách gọi USART_ClearITPendingBit(USARTx, USART_IT_TC)


USART_IT_CTS - "Thay đổi CTS"

  • Xóa bằng cách gọi USART_ClearITPendingBit(USARTx, USART_IT_CTS)

USART_IT_LBD - "Đã phát hiện phá vỡ LIN"

  • Xóa bằng cách gọi USART_ClearITPendingBit(USARTx, USART_IT_LBD)

USART_IT_PE - "Lỗi chẵn lẻ"

  • Xóa bởi:
    • USART_GetITStatus(USARTx, USART_IT_PE) theo dõi bởi
    • USART_ReceiveData(USARTx)

USART_IT_NE - "Lỗi tiếng ồn"

  • Xóa bởi:
    • USART_GetITStatus(USARTx, USART_IT_NE) theo dõi bởi
    • USART_ReceiveData(USARTx)

USART_IT_ORE - "Lỗi tràn ngập"

  • Xóa bởi:
    • USART_GetITStatus(USARTx, USART_IT_ORE) theo dõi bởi
    • USART_ReceiveData(USARTx)()

USART_IT_IDLE - "Đã phát hiện dòng nhàn rỗi"

  • Xóa bởi:
    • USART_GetITStatus(USARTx, USART_IT_IDLE) theo dõi bởi
    • USART_ReceiveData(USARTx)()

Đúng, tôi đã trả lời câu hỏi của riêng mình :) Nếu tôi đã tìm thấy một danh sách như thế này sớm hơn, nó sẽ giúp tôi tiết kiệm được một khoảng thời gian tốt. Tôi hi vọng nó giúp ích cho ai đó!
bitsmack

2
Câu trả lời này là vàng; tài liệu tham khảo rất rõ ràng về cách xóa từng ngắt này.
jjmilburn

2

Chỉ muốn thêm một số kinh nghiệm của tôi về vấn đề này, tôi làm theo hướng dẫn:

USART_IT_ORE - "Lỗi tràn ngập"

Đã bị xóa bởi: USART_GetITStatus (USARTx, USART_IT_ORE) theo sau là USART_ReceiveData (USARTx) ()

Có vẻ như không hoạt động, và lệnh sau đây làm việc cho tôi:

USART_GetFlagStatus (USARTx, USART_IT_ORE) theo sau là USART_ReceiveData (USARTx)

Nếu bạn nhìn vào các chức năng:

USART_GetFlagStatus () và USART_ReceiveData ()

Bạn sẽ tìm thấy chính xác những gì Bitsmack đã viết trước đó ... "Đầu tiên hãy đọc thanh ghi USARTx_SR, sau đó đọc thanh ghi USARTx_DR."

Hy vọng nó hiệu quả với bạn và tiết kiệm nhiều thời gian hơn cho vấn đề này. =)


Cảm ơn thông tin của bạn! Tôi không nhận ra USART_GetFlat (). Bạn có thể cho tôi biết nó đến từ đâu?
bitsmack

Tôi xin lỗi vì tôi đã gõ sai lệnh, nó phải là USART_GetFlagStatus () theo sau là USART_ReceiveData (), bài viết gốc đã được sửa. Cảm ơn Bitsmack.
LostInCoding

Tuyệt vời cảm ơn bạn! Có vẻ như các tên chức năng đã thay đổi. Bạn có đang sử dụng Thư viện ngoại vi tiêu chuẩn hoặc một trong các STMCube HAL không? Đối với gia đình của vi điều khiển?
bitsmack
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.