2015-06-10 39 views
5

Tôi đang cố gắng liên lạc với thiết bị ngoại vi UART bằng DMA cho cả RX và TX. Tôi đang sử dụng thư viện HAL được cung cấp bởi ST (Được tạo bằng STCubeMX).STM32F4 Xử lý lỗi ngoại vi trong khi thực hiện Chuyển DMA (RX)

Tôi đang xử lý kênh UART với 1,5MBaud - để không mất bất kỳ dữ liệu nào, tôi đã định cấu hình DMA ở chế độ trực tiếp, với bộ đệm tròn và xử lý ngắt chuyển giao một nửa để quản lý dữ liệu và giữ DMA trực tuyến để có nhiều dữ liệu hơn.

Vấn đề là đôi khi tôi có thể thấy trong Thanh ghi trạng thái của UART rằng bit Lỗi khung hình bật và đôi khi cờ Lỗi quá mức cũng bật.

Tôi có thể xử lý các byte bị mất (sử dụng crc trên các gói có cấu trúc), nhưng vấn đề là thiết bị ngoại vi dừng nhận dữ liệu - nhưng DMA không tăng lỗi hoặc ngừng chuyển.

Vì vậy, nếu tôi cố gắng nhận dữ liệu và cờ đang treo trên hệ thống.

Tôi thấy rằng HAL cung cấp hàm __weak sẽ xử lý UART_Error, nhưng nó không bao giờ được gọi - và trạng thái trong xử lý HAL vẫn bình thường. chỉ có một cái nhìn tại sổ đăng ký có thể nói rằng có một vấn đề.

Tôi nên phát hiện/xử lý các loại lỗi này như thế nào?

Cảm ơn

Trả lời

2

Tôi không sử dụng HAL vì lý do hiệu suất, vì nó là rất vụng về và - imo cũng không cung cấp nhiều trừu tượng để biện minh đó. Xử lý phần cứng trực tiếp không phức tạp hơn nhiều; thậm chí nhiều hơn khi bạn vẫn phải hiểu rất rõ những gì diễn ra. Và như bạn đã phát hiện, HAL chỉ hỗ trợ một cách tiếp cận nhất định; một khi bạn đi theo con đường mòn của riêng bạn, bạn sẽ bị lạc.

Bạn dường như có các vấn đề tương tự khi cờ tràn được đặt. Sau một lỗi như vậy, bạn phải đồng bộ hóa lại máy thu với bộ phát phát trực tiếp sau một lỗi nói chung. Điều đó đòi hỏi tín hiệu ngoài băng tần sử dụng một biểu tượng hoặc điều kiện dòng không xảy ra trong một gói. Lỗi khung là một chỉ báo tốt có vấn đề để đồng bộ hóa với sự bắt đầu của một biểu tượng (bắt đầu-bit) đúng cách.

Nếu dòng là sạch (không phải vấn đề EMC), không nên có lỗi khung hoặc tham nhũng dữ liệu (trừ khi thông số thời gian không khớp).

Nếu sử dụng bàn bóng bàn đơn giản, thời gian chờ có thể là đủ. Tuy nhiên, tha giải pháp thích hợp phụ thuộc vào giao thức. Một thiết kế giao thức tốt có lỗi truyền tải và tràn vào tài khoản.

Lưu ý rằng bạn phải bật ngắt nhận được lỗi ngoài chuyển DMA để được thông báo. Tuy nhiên, nếu bạn sử dụng một thời gian chờ (và một giao thức ping-pong), bạn chỉ có thể xóa các lá cờ, vì dữ liệu dường như không đến đúng lúc. Nếu thực sự sử dụng các ngắt lỗi cũng phải biết về điều kiện chủng tộc.

Các vấn đề liên quan