Skip to main content
Aatif Shaikh1
Associate III
February 17, 2021
Solved

USART3 (PB10, PB11) not working on NUCLEO-G474RE

  • February 17, 2021
  • 3 replies
  • 4611 views

Hello,

I'm working on a NUCLEO-G474RE board (using the LL libraries available on ST site), and I came across an issue, the USART3 available on the PB10 and PB11 is not working. I tried to generate the same code from the CUBEMX as well but unfortunately, no successful outcome so far. In the "User Manual" of this Nucleo board, nothing is specifically mentioned (Jumper settings) regarding the USART3 settings. On the other side, the same USART3 available on PC10, PC11 is working fine and well. As my costume-made boards are already in the fabrication process, could someone please tell me if this issue is related to the Nucleo board or the STM32G4xx series controller?

I'm attaching a code snippet and Nucleo/ Datasheet referential image.

@Community member​ @Imen DAHMEN​ @Community member​ 

0693W000008GNhlQAG.png 

/* ----------------------------------------------------------------------------
 * Includes
 * ----------------------------------------------------------------------------
*/
 
	#include "stdint.h"
	#include "stm32g474xx.h"
 
/* ----------------------------------------------------------------------------
 * MACROS
 * ----------------------------------------------------------------------------
 */
 
	/************ COM PORT USART DEF *****************/		
	#define _DEBUGG_COM			USART3
 
	/************ COM PORT BAUD RATE *****************/
	#define _DEBUGG_BAUDRATE0	(uint32_t)115200
 
	/************ COM PORT GPORT ********************/	
	#define _DEBUGG_GPIO_PORT1	GPIOB 
	#define _DEBUGG_GPIO_PORT2	GPIOB 
	/*
		//Alt option
		#define _DEBUGG_GPIO_PORT1	GPIOC 
		#define _DEBUGG_GPIO_PORT2	GPIOC 
	*/
 
	/************ COM PORT PINS ********************/
	#define _DEBUGG_GPIO_PIN1		LL_GPIO_PIN_10
	#define _DEBUGG_GPIO_PIN2		LL_GPIO_PIN_11
	/*
		//Alt option
		#define _DEBUGG_GPIO_PIN1	LL_GPIO_PIN_10
		#define _DEBUGG_GPIO_PIN2	LL_GPIO_PIN_11
	*/
 
	/************ COM PORT GPORT CLOCK **************/
	#define _DEBUGG_PORT_RCC1		LL_AHB2_GRP1_EnableClock(LL_AHB2_GRP1_PERIPH_GPIOB); 	
	#define _DEBUGG_PORT_RCC2		LL_AHB2_GRP1_EnableClock(LL_AHB2_GRP1_PERIPH_GPIOB);
	/*
		//Alt option
		#define _DEBUGG_PORT_RCC1		LL_AHB2_GRP1_EnableClock(LL_AHB2_GRP1_PERIPH_GPIOC); 	
		#define _DEBUGG_PORT_RCC2		LL_AHB2_GRP1_EnableClock(LL_AHB2_GRP1_PERIPH_GPIOC);
	*/
 
	/************ COM PORT RCC CONFIG **************/
	#define	_DEBUGG_COM_RCC_SOURCE LL_RCC_SetUSARTClockSource(LL_RCC_USART3_CLKSOURCE_PCLK1);		
	#define _DEBUGG_COM_RCC_ENABLE	LL_APB1_GRP1_EnableClock (LL_APB1_GRP1_PERIPH_USART3);	 	
 
	/************ COM PORT IRQ CONFIG **************/ 
	#define _DEBUGG_COM_IRQn 		USART3_IRQn
	#define _DEBUGG_NVIC_PR_MAIN SET //MAIN PRIORITY
	#define _DEBUGG_NVIC_PR_ALT	RESET //ALT PRIORITY
	#define _DEBUGG_IRQHandler USART3_IRQHandler
 
	/************ COM PORT PRINTF PROTO ************/ 
	#ifdef __GNUC__
 #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
	#else
 #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
	#endif /* __GNUC__ */
 
 
	/************ xxxxxxxxxxxxxxxxxxxx **************/ 
	#define _DEBUG_ALL_ENABLE_DIABLE		if( stVarDebuggPara_All.ucDebuggEnableDisable == SET )
 
		
		
 /* ----------------------------------------------------------------------------
 * STRUCTURE VARIABLES
 * ----------------------------------------------------------------------------
 */
		typedef struct
		{
			uint8_t ucDebuggEnableDisable;
		
		}stDebuggPara_All;
 
	 /*Debugg variables*/	
		stDebuggPara_All			stVarDebuggPara_All;	
		 
