Closed
Description
Hello @fpistm , I was further exploring more uart for my project and found that UART4 on pin PA1 & PA0 also do not work under Arduino framework.
I have tested the UART1, UART2 & UART4 using STM32Cube Framework and everything works fine.
#include <Arduino.h>
#define pin LED_BUILTIN
HardwareSerial UART1(PA10, PA9); // works fine after workaround provided by @fpistm in above comments
HardwareSerial Uart4(PA1, PA0); // UART 4 on Pin PA1 & PA0 does not work and MCU stop working.
UART_HandleTypeDef huart4; // HACK using STM32 HAL Library for UART4 on Pin PA1 & PA0
void Uart4_Init();
void UART4_Send();
void setup()
{
Serial.begin(115200); // on Pin rx_PA3 tx_PA2
delay(100);
UART1.begin(115200); // on Pin rx_PA10 tx_PA9
delay(100);
Uart4.begin(115200); // Error working using Arduino library // on Pin rx_PA1 tx_PA0
//Uart4_Init(); // using STM32 HAL Library as workaround to send data but cannot receive due to lib conflict
delay(100);
pinMode(LED_BUILTIN, OUTPUT);
}
int count = 0;
void loop()
{
delay(1000);
Serial.print("\nSG0 UART2(Serial): "); Serial.print(++count);
UART1.print("\nSG0 UART1: "); UART1.print(count);
Uart4.print("\nSG0 Uart4: "); Uart4.print(count); // **SOC stop working at this point...**
//UART4_Send(); //using STM32 HAL Library (Sending is fine, receiving data is problem)
digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN));
}
/* Sending data on UART 4 using STM32 HAL Library*/
void UART4_Send()
{
char str[20];
String thisString = "\nSG0 UART4: " + String(count) + "\n";
thisString.toCharArray(str, thisString.length());
HAL_UART_Transmit(&huart4, (uint8_t*)str, thisString.length()-1, 1000);
}
/* Initializing UART 4 using STM32 HAL Library*/
void Uart4_Init()
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
/* Peripheral clock enable */
__HAL_RCC_USART4_CLK_ENABLE();
__HAL_RCC_GPIOA_CLK_ENABLE();
/**USART4 GPIO Configuration
PA0 ------> USART4_TX
PA1 ------> USART4_RX
*/
GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
GPIO_InitStruct.Alternate = GPIO_AF4_USART4;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
/* USER CODE END USART4_Init 1 */
huart4.Instance = USART4;
huart4.Init.BaudRate = 115200;
huart4.Init.WordLength = UART_WORDLENGTH_8B;
huart4.Init.StopBits = UART_STOPBITS_1;
huart4.Init.Parity = UART_PARITY_NONE;
huart4.Init.Mode = UART_MODE_TX_RX;
huart4.Init.HwFlowCtl = UART_HWCONTROL_NONE;
huart4.Init.OverSampling = UART_OVERSAMPLING_16;
huart4.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
huart4.Init.ClockPrescaler = UART_PRESCALER_DIV1;
huart4.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
if (HAL_UART_Init(&huart4) != HAL_OK)
{
Serial.println("\nUart4 Error");
}
/* USER CODE BEGIN USART4_Init 2 */
if (HAL_UARTEx_SetTxFifoThreshold(&huart4, UART_TXFIFO_THRESHOLD_1_8) != HAL_OK)
{
Serial.println("\nUart4 Error");
}
if (HAL_UARTEx_SetRxFifoThreshold(&huart4, UART_RXFIFO_THRESHOLD_1_8) != HAL_OK)
{
Serial.println("\nUart4 Error");
}
if (HAL_UARTEx_DisableFifoMode(&huart4) != HAL_OK)
{
Serial.println("\nUart4 Error");
}
}
Originally posted by @harji2130 in #1180 (comment)