2025-02-12 07:58 AM
Hi!
I'm working with a STM32C071 and I would like to change uart1 pinout and settings runtime: I've defined USART1 (in the .ioc file) as PB2 (RX) and PC14 (TX). After boot, I would like to change the USART1 pinout as PB6 (TX) and PB7 (RX). So I've written the following:
void UART_Reconfigure(UART_HandleTypeDef *huart2change,
GPIO_TypeDef *newTXPort, uint16_t newTXPin,
GPIO_TypeDef *newRXPort, uint16_t newRXPin,
GPIO_TypeDef *oldTXPort, uint16_t oldTXPin,
GPIO_TypeDef *oldRXPort, uint16_t oldRXPin) {
// 1. Abilita il clock per i vecchi GPIO se necessario (PRIMA di deinizializzarli)
if (oldTXPort == GPIOA || oldRXPort == GPIOA) {
__HAL_RCC_GPIOA_CLK_ENABLE();
}
if (oldTXPort == GPIOB || oldRXPort == GPIOB) {
__HAL_RCC_GPIOB_CLK_ENABLE();
}
if (oldTXPort == GPIOC || oldRXPort == GPIOC) {
__HAL_RCC_GPIOC_CLK_ENABLE();
}
// 2. Disabilita la UART prima di cambiare i pin
HAL_UART_DeInit(huart2change);
// 3. Deinizializza i vecchi pin
HAL_GPIO_DeInit(oldTXPort, oldTXPin);
HAL_GPIO_DeInit(oldRXPort, oldRXPin);
// 4. Abilita il clock per i nuovi GPIO
if (newTXPort == GPIOA || newRXPort == GPIOA) {
__HAL_RCC_GPIOA_CLK_ENABLE();
}
if (newTXPort == GPIOB || newRXPort == GPIOB) {
__HAL_RCC_GPIOB_CLK_ENABLE();
}
if (newTXPort == GPIOC || newRXPort == GPIOC) {
__HAL_RCC_GPIOC_CLK_ENABLE();
}
// 5. Configura i nuovi pin
GPIO_InitTypeDef GPIO_InitStruct = {0};
// Configura TX
GPIO_InitStruct.Pin = newTXPin;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
GPIO_InitStruct.Alternate = GPIO_AF0_USART1; // USART1 su PB6 (Verifica per altri pin!)
HAL_GPIO_Init(newTXPort, &GPIO_InitStruct);
// Configura RX
GPIO_InitStruct.Pin = newRXPin;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; // RX in modalità AF_PP
GPIO_InitStruct.Pull = GPIO_PULLUP; // Pull-up abilitato
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
GPIO_InitStruct.Alternate = GPIO_AF0_USART1; // USART1 su PB7 (Verifica per altri pin!)
HAL_GPIO_Init(newRXPort, &GPIO_InitStruct);
// 6. Reinizializza la UART
huart2change->Instance = USART1;
huart2change->Init.BaudRate = 115200;
huart2change->Init.WordLength = UART_WORDLENGTH_8B;
huart2change->Init.StopBits = UART_STOPBITS_1;
huart2change->Init.Parity = UART_PARITY_NONE;
huart2change->Init.Mode = UART_MODE_TX_RX;
huart2change->Init.HwFlowCtl = UART_HWCONTROL_NONE;
huart2change->Init.OverSampling = UART_OVERSAMPLING_16;
huart2change->Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
huart2change->Init.ClockPrescaler = UART_PRESCALER_DIV1;
huart2change->AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
if (HAL_UART_Init(huart2change) != HAL_OK) {
// Gestione errore
Error_Handler();
}
if (HAL_UARTEx_SetTxFifoThreshold(huart2change, UART_TXFIFO_THRESHOLD_1_8) != HAL_OK)
{
Error_Handler();
}
if (HAL_UARTEx_SetRxFifoThreshold(huart2change, UART_RXFIFO_THRESHOLD_1_8) != HAL_OK)
{
Error_Handler();
}
if (HAL_UARTEx_DisableFifoMode(huart2change) != HAL_OK)
{
Error_Handler();
}
}
I only have to launch:
UART_Reconfigure(&huart1, GPIOB, GPIO_PIN_6, GPIOB, GPIO_PIN_7, GPIOC, GPIO_PIN_14, GPIOB, GPIO_PIN_2);
But it doesn't work.
What am I missing?
Thanks
2025-02-12 08:43 AM - edited 2025-02-12 08:51 AM
You will engage much more users if you comment your code in english, is good practice in general.
>>But it doesn't work.
How is it not working, is HAL_UART_Init returning an error? Have you tried using those PB6 PB7 pins from the beginning in case is not working?
Edit: how about looking at
HAL_UART_MspInit
Maybe you need to enable UART CLK before declaring those new pins?
/* UART1 clock enable */
__HAL_RCC_UART1_CLK_ENABLE();
// 4. Abilita il clock per i nuovi GPIO
if (newTXPort == GPIOA || newRXPort == GPIOA) {
__HAL_RCC_GPIOA_CLK_ENABLE();
}
if (newTXPort == GPIOB || newRXPort == GPIOB) {
__HAL_RCC_GPIOB_CLK_ENABLE();
}
if (newTXPort == GPIOC || newRXPort == GPIOC) {
__HAL_RCC_GPIOC_CLK_ENABLE();
}