Skip to main content
Senior
March 1, 2024
Solved

UART not working as expected

  • March 1, 2024
  • 4 replies
  • 2889 views

Hi,

When I run the below code, I get the result on serial console as in below image which is not as expected. Could you please let me know what I am missing here ?

 

demir_1-1709326501923.png

 

 

demir_0-1709325904032.png

int main(void)
{
 /* USER CODE BEGIN 1 */

	DWT->CTRL |=(1<<0);

 /* USER CODE END 1 */

 /* MCU Configuration--------------------------------------------------------*/

 /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
 HAL_Init();

 /* USER CODE BEGIN Init */

 /* USER CODE END Init */

 /* Configure the system clock */
 SystemClock_Config();

 /* USER CODE BEGIN SysInit */

 /* USER CODE END SysInit */

 /* Initialize all configured peripherals */
 MX_GPIO_Init();
 MX_USART2_UART_Init();
 /* USER CODE BEGIN 2 */

SEGGER_UART_init(250000);

 SEGGER_SYSVIEW_Conf();
 //SEGGER_SYSVIEW_Start();



 uint8_t data[]= "message \r\n";
 //sprintf(usr_msg,"demo of binary semaphore usage between 2 tasks\r\n");
 HAL_UART_Transmit(&huart2, data,sizeof(data),HAL_MAX_DELAY);

 

 

    This topic has been closed for replies.
    Best answer by floatsky

    You have only one uart, but you initialize it twice:

     MX_USART2_UART_Init();
     /* USER CODE BEGIN 2 */
    
    SEGGER_UART_init(250000);

    Note that "MX_USART2_UART_Init()" has initialized the uart with baudrate 115200.

    Then "SEGGER_UART_init(250000)"  does this again but with baudrate 250000.

    Delete the call to SEGGER_UART_init. And try again.

    4 replies

    Tesla DeLorean
    Guru
    March 1, 2024

    Either you have the settings wrong for baud rate, or wrong HSE_VALUE

    For strings use strlen() or sizeof()-1 to not send the NUL over the wire

     

    Tips, Buy me a coffee, or three.. PayPal Venmo (See Profile) Up vote any posts that you find helpful, it shows what's working..
    demirAuthor
    Senior
    March 2, 2024

    I am using HSI as shown in below image.

    demir_0-1709359129336.png

    The baudrate should also be OK.

    demir_1-1709359192243.png

    I am using FreeRTOS in my application. May it be causing the issue ?

    Please see the full code below. Thank you.

    /* USER CODE BEGIN Header */
    /**
     ******************************************************************************
     * @file : main.c
     * @brief : Main program body
     ******************************************************************************
     * @attention
     *
     * Copyright (c) 2024 STMicroelectronics.
     * All rights reserved.
     *
     * This software is licensed under terms that can be found in the LICENSE file
     * in the root directory of this software component.
     * If no LICENSE file comes with this software, it is provided AS-IS.
     *
     ******************************************************************************
     */
    /* USER CODE END Header */
    /* Includes ------------------------------------------------------------------*/
    #include "main.h"
    
    /* Private includes ----------------------------------------------------------*/
    /* USER CODE BEGIN Includes */
    #include "FreeRTOS.h"
    #include "task.h"
    #include "semphr.h"
    #include "queue.h"
    #include <string.h>
    #include <stdio.h>
    #include "SEGGER_SYSVIEW.h"
    #include <stdlib.h>
    
    /* USER CODE END Includes */
    
    /* Private typedef -----------------------------------------------------------*/
    /* USER CODE BEGIN PTD */
    
    /* USER CODE END PTD */
    
    /* Private define ------------------------------------------------------------*/
    /* USER CODE BEGIN PD */
    
    #define DWT_CTRL (*(volatile uint32_t*)0xE0001000)
    
    /* USER CODE END PD */
    
    /* Private macro -------------------------------------------------------------*/
    /* USER CODE BEGIN PM */
    
    /* USER CODE END PM */
    
    /* Private variables ---------------------------------------------------------*/
    UART_HandleTypeDef huart2;
    
    /* USER CODE BEGIN PV */
    
    TaskHandle_t xTaskHandleM = NULL;
    TaskHandle_t xTaskHandleE =NULL;
    
    char usr_msg[250] = {0};
    
    xSemaphoreHandle xWork;
    xQueueHandle xWorkQueue;
    
    /* USER CODE END PV */
    
    /* Private function prototypes -----------------------------------------------*/
    void SystemClock_Config(void);
    static void MX_GPIO_Init(void);
    static void MX_USART2_UART_Init(void);
    /* USER CODE BEGIN PFP */
    
    static void vManagerTask(void *pvParameters);
    static void vEmployeeTask(void *pvParameters);
    void printmsg(char *msg);
    
    /* USER CODE END PFP */
    extern void SEGGER_UART_init(uint32_t baud);
    
    /* Private user code ---------------------------------------------------------*/
    /* USER CODE BEGIN 0 */
    
    
    /* USER CODE END 0 */
    
    /**
     * @brief The application entry point.
     * @retval int
     */
    int main(void)
    {
     /* USER CODE BEGIN 1 */
    
    	DWT->CTRL |=(1<<0);
    
     /* USER CODE END 1 */
    
     /* MCU Configuration--------------------------------------------------------*/
    
     /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
     HAL_Init();
    
     /* USER CODE BEGIN Init */
    
     /* USER CODE END Init */
    
     /* Configure the system clock */
     SystemClock_Config();
    
     /* USER CODE BEGIN SysInit */
    
     /* USER CODE END SysInit */
    
     /* Initialize all configured peripherals */
     MX_GPIO_Init();
     MX_USART2_UART_Init();
     /* USER CODE BEGIN 2 */
    
    SEGGER_UART_init(250000);
    
     SEGGER_SYSVIEW_Conf();
     //SEGGER_SYSVIEW_Start();
    
    
    
    
     sprintf(usr_msg,"demo of binary semaphore usage between 2 tasks\r\n");
    
    printmsg(usr_msg);
    
     //create semaphore
    
     vSemaphoreCreateBinary(xWork);
    
     //crate queue to hold maximum of 1 element
    
     xWorkQueue = xQueueCreate(1,sizeof(unsigned int));
    
     //check semaphore and queue created successfully
    
     if((xWork!=NULL)&&(xWorkQueue!=NULL))
    
     {
    	 /*create manager task. This task will be synchronized with the employee task. The manager task is created with a high priority*/
    
    	 xTaskCreate(vManagerTask,"Manager",500, NULL,3, NULL);
    
    	 /*Create employee task with less priority than manager*/
    
    	 xTaskCreate(vEmployeeTask,"Employee",500,NULL,1,NULL);
    
    	 /*Start the scheduler*/
    
    	 vTaskStartScheduler();
     }
    
     else
     {
    	 sprintf(usr_msg,"Queue/sema crate failed..\r\n");
    	 printmsg(usr_msg);
     }
    
    
    
     /* USER CODE END 2 */
    
     /* Infinite loop */
     /* USER CODE BEGIN WHILE */
     while (1)
     {
     /* USER CODE END WHILE */
    
     /* USER CODE BEGIN 3 */
     }
     /* USER CODE END 3 */
    }
    
    /**
     * @brief System Clock Configuration
     * @retval None
     */
    void SystemClock_Config(void)
    {
     RCC_OscInitTypeDef RCC_OscInitStruct = {0};
     RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
    
     /** Configure the main internal regulator output voltage
     */
     __HAL_RCC_PWR_CLK_ENABLE();
     __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
    
     /** Initializes the RCC Oscillators according to the specified parameters
     * in the RCC_OscInitTypeDef structure.
     */
     RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
     RCC_OscInitStruct.HSIState = RCC_HSI_ON;
     RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
     RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
     RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI;
     RCC_OscInitStruct.PLL.PLLM = 8;
     RCC_OscInitStruct.PLL.PLLN = 168;
     RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;
     RCC_OscInitStruct.PLL.PLLQ = 7;
     if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
     {
     Error_Handler();
     }
    
     /** Initializes the CPU, AHB and APB buses clocks
     */
     RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
     |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
     RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
     RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
     RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4;
     RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2;
    
     if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5) != HAL_OK)
     {
     Error_Handler();
     }
    }
    
    /**
     * @brief USART2 Initialization Function
     * @PAram None
     * @retval None
     */
    static void MX_USART2_UART_Init(void)
    {
    
     /* USER CODE BEGIN USART2_Init 0 */
    
     /* USER CODE END USART2_Init 0 */
    
     /* USER CODE BEGIN USART2_Init 1 */
    
     /* USER CODE END USART2_Init 1 */
     huart2.Instance = USART2;
     huart2.Init.BaudRate = 115200;
     huart2.Init.WordLength = UART_WORDLENGTH_8B;
     huart2.Init.StopBits = UART_STOPBITS_1;
     huart2.Init.Parity = UART_PARITY_NONE;
     huart2.Init.Mode = UART_MODE_TX_RX;
     huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE;
     huart2.Init.OverSampling = UART_OVERSAMPLING_16;
     if (HAL_UART_Init(&huart2) != HAL_OK)
     {
     Error_Handler();
     }
     /* USER CODE BEGIN USART2_Init 2 */
    
     /* USER CODE END USART2_Init 2 */
    
    }
    
    /**
     * @brief GPIO Initialization Function
     * @PAram None
     * @retval None
     */
    static void MX_GPIO_Init(void)
    {
     GPIO_InitTypeDef GPIO_InitStruct = {0};
    /* USER CODE BEGIN MX_GPIO_Init_1 */
    /* USER CODE END MX_GPIO_Init_1 */
    
     /* GPIO Ports Clock Enable */
     __HAL_RCC_GPIOE_CLK_ENABLE();
     __HAL_RCC_GPIOC_CLK_ENABLE();
     __HAL_RCC_GPIOH_CLK_ENABLE();
     __HAL_RCC_GPIOA_CLK_ENABLE();
     __HAL_RCC_GPIOB_CLK_ENABLE();
     __HAL_RCC_GPIOD_CLK_ENABLE();
    
     /*Configure GPIO pin Output Level */
     HAL_GPIO_WritePin(CS_I2C_SPI_GPIO_Port, CS_I2C_SPI_Pin, GPIO_PIN_RESET);
    
     /*Configure GPIO pin Output Level */
     HAL_GPIO_WritePin(OTG_FS_PowerSwitchOn_GPIO_Port, OTG_FS_PowerSwitchOn_Pin, GPIO_PIN_SET);
    
     /*Configure GPIO pin Output Level */
     HAL_GPIO_WritePin(GPIOD, GreenLED_Pin|OrangeLED_Pin|RedLED_Pin|BlueLED_Pin
     |Audio_RST_Pin, GPIO_PIN_RESET);
    
     /*Configure GPIO pin : CS_I2C_SPI_Pin */
     GPIO_InitStruct.Pin = CS_I2C_SPI_Pin;
     GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
     GPIO_InitStruct.Pull = GPIO_NOPULL;
     GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
     HAL_GPIO_Init(CS_I2C_SPI_GPIO_Port, &GPIO_InitStruct);
    
     /*Configure GPIO pin : OTG_FS_PowerSwitchOn_Pin */
     GPIO_InitStruct.Pin = OTG_FS_PowerSwitchOn_Pin;
     GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
     GPIO_InitStruct.Pull = GPIO_NOPULL;
     GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
     HAL_GPIO_Init(OTG_FS_PowerSwitchOn_GPIO_Port, &GPIO_InitStruct);
    
     /*Configure GPIO pin : PDM_OUT_Pin */
     GPIO_InitStruct.Pin = PDM_OUT_Pin;
     GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
     GPIO_InitStruct.Pull = GPIO_NOPULL;
     GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
     GPIO_InitStruct.Alternate = GPIO_AF5_SPI2;
     HAL_GPIO_Init(PDM_OUT_GPIO_Port, &GPIO_InitStruct);
    
     /*Configure GPIO pin : B1_Pin */
     GPIO_InitStruct.Pin = B1_Pin;
     GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING;
     GPIO_InitStruct.Pull = GPIO_NOPULL;
     HAL_GPIO_Init(B1_GPIO_Port, &GPIO_InitStruct);
    
     /*Configure GPIO pin : I2S3_WS_Pin */
     GPIO_InitStruct.Pin = I2S3_WS_Pin;
     GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
     GPIO_InitStruct.Pull = GPIO_NOPULL;
     GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
     GPIO_InitStruct.Alternate = GPIO_AF6_SPI3;
     HAL_GPIO_Init(I2S3_WS_GPIO_Port, &GPIO_InitStruct);
    
     /*Configure GPIO pins : SPI1_SCK_Pin SPI1_MISO_Pin SPI1_MOSI_Pin */
     GPIO_InitStruct.Pin = SPI1_SCK_Pin|SPI1_MISO_Pin|SPI1_MOSI_Pin;
     GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
     GPIO_InitStruct.Pull = GPIO_NOPULL;
     GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
     GPIO_InitStruct.Alternate = GPIO_AF5_SPI1;
     HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
    
     /*Configure GPIO pin : BOOT1_Pin */
     GPIO_InitStruct.Pin = BOOT1_Pin;
     GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
     GPIO_InitStruct.Pull = GPIO_NOPULL;
     HAL_GPIO_Init(BOOT1_GPIO_Port, &GPIO_InitStruct);
    
     /*Configure GPIO pin : CLK_IN_Pin */
     GPIO_InitStruct.Pin = CLK_IN_Pin;
     GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
     GPIO_InitStruct.Pull = GPIO_NOPULL;
     GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
     GPIO_InitStruct.Alternate = GPIO_AF5_SPI2;
     HAL_GPIO_Init(CLK_IN_GPIO_Port, &GPIO_InitStruct);
    
     /*Configure GPIO pins : GreenLED_Pin OrangeLED_Pin RedLED_Pin BlueLED_Pin
     Audio_RST_Pin */
     GPIO_InitStruct.Pin = GreenLED_Pin|OrangeLED_Pin|RedLED_Pin|BlueLED_Pin
     |Audio_RST_Pin;
     GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
     GPIO_InitStruct.Pull = GPIO_NOPULL;
     GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
     HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);
    
     /*Configure GPIO pins : I2S3_MCK_Pin I2S3_SCK_Pin I2S3_SD_Pin */
     GPIO_InitStruct.Pin = I2S3_MCK_Pin|I2S3_SCK_Pin|I2S3_SD_Pin;
     GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
     GPIO_InitStruct.Pull = GPIO_NOPULL;
     GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
     GPIO_InitStruct.Alternate = GPIO_AF6_SPI3;
     HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
    
     /*Configure GPIO pin : VBUS_FS_Pin */
     GPIO_InitStruct.Pin = VBUS_FS_Pin;
     GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
     GPIO_InitStruct.Pull = GPIO_NOPULL;
     HAL_GPIO_Init(VBUS_FS_GPIO_Port, &GPIO_InitStruct);
    
     /*Configure GPIO pins : OTG_FS_ID_Pin OTG_FS_DM_Pin OTG_FS_DP_Pin */
     GPIO_InitStruct.Pin = OTG_FS_ID_Pin|OTG_FS_DM_Pin|OTG_FS_DP_Pin;
     GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
     GPIO_InitStruct.Pull = GPIO_NOPULL;
     GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
     GPIO_InitStruct.Alternate = GPIO_AF10_OTG_FS;
     HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
    
     /*Configure GPIO pin : OTG_FS_OverCurrent_Pin */
     GPIO_InitStruct.Pin = OTG_FS_OverCurrent_Pin;
     GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
     GPIO_InitStruct.Pull = GPIO_NOPULL;
     HAL_GPIO_Init(OTG_FS_OverCurrent_GPIO_Port, &GPIO_InitStruct);
    
     /*Configure GPIO pins : Audio_SCL_Pin Audio_SDA_Pin */
     GPIO_InitStruct.Pin = Audio_SCL_Pin|Audio_SDA_Pin;
     GPIO_InitStruct.Mode = GPIO_MODE_AF_OD;
     GPIO_InitStruct.Pull = GPIO_NOPULL;
     GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
     GPIO_InitStruct.Alternate = GPIO_AF4_I2C1;
     HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
    
     /*Configure GPIO pin : MEMS_INT2_Pin */
     GPIO_InitStruct.Pin = MEMS_INT2_Pin;
     GPIO_InitStruct.Mode = GPIO_MODE_EVT_RISING;
     GPIO_InitStruct.Pull = GPIO_NOPULL;
     HAL_GPIO_Init(MEMS_INT2_GPIO_Port, &GPIO_InitStruct);
    
    /* USER CODE BEGIN MX_GPIO_Init_2 */
    /* USER CODE END MX_GPIO_Init_2 */
    }
    
    /* USER CODE BEGIN 4 */
    
    static void vManagerTask(void *pvParameters)
    
    {
    	unsigned int xWorkTicketId;
    	portBASE_TYPE xStatus;
    	HAL_GPIO_TogglePin(GreenLED_GPIO_Port,GreenLED_Pin);
    
    	/*the semaphore is created in the 'empty' state, meaning the semaphore must first be given using the xSemaphoreGive() API
    	 function before it can be taken (obtained)*/
    
    
    	for(;;)
    	{
    		/*get a work ticket ID (some random number)*/
    
    		xWorkTicketId = (rand() & 0x1FF);
    
    		/*send the work ticket ID to the work queue*/
    
    		xStatus = xQueueSend(xWorkQueue,&xWorkTicketId,portMAX_DELAY); //post the item on back of the queue
    
    	if(xStatus!= pdPASS)
    	{
    		sprintf(usr_msg,"could not send to the queue\r\n");
    		printmsg(usr_msg);
    
    	}
    	else
    	{
    		//manager notifying the employee
    
    		xSemaphoreGive(xWork);
    
    		//after assigning the work, yiled the processor because nothing to do
    
    		taskYIELD();
    	}
    
    	}
    }
    
    
    
    void EmployeeDoWork(unsigned char TicketId)
    {
    	/*implement the work according to ticketID*/
    	HAL_GPIO_TogglePin(RedLED_GPIO_Port,RedLED_Pin);
    
    	sprintf(usr_msg,"Employee Task: working on Ticket id: %d\r\n",TicketId);
    	printmsg(usr_msg);
    	vTaskDelay(TicketId);
    }
    
    
    static void vEmployeeTask(void *pvParameters)
    
    {
    	unsigned char xWorkTicketId;
    	portBASE_TYPE xStatus;
    	HAL_GPIO_TogglePin(OrangeLED_GPIO_Port,OrangeLED_Pin);
    
    	/*this task is also implemented in infinite loop*/
    
    	for(;;)
    	{
    		/*first employee tries to take semaphore, if thats available, then it means manager assigned a task*/
    
    		xSemaphoreTake(xWork,0);
    
    		/*get the ticket id from the work queue*/
    
    		xStatus = xQueueReceive(xWork, &xWorkTicketId, 0);
    
    		if(xStatus ==pdPASS)
    		{
    			/*employee will call a function to do the work*/
    
    
    			EmployeeDoWork(xWorkTicketId);
    		}
    	}
    
    }
    
    
    void printmsg (char *msg)
    {
    HAL_UART_Transmit(&huart2, (uint8_t*)msg,strlen((char*)msg),HAL_MAX_DELAY);
    }
    
    /* USER CODE END 4 */
    
    /**
     * @brief Period elapsed callback in non blocking mode
     * @note This function is called when TIM6 interrupt took place, inside
     * HAL_TIM_IRQHandler(). It makes a direct call to HAL_IncTick() to increment
     * a global variable "uwTick" used as application time base.
     * @PAram htim : TIM handle
     * @retval None
     */
    void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
    {
     /* USER CODE BEGIN Callback 0 */
    
     /* USER CODE END Callback 0 */
     if (htim->Instance == TIM6) {
     HAL_IncTick();
     }
     /* USER CODE BEGIN Callback 1 */
    
     /* USER CODE END Callback 1 */
    }
    
    /**
     * @brief This function is executed in case of error occurrence.
     * @retval None
     */
    void Error_Handler(void)
    {
     /* USER CODE BEGIN Error_Handler_Debug */
     /* User can add his own implementation to report the HAL error return state */
     __disable_irq();
     while (1)
     {
     }
     /* USER CODE END Error_Handler_Debug */
    }
    
    #ifdef USE_FULL_ASSERT
    /**
     * @brief Reports the name of the source file and the source line number
     * where the assert_param error has occurred.
     * @PAram file: pointer to the source file name
     * @PAram line: assert_param error line source number
     * @retval None
     */
    void assert_failed(uint8_t *file, uint32_t line)
    {
     /* USER CODE BEGIN 6 */
     /* User can add his own implementation to report the file name and line number,
     ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
     /* USER CODE END 6 */
    }
    #endif /* USE_FULL_ASSERT */
    floatskyBest answer
    Associate
    March 2, 2024

    You have only one uart, but you initialize it twice:

     MX_USART2_UART_Init();
     /* USER CODE BEGIN 2 */
    
    SEGGER_UART_init(250000);

    Note that "MX_USART2_UART_Init()" has initialized the uart with baudrate 115200.

    Then "SEGGER_UART_init(250000)"  does this again but with baudrate 250000.

    Delete the call to SEGGER_UART_init. And try again.