/* ---------------------------------------------------------------------------
* FUNCTIONS DECLARATION
* ----------------------------------------------------------------------------
*/ 
		void FnDefaultComPortConfig(uint8_t ucSelec);
 
 
/* ---------------------------------------------------------------------------
* FUNCTIONS DEFINITION
* ----------------------------------------------------------------------------
*/
 
/*****************************************************************************
 **@Function 		 	: 	PUTCHAR_PROTOTYPE
 **@Descriptions		: 	printf prototype
 **@parameters			: 	None
 **@return					: 	None
*****************************************************************************/ 
 PUTCHAR_PROTOTYPE
{
 /* Place your implementation of fputc here */
 /* e.g. write a character to the USART */
 LL_USART_TransmitData8(_DEBUGG_COM, (uint8_t) ch);
 while ( LL_USART_IsActiveFlag_TXE(_DEBUGG_COM) == RESET )
 { }
						
 return ch;
}
 
/*****************************************************************************
 **@Function 		 	: 	FnDefaultComPortInit
 **@Descriptions		: 	_DEBUGG_COM port init
 **@parameters			: 	uint8_t 
 **@return				: 	None
*****************************************************************************/ 
void FnDefaultComPortConfig(uint8_t ucSelec)
{
	
 /* USER CODE BEGIN _DEBUGG_COM_Init 0 */
 /* USER CODE END _DEBUGG_COM_Init 0 */
 LL_USART_InitTypeDef USART_InitStruct = {RESET};
 LL_GPIO_InitTypeDef GPIO_InitStruct = {RESET};
	
	
 /* Peripheral clock enable */
	_DEBUGG_COM_RCC_SOURCE _DEBUGG_COM_RCC_ENABLE
	_DEBUGG_PORT_RCC1 _DEBUGG_PORT_RCC2
 
	/* COM GPIO Configuration*/
	GPIO_InitStruct.Pin 		 = _DEBUGG_GPIO_PIN1 ;
	GPIO_InitStruct.Mode 	 = LL_GPIO_MODE_ALTERNATE ;
	GPIO_InitStruct.Speed 	 = LL_GPIO_SPEED_FREQ_HIGH ;
	GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL ;
	GPIO_InitStruct.Pull 		 = LL_GPIO_PULL_UP ;
	GPIO_InitStruct.Alternate 	 = LL_GPIO_AF_7 ;
	LL_GPIO_Init(_DEBUGG_GPIO_PORT1, &GPIO_InitStruct) ;
	/* USER CODE END _DEBUGG_COM_Init 1 */
	
	GPIO_InitStruct.Pin 		 = _DEBUGG_GPIO_PIN2 ;
	GPIO_InitStruct.Mode 	 = LL_GPIO_MODE_ALTERNATE ;
	GPIO_InitStruct.Speed 	 = LL_GPIO_SPEED_FREQ_HIGH ;
	GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL ;
	GPIO_InitStruct.Pull 		 = LL_GPIO_PULL_UP ;
	GPIO_InitStruct.Alternate = LL_GPIO_AF_7 ;
	LL_GPIO_Init(_DEBUGG_GPIO_PORT2, &GPIO_InitStruct) ;
	/* USER CODE BEGIN _DEBUGG_COM_Init 1 */
 
 
 /* USER CODE END _DEBUGG_COM_Init 1 */
	USART_InitStruct.BaudRate 		 = _DEBUGG_BAUDRATE0 ;	
	USART_InitStruct.PrescalerValue 	 = LL_USART_PRESCALER_DIV1 ;
	USART_InitStruct.DataWidth 		 = LL_USART_DATAWIDTH_8B ;
	USART_InitStruct.StopBits 			 = LL_USART_STOPBITS_1 ;
	USART_InitStruct.Parity 			 = LL_USART_PARITY_NONE ;
	USART_InitStruct.TransferDirection = LL_USART_DIRECTION_TX_RX ;
	USART_InitStruct.HardwareFlowControl = LL_USART_HWCONTROL_NONE ;
	USART_InitStruct.OverSampling 	 = LL_USART_OVERSAMPLING_8 ;
	LL_USART_Init			 (_DEBUGG_COM, &USART_InitStruct ) ;
	LL_USART_SetTXFIFOThreshold(_DEBUGG_COM, LL_USART_FIFOTHRESHOLD_1_8);
	LL_USART_SetRXFIFOThreshold(_DEBUGG_COM, LL_USART_FIFOTHRESHOLD_1_8);
	LL_USART_DisableFIFO	 (_DEBUGG_COM);
	LL_USART_ConfigAsyncMode (_DEBUGG_COM);
	LL_USART_Enable		 (_DEBUGG_COM);
 
 
	/* USART1 interrupt Init */
	 NVIC_SetPriority	(_DEBUGG_COM_IRQn, 
	 NVIC_EncodePriority( NVIC_GetPriorityGrouping()
					 ,_DEBUGG_NVIC_PR_MAIN, _DEBUGG_NVIC_PR_ALT));
	 NVIC_EnableIRQ	 (_DEBUGG_COM_IRQn);
 
	LL_USART_EnableIT_RXNE (_DEBUGG_COM);
	LL_USART_EnableIT_ERROR (_DEBUGG_COM);
	
 /* Polling _DEBUGG_COM initialisation */
 while((!(LL_USART_IsActiveFlag_TEACK(_DEBUGG_COM))) || (!(LL_USART_IsActiveFlag_REACK(_DEBUGG_COM))))
 { }
		
#if _USE_DEBUG_COM
 _DEBUG_ALL_ENABLE_DIABLE
 printf("\n\rDDEBUGG COM PORT INIT\n\r");
#endif	 		
 
}
 

This topic has been closed for replies.
Best answer by Imen.D

Hello @Community member​,

Check that you are using the last version of Cube firmware and STM32CubeMx (that contain a fix with UART/USART LL driver).

Please keep us informed about your progress on this issue. If it is solved, please mark the answer as "Best Answer" by clicking on the "Select as Best" button, this can be very helpful for Community users to find this solution more quickly.

Imen

3 replies

Tesla DeLorean
Guru
February 17, 2021

So pull a schematic and trace the pin from the IC to the header.

Check you're looking at the right pins. Toggle as a GPIO, send a stream of 'U' characters as a UART, scope the pins.

Not a board I'm using

Tips, Buy me a coffee, or three.. PayPal Venmo (See Profile) Up vote any posts that you find helpful, it shows what's working..
Imen.DBest answer
ST Technical Moderator
February 17, 2021

Hello @Community member​,

Check that you are using the last version of Cube firmware and STM32CubeMx (that contain a fix with UART/USART LL driver).

Please keep us informed about your progress on this issue. If it is solved, please mark the answer as "Best Answer" by clicking on the "Select as Best" button, this can be very helpful for Community users to find this solution more quickly.

Imen

In order to give better visibility on the answered topics, please click on 'Best answer' on the reply which solved your issue or answered your question. Thanks
Aatif Shaikh1
Associate III
February 25, 2021

Very strange issue! Now when I directly soldered the wires on the pins, it is working properly.

ST Technical Moderator
February 25, 2021

Thanks @Community member​ for sharing your update.

I'm glad to know that your issue is solved :)

Imen

In order to give better visibility on the answered topics, please click on 'Best answer' on the reply which solved your issue or answered your question. Thanks
MWiki.1
Visitor II
March 9, 2021

Hello, I have question about NUCLEO-F031K6. Can I handle stable serial communication without adding external resistors? (I want to use internal resistors declared in program only, no external). Looking for your answers!

Aatif Shaikh1
Associate III
April 6, 2021

Yes, you can use the internal pull-ups, they work perfectly fine. Additionally, If you are designing your custom-made board, so, I would suggest, go with an external pull-up because you can use them for debugging the UART signals (by using an oscilloscope on them). In case, if you don't want to use the external anymore, you can always replace them with zero ohms resistance.

MWiki.1
Visitor II
April 6, 2021

Great, thank you! :)