ฉันได้ใช้ STM32CubeMx / HAL ในสองโครงการในขณะนี้และพบว่าซอฟต์แวร์การจัดการ UART ที่สร้างขึ้นนั้นมีข้อบกพร่องที่ชัดเจนในด้านการรับ
ในการส่งสัญญาณปกติแล้วคุณจะต้องการส่งบล็อคข้อมูลหรือบรรทัดข้อความ ในกรณีนี้คุณรู้ล่วงหน้าว่าการถ่ายโอนข้อมูลนานแค่ไหนดังนั้นการใช้ DMA จึงเป็นทางออกที่ชัดเจน คุณได้รับการขัดจังหวะเมื่อการถ่ายโอนเสร็จสมบูรณ์และสามารถใช้ฟังก์ชั่นการโทรกลับที่สมบูรณ์แบบของ UART TX เพื่อระบุรหัสหลักของคุณว่าการส่งสัญญาณเสร็จสมบูรณ์และคุณสามารถส่งข้อมูลบล็อกอื่นได้
เมื่อพูดถึงการรับข้อมูลฟังก์ชั่นที่จัดทำโดย ST ทุกคนคิดว่าคุณรู้จำนวนตัวอักษรที่อุปกรณ์ส่งจะให้คุณก่อนที่จะเริ่มส่ง โดยปกติจะไม่เป็นที่รู้จัก ฟังก์ชันการขัดจังหวะจะวางข้อมูลที่ได้รับลงในบัฟเฟอร์และระบุว่ามีข้อมูลที่พร้อมใช้งานเมื่อได้รับจำนวนอักขระที่กำหนดไว้ล่วงหน้า หากคุณพยายามใช้ DMA หรือฟังก์ชั่นขัดจังหวะเพื่อรับข้อมูลโดยการตั้งค่าการถ่ายโอนอักขระเดี่ยวตามลำดับเวลาในการตั้งค่าสำหรับแต่ละสิ่งเหล่านี้จะหมายถึงว่าคุณจะสูญเสียอักขระไปอย่างอื่นนอกเหนือจากอัตราข้อมูลที่ช้าที่สุด เริ่มต้นที่จะสูญเสียข้อมูลจะขึ้นอยู่กับความเร็วสัญญาณนาฬิกาของโปรเซสเซอร์ของคุณ) และจะโหลดโปรเซสเซอร์มากเกินไปโดยไม่ทิ้งรอบการสอนสำหรับการประมวลผลอื่น ๆ
ในการปัดเศษนี้ฉันได้เขียนฟังก์ชันตัวจัดการขัดจังหวะของตัวเองที่เก็บข้อมูลในบัฟเฟอร์วงกลมขนาดเล็กในท้องถิ่นและตั้งค่าจำนวนที่อ่านโดยรหัสหลัก (RTOS นับสัญญาณสัญญาณ) เพื่อระบุว่ามีข้อมูลที่ได้รับพร้อม รหัสหลักสามารถรวบรวมข้อมูลจากบัฟเฟอร์นี้ในเวลาว่างมันไม่สำคัญว่ามีความล่าช้าในการรวบรวมข้อมูลโดยที่บัฟเฟอร์ท้องถิ่นไม่ล้นก่อนที่จะมีการรวบรวมข้อมูล