ฉันกำลังใช้ 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 หรือไม่?