STM32F4 Cube HAL UART. Đó là một lỗi hoặc tôi đang thiếu một cái gì đó?


9

Tôi đang sử dụng UART IO dựa trên ngắt (không có DMA).

HAL_UART_Transmit_ITHàm đặt EIEbit trong CR3thanh ghi. Theo biểu dữ liệu STM32F407 (và hành vi thực), điều này chỉ tạo ra ngắt trong chế độ đa bộ đệm (khi DMARbit được đặt). EIEcho phép tạo ngắt cho lỗi khung ( FE), lỗi tràn ( ORE), lỗi nhiễu ( NE). Lỗi này, theo tôi hiểu, chỉ để nhận.

Một phần của HAL_UART_IRQHandlerchức năng:

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_IRQHandlerkiểm tra từng lỗi. Nếu xảy ra lỗi và EIEbit được đặt, nó sẽ thiết lập lại trạng thái UART, nhưng không thiết lập lại các bit cho phép ngắt, do đó, TXEngắt sẽ luôn được tạo, nhưng UART_Transmit_ITchức năng coi trạng thái HAL_UART_STATE_READYlà không hợp lệ và không làm gì cả. Vòng lặp vô hạn.

Một phần của UART_Transmit_ITchức năng:

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;
  }
}

Có phải là một lỗi trong Cube HAL?


ba năm rưỡi sau và đây vẫn là một vấn đề
dùng8908459

Câu trả lời:


4

Đây là một lỗi.

Tôi đã hỏi cùng một câu hỏi trên diễn đàn ST: https://my.st.com/d5c15f59

Họ đã xác nhận nó.


Liên kết "my.st.com" yêu cầu đăng nhập. Tôi tìm thấy chủ đề này trên diễn đàn ST, mà tôi nghĩ là báo cáo về vấn đề này và có thể truy cập mà không cần đăng nhập, vì vậy độc giả có thể thấy rằng hữu ích.
SamGibson

0

Bạn đã thử tải xuống phiên bản Cube HAL mới nhất cho MCU của mình chưa?

Hàm HAL_UART_Transmit_IT () của tôi có vẻ rất khác so với hàm của bạn. Có thể bạn có một phiên bản cũ hơn với lỗi.

Hãy thử truy cập st.com và tìm kiếm phiên bản mới nhất của Cube HAL. Trong kho lưu trữ, bạn sẽ tìm thấy một số ví dụ với USART.


HAL_UART_Transmit_ITUART_Transmit_ITlà các chức năng khác nhau. Đầu tiên chỉ thiết lập các ngắt, trong khi thứ hai thực sự truyền dữ liệu
rublag

Có, nhưng bạn có biết rằng chức năng thứ hai chỉ có thể được gọi bởi chức năng HAL khác không trực tiếp bởi người dùng? Và tôi chỉ cần mở các tệp nguồn HAL của mình và tìm UART_Transmit_IT và nó khác với phần bạn dán ở trên. Tùy chọn khác nếu bạn vẫn nghĩ có lỗi là viết cùng một câu hỏi trên diễn đàn st.
Gabriel Rezende Germanovix
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.