मैं रुकावट आधारित UART IO (नो डीएमए) का उपयोग कर रहा हूं।
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;
}
}
क्या यह घन एचएएल में एक बग है?