STM32F4 Cube HAL UART มันเป็นข้อบกพร่องหรือฉันหายไปบางอย่าง?


9

ฉันกำลังใช้ UART IO แบบขัดจังหวะ (ไม่มี DMA)

HAL_UART_Transmit_ITฟังก์ชั่นตั้งค่าEIEบิตในการCR3ลงทะเบียน ตามแผ่นข้อมูล STM32F407 (และลักษณะการทำงานจริง) สิ่งนี้จะสร้างการขัดจังหวะในโหมดมัลติบัฟเฟอร์เท่านั้น (เมื่อDMARตั้งค่าบิต) EIEช่วยให้การสร้างขัดจังหวะสำหรับข้อผิดพลาดของเฟรม ( FE), ข้อผิดพลาดเกิน ( ORE), ข้อผิดพลาดของเสียง ( NE) ข้อผิดพลาดนี้ตามที่ฉันเข้าใจเพียงเพื่อรับเท่านั้น

ส่วนหนึ่งของHAL_UART_IRQHandlerฟังก์ชั่น:

tmp1 = __HAL_UART_GET_FLAG(huart, UART_FLAG_ORE);
tmp2 = __HAL_UART_GET_IT_SOURCE(huart, UART_IT_ERR);
/* UART Over-Run interrupt occurred ----------------------------------------*/
if((tmp1 != RESET) && (tmp2 != RESET))
{ 
  __HAL_UART_CLEAR_OREFLAG(huart);

  huart->ErrorCode |= HAL_UART_ERROR_ORE;
}

if(huart->ErrorCode != HAL_UART_ERROR_NONE)
{
  /* Set the UART state ready to be able to start again the process */
  huart->State = HAL_UART_STATE_READY;

  HAL_UART_ErrorCallback(huart);
}  

HAL_UART_IRQHandlerตรวจสอบข้อผิดพลาดแต่ละรายการ หากเกิดข้อผิดพลาดและEIEบิตถูกตั้งค่าจะรีเซ็ตสถานะ UART แต่ไม่รีเซ็ตบิตการเปิดใช้งานการTXEขัดจังหวะดังนั้นการขัดจังหวะจะถูกสร้างขึ้นเสมอ แต่UART_Transmit_ITฟังก์ชันจะถือว่าสถานะHAL_UART_STATE_READYไม่ถูกต้องและไม่ได้ทำอะไรเลย วนไม่มีสิ้นสุด.

ส่วนหนึ่งของUART_Transmit_ITฟังก์ชั่น:

static HAL_StatusTypeDef UART_Transmit_IT(UART_HandleTypeDef *huart)
  {
  uint16_t* tmp;
  uint32_t tmp1 = 0;

  tmp1 = huart->State;
  if((tmp1 == HAL_UART_STATE_BUSY_TX) || (tmp1 == HAL_UART_STATE_BUSY_TX_RX))
  {
  }
  else
  {
    return HAL_BUSY;
  }
}

เป็นข้อบกพร่องใน Cube HAL หรือไม่?


สามปีครึ่งต่อมาและนี่ยังคงเป็นปัญหา
user8908459

คำตอบ:


4

มันเป็นข้อผิดพลาด

ฉันถามคำถามเดียวกันในฟอรัม ST: https://my.st.com/d5c15f59

พวกเขายืนยันมัน


ลิงก์ "my.st.com" ต้องมีการเข้าสู่ระบบ ฉันพบกระทู้นี้ในฟอรัม ST ซึ่งฉันคิดว่าเป็นการรายงานปัญหานี้และสามารถเข้าถึงได้โดยไม่ต้องลงชื่อเข้าใช้ดังนั้นผู้อ่านอาจพบว่ามีประโยชน์
SamGibson

0

คุณพยายามดาวน์โหลด Cube HAL รุ่นล่าสุดสำหรับ MCU ของคุณหรือไม่

ฟังก์ชั่น HAL_UART_Transmit_IT ของฉันดูเหมือนจะแตกต่างจากของคุณ บางทีคุณอาจมีข้อบกพร่องรุ่นเก่ากว่า

ลองเข้าถึง st.com และค้นหา Cube HAL เวอร์ชันล่าสุด ภายในคลังข้อมูลคุณจะพบตัวอย่างกับ USART


HAL_UART_Transmit_ITและUART_Transmit_ITฟังก์ชั่นที่แตกต่างกัน ครั้งแรกเท่านั้นที่ตั้งค่าการขัดจังหวะในขณะที่สองจริงส่งข้อมูล
rublag

ใช่ แต่คุณรู้ว่าฟังก์ชั่นที่สองสามารถเรียกได้โดยฟังก์ชั่น HAL อื่นเท่านั้นที่ไม่ได้เป็นผู้ใช้โดยตรง? และฉันเพิ่งเปิดไฟล์ต้นฉบับ HAL และค้นหา UART_Transmit_IT และแตกต่างจากส่วนที่คุณวางไว้ด้านบน ตัวเลือกอื่น ๆ ถ้าคุณยังคิดว่ามีข้อผิดพลาดคือการเขียนคำถามเดียวกันบนเวทีสนทนา
Gabriel Rezende Germanovix
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.