2025-01-21 03:03 AM - last edited on 2025-01-21 03:13 AM by Andrew Neil
Hello,
I am using the STM32H7S78-DK board and STM32CubeIDE for development. In my application, I am working with UART communication between UART4 and UART7.
Despite implementing HAL_UARTEx_ReceiveToIdle_IT, I am still unable to receive any response from UART7.
Here is my code for reference,
/* USER CODE BEGIN PV */
#define RX_BUFFER_SIZE 20
#define RX_BUFFER_SIZE_7 50
uint8_t rxBuffer[RX_BUFFER_SIZE] = {0}; // Buffer to store received data
uint8_t rxBuffer7[RX_BUFFER_SIZE_7] = {0}; // Buffer to store received data
osThreadId_t uartTaskHandle;
const osThreadAttr_t uartTask_attributes =
{
.name = "uartTask",
.priority = (osPriority_t)osPriorityNormal,
.stack_size = 512 * 4,
};
void UART_Print(const char* message)
{
// Transmit the string data over UART
HAL_UART_Transmit(&huart4, (uint8_t*)message, strlen(message), HAL_MAX_DELAY);
}
void SendDataOnUART7(uint8_t *pData)
{
uint8_t TxData[20];
uint16_t length = (uint16_t)pData[0];
memcpy(TxData, &pData[1],length);
// Transmit the string data over UART
HAL_UART_Transmit(&huart7,TxData, length, HAL_MAX_DELAY);
}
void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size)
{
if (huart->Instance == huart7.Instance)
{
// Transmit the string data over UART
printf("Received data on uart7: %s\n\r", rxBuffer7);
HAL_UARTEx_ReceiveToIdle_IT(&huart7, rxBuffer7, RX_BUFFER_SIZE_7);
}
}
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
if (huart->Instance == huart4.Instance)
{
// Print received message
printf("Received: %s\n\r", rxBuffer);
SendDataOnUART7(rxBuffer);
memset(rxBuffer, 0, RX_BUFFER_SIZE);
// Re-enable UART interrupt for the full buffer to receive more data
HAL_UART_Receive_IT(&huart4, rxBuffer, RX_BUFFER_SIZE);
}
}
/**
* @brief The application entry point.
* @retval int
*/
int main(void)
{
/* USER CODE BEGIN 1 */
/* USER CODE END 1 */
/* MPU Configuration--------------------------------------------------------*/
MPU_Config();
/* Enable the CPU Cache */
/* Enable I-Cache---------------------------------------------------------*/
SCB_EnableICache();
/* Enable D-Cache---------------------------------------------------------*/
SCB_EnableDCache();
/* MCU Configuration--------------------------------------------------------*/
/* Update SystemCoreClock variable according to RCC registers values. */
SystemCoreClockUpdate();
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
MX_GPIO_Init();
MX_HPDMA1_Init();
MX_LTDC_Init();
MX_CRC_Init();
MX_DMA2D_Init();
MX_JPEG_Init();
MX_FLASH_Init();
MX_I2C1_Init();
MX_GPU2D_Init();
MX_ICACHE_GPU2D_Init();
MX_UART4_Init();
MX_UART7_Init();
UART_Print("Start...TouchGFX...Project\n\r");
printf("Hello_STM32H7S78-DK!\n\r");
/* Enable UART4 interrupt mode */
//Make sure that the data sent is exactly 20 bytes, as the RX_BUFFER_SIZE is set to 20. If the data is not 20 bytes, it will not work properly!
HAL_UART_Receive_IT(&huart4, rxBuffer, RX_BUFFER_SIZE);
HAL_UARTEx_ReceiveToIdle_IT(&huart7, rxBuffer7, RX_BUFFER_SIZE_7);
MX_TouchGFX_Init();
/* Call PreOsInit function */
MX_TouchGFX_PreOSInit();
osKernelInitialize();
defaultTaskHandle = osThreadNew(StartDefaultTask, NULL, &defaultTask_attributes);
/* creation of TouchGFXTask */
TouchGFXTaskHandle = osThreadNew(TouchGFX_Task, NULL, &TouchGFXTask_attributes);
uartTaskHandle = osThreadNew(UART_Task, NULL, &uartTask_attributes);
/* Start scheduler */
osKernelStart();
while (1)
{
}
/* USER CODE END 3 */
}
I would appreciate any guidance or example code to resolve this issue.
Best regards,
Mehul
2025-01-21 01:03 PM