Last active
December 7, 2024 10:10
-
-
Save glegrain/ca92f631e578450a933c67ac3497b4df to your computer and use it in GitHub Desktop.
STM32 printf retarget to UART
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/*# 1- Identify the UART interface, GPIO pins and Alternate Function #########*/ | |
/* For example: | |
* B-L475E-IOT01A: | |
* PB6 ------> USART1_TX | |
* PB7 ------> USART1_RX | |
* | |
* NUCLEO-L476RG: | |
* PA2 ------> USART2_TX | |
* PA3 ------> USART2_RX | |
* | |
* STM32L4R9-DISCO: | |
* PA2 ------> USART2_TX | |
* PA3 ------> USART2_RX | |
* | |
* STM32H747I-DISCO: | |
* PA9 ------> USART1_TX | |
* PA10 ------> USART1_RX | |
* | |
*/ | |
/*# 2- Enable UART MODULE in Inc/stm32l4xx_hal_conf.h ########################*/ | |
#define HAL_UART_MODULE_ENABLED | |
/*# 3- From Drivers/STM32L4xx_HAL_Driver/Src/ add the HAL UART C sources | |
to your project: stm32xxxx_hal_uart.c stm32xxxx_hal_uart_ex.c ############*/ | |
/*# 4- Create Global UART Handle in Src/main.c ###############################*/ | |
UART_HandleTypeDef huart1; | |
/*# 5- Configure the UART interface in Src/main.c ############################*/ | |
/** | |
* @brief UART interface configuration | |
*/ | |
void UART_Init(void) | |
{ | |
huart1.Instance = USART1; | |
huart1.Init.BaudRate = 115200; | |
huart1.Init.WordLength = UART_WORDLENGTH_8B; | |
huart1.Init.StopBits = UART_STOPBITS_1; | |
huart1.Init.Parity = UART_PARITY_NONE; | |
huart1.Init.Mode = UART_MODE_TX_RX; | |
huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE; | |
huart1.Init.OverSampling = UART_OVERSAMPLING_16; | |
huart1.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE; | |
huart1.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT; | |
if (HAL_UART_Init(&huart1) != HAL_OK) | |
{ | |
Error_Handler(); | |
} | |
} | |
/*# 6- Configure the UART GPIOs in Src/stm32l4xx_hal_msp.c ##################*/ | |
/** | |
* @brief UART MSP Initialization | |
* @param huart: UART handle pointer | |
*/ | |
void HAL_UART_MspInit(UART_HandleTypeDef* huart) | |
{ | |
GPIO_InitTypeDef GPIO_InitStruct; | |
if (huart->Instance == USART1) | |
{ | |
/* Peripheral clock enable */ | |
__HAL_RCC_USART1_CLK_ENABLE(); | |
/** | |
* USART1 GPIO Configuration | |
* PB6 ------> USART1_TX | |
* PB7 ------> USART1_RX | |
*/ | |
/* Peripheral clock enable */ | |
__HAL_RCC_GPIOB_CLK_ENABLE(); | |
GPIO_InitStruct.Pin = GPIO_PIN_6 | GPIO_PIN_7; | |
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; | |
GPIO_InitStruct.Pull = GPIO_PULLUP; | |
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; | |
GPIO_InitStruct.Alternate = GPIO_AF7_USART1; | |
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); | |
} | |
} | |
/*# 7- Retarget printf to UART (std library and toolchain dependent) #########*/ | |
#if defined(__GNUC__) | |
int _write(int fd, char * ptr, int len) | |
{ | |
HAL_UART_Transmit(&huart1, (uint8_t *) ptr, len, HAL_MAX_DELAY); | |
return len; | |
} | |
#elif defined (__ICCARM__) | |
#include "LowLevelIOInterface.h" | |
size_t __write(int handle, const unsigned char * buffer, size_t size) | |
{ | |
HAL_UART_Transmit(&huart1, (uint8_t *) buffer, size, HAL_MAX_DELAY); | |
return size; | |
} | |
#elif defined (__CC_ARM) | |
int fputc(int ch, FILE *f) | |
{ | |
HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, HAL_MAX_DELAY); | |
return ch; | |
} | |
#endif | |
// OR: | |
// Add syscalls.c with GCC | |
#ifdef __GNUC__ | |
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch) | |
#else | |
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f) | |
#endif /* __GNUC__ */ | |
/** | |
* @brief Retargets the C library printf function to the USART. | |
* @param None | |
* @retval None | |
*/ | |
PUTCHAR_PROTOTYPE | |
{ | |
HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, HAL_MAX_DELAY); | |
return ch; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment