2024-05-22 08:53 AM
Hi,
I'm relatively new to the STM32 world and I'm becoming frustrated that I can't make a simple UART work. No DMA, no interrupts just trying to send bytes out of the UART and then receive them. Here is my setup code:
void UART7_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
HAL_Init();
/* Peripheral clock enable */
__HAL_RCC_UART7_CLK_ENABLE();
__HAL_RCC_GPIOF_CLK_ENABLE();
/**UART7 GPIO Configuration
PF6 ------> UART7_RX
PF7 ------> UART7_TX
PF8 ------> UART7_RTS
PF9 ------> UART7_CTS
*/
GPIO_InitStruct.Pin = U7_PAY_RX_SPI5_NSS_Pin|U7_PAY_TX_SPI5_SCK_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
GPIO_InitStruct.Alternate = GPIO_AF7_UART7;
HAL_GPIO_Init(GPIOF, &GPIO_InitStruct);
huart7.Instance = UART7;
huart7.Init.BaudRate = 115200;
huart7.Init.WordLength = UART_WORDLENGTH_8B;
huart7.Init.StopBits = UART_STOPBITS_1;
huart7.Init.Parity = UART_PARITY_NONE;
huart7.Init.Mode = UART_MODE_TX_RX;
huart7.Init.HwFlowCtl = UART_HWCONTROL_NONE;
huart7.Init.OverSampling = UART_OVERSAMPLING_16;
huart7.Init.OneBitSampling = UART_ONEBIT_SAMPLING_DISABLED;
huart7.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
if(HAL_UART_Init(&huart7) != HAL_OK)
{
asm("bkpt 255"); // Just for degugging
Error_Handler();
}
/* UART7 interrupt Init */
//HAL_NVIC_SetPriority(UART7_IRQn, 5, 0);
//HAL_NVIC_EnableIRQ(UART7_IRQn);
/* USER CODE BEGIN UART7_MspInit 1 */
/* USER CODE END UART7_MspInit 1 */
}
And here is the actual transmit code:
do
{
drv_led_toggle(DRV_LED_ID_AMBER);
HAL_UART_Transmit(&huart7, receiveBuffer, sizeof(receiveBuffer), TIMEOUT);
HAL_Delay(300);
//HAL_UART_Receive(&huart7, receiveBuffer, 1, TIMEOUT);
drv_led_toggle(DRV_LED_ID_AMBER);
HAL_Delay(300);
if(UART7->ISR & (1<<5))
{
HAL_UART_Receive(&huart7, receiveBuffer , 1 /*sizeof(receiveBuffer)*/, TIMEOUT);
}
if(i%2)drv_led_toggle(DRV_LED_ID_AMBER);
} while(i<5);
I'm pretty sure that it's something simple and I'm just missing it. Any advice is appreciated.
Thanks.
Solved! Go to Solution.
2024-05-22 11:02 AM
Thank you all for the suggestions. I found that I was looking at the wrong pins on the PC-104 connector. It's working fine now!
Thanks again,
Glenn
2024-05-22 09:07 AM
How are you attempting to observe the transmitted bytes?
Is this on an ST board?
2024-05-22 09:12 AM
Hello,
just trying to send bytes out of the UART and then receive them. Here is my setup code:
Send receive to which device? a PC HyperTerminal or what? or looping back Tx/Rx?
Need to give more details ..
2024-05-22 09:24 AM
Send a readable string first, check on terminal.
For receive need to make sure any kind of receive error is cleared, ie noise, framing, parity, etc
PF6/PF7 AF7 for UART7 seem correct
Polled method are inherently half-duplex, there aren't deep buffers, not going to capture standing waves from signals transmitted 300 ms earlier. Even if TX/RX looped back.
Transmit a continuous 0x55 'U' pattern, confirm baud / bit timing with a scope.
2024-05-22 09:24 AM
I'm observing the output on an Analog discovery pro as a Logic analyzer. I have also hooked up a basic USB to serial TX pin on another channel as a sanity check that it is working.
It is not on an ST eval board it is on a proprietary CubeSat "On Board Computer".
Thanks!
2024-05-22 09:25 AM
Currently, I'm observing the TX pin on a logic analyzer. Just want to see it actually transmit something right now.
Thanks.
2024-05-22 09:43 AM
Send known patterns. 0x55 would be good for checking baud rates at 8N1
2024-05-22 09:45 AM
Uhm… CubeSat On Board Computer is based on Microchip PIC32MZ M14K. Do you realise that this is the community of STMicroelectronics?
Regards
/Peter
2024-05-22 09:46 AM
So start by debugging the transmission.
As stated by @Tesla DeLorean send patterns 0x55 or 0xAA to at least be sure that you have a signal at Tx pin and you have the right bitrate.
In your first comment you said:
"just trying to send bytes out of the UART and then receive them"
I asked you how are you doing that? looping back Tx/Rx or send doing a communication with another device?.
Because in the second case you need to have the exact UART configuration at both sides: baudrate, parity, data length etc .. In the first case it's simple as it's the same config for the same UART. You can start by looping back Tx/Rx of UART7 by sending/receiving one byte ..
You can start by inspiring from that example: https://github.com/STMicroelectronics/STM32CubeH7/blob/master/Projects/STM32H743I-EVAL/Examples/UART/UART_Printf/Src/main.c
2024-05-22 09:48 AM
This is not That CubeSat OBC. This is based on the STM32H753II