আমি বাধা ভিত্তিক ইউআরটি আইও ব্যবহার করছি (কোনও ডিএমএ নেই)।
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বিট সেট করা থাকে তবে এটি ইউআরটি অবস্থা পুনরায় সেট করে, তবে বিঘ্ন সক্ষম সক্ষম বিটগুলি পুনরায় সেট করে না, তাই 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;
}
}
এটি কিউব এইচএল-তে কোনও বাগ আছে?