Skip to main content
AElgh
Associate III
January 9, 2025
Question

X-NUCLEO-BNRG2A1 UART Bootloader Mode

  • January 9, 2025
  • 0 replies
  • 425 views

Hello, Following AN4872  & UM2667 I did the following:

 

- Connected J15(Force DIO7 High).

- UART-Connection is like(Beside GND and Vdd):

    Nucleo-Board(F401RE)   <----------------------->  X-NUCLEO-BNRG2A1

       PA9(UART1_Tx)           <----------------------->   PA2-DIO11(UART_Rx)

       PA10(UART1_Rx)         <----------------------->   PA3-DIO8(UART_Tx)

- UART1 Baudrate is 115200bps

- The X-NUCLEO-BNRG2A1 was tested with the Sensor Demo Application to verify that the Preloaded firmware works and successfully initializes and runs the application.

- The Preflashed Firmware is: DTM_SPI_M2SP_Eval_Kit.

The following is a test code, USART2 is used with ST-Link for debugging.

 

 

 

/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */
// Assuming the UART handle is globally defined

uint8_t txData = 0x7F; // Data to send
uint8_t rxData = 0x00; // Buffer to store received byte
uint8_t Rx_Buff[10];
uint8_t cnt = 0;

bool 	Rx_Flag = False;
/* USER CODE END 0 */

/**
 * @brief The application entry point.
 * @retval int
 */
int main(void)
{

 /* USER CODE BEGIN 1 */
	HAL_StatusTypeDef status;
 /* USER CODE END 1 */

 /* MCU Configuration--------------------------------------------------------*/

 /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
 HAL_Init();

 /* USER CODE BEGIN Init */
 /* USER CODE END Init */

 /* Configure the system clock */
 SystemClock_Config();

 /* USER CODE BEGIN SysInit */
 /* USER CODE END SysInit */

 /* Initialize all configured peripherals */
 MX_GPIO_Init();
 MX_USART2_UART_Init();
 MX_USART1_UART_Init();
 /* USER CODE BEGIN 2 */

// Print_Sys();

 HAL_GPIO_WritePin(BLE_Boot_DIO7_GPIO_Port, BLE_Boot_DIO7_Pin, GPIO_PIN_SET);
 BLE_Reset();

 HAL_Delay(2000);
 // Transmit the data (0x7F)
 status = HAL_UART_Transmit(Platform_UART_Handler, &txData, 1, HAL_MAX_DELAY);

 while(!Rx_Flag)
 {
	 // Receive the data
	 status = HAL_UART_Receive_IT(Platform_UART_Handler, &rxData, 1);
//	 status = HAL_UART_Receive(Platform_UART_Handler, &rxData, 1, HAL_MAX_DELAY);

	 if((status == HAL_OK))
	 {
//	 	Data_Buff[cnt++] = rxData;
		printf("Received Packet: 0x%X\r\n", rxData);
		HAL_GPIO_WritePin(GPIOA, LD2_Pin, GPIO_PIN_SET);
		HAL_UART_Transmit(&huart2, &rxData, cnt, HAL_MAX_DELAY);
		Rx_Flag = True;
	 }
	 else
	 {
	 	printf("UART Rx Error\n\r");
	 }
 }

 HAL_GPIO_WritePin(GPIOA, LD2_Pin, GPIO_PIN_RESET);
 Rx_Flag = False;

 HAL_GPIO_WritePin(BLE_Boot_DIO7_GPIO_Port, BLE_Boot_DIO7_Pin, GPIO_PIN_SET);
 BLE_Reset();
 HAL_Delay(2000);

 txData = 0xF7; // BigEndian
 status = HAL_UART_Transmit(Platform_UART_Handler, &txData, 1, HAL_MAX_DELAY);

 while(!Rx_Flag)
 {
 	 // Receive the data
// 	 status = HAL_UART_Receive_IT(Platform_UART_Handler, &rxData, 1);

 	status = HAL_UART_Receive(Platform_UART_Handler, &rxData, 1, HAL_MAX_DELAY);

 	 if((status == HAL_OK))
 	 {
 //	 	Data_Buff[cnt++] = rxData;
 			printf("Received Packet: 0x%X\r\n", rxData);
 			HAL_GPIO_WritePin(GPIOA, LD2_Pin, GPIO_PIN_SET);
 			HAL_UART_Transmit(&huart2, &rxData, cnt, HAL_MAX_DELAY);
 			Rx_Flag = True;
 	 }
 	 else
 	 {
 	 	printf("UART Rx Error\n\r");
 	 }
 }
 /* USER CODE END 2 */
 /* Infinite loop */
 /* USER CODE BEGIN WHILE */
 while (1)
 {
 /* USER CODE END WHILE */
 /* USER CODE BEGIN 3 */
 }
 /* USER CODE END 3 */
}




void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size)
{
	HAL_UART_Receive_IT(Platform_UART_Handler, &rxData, 1);
	Rx_Flag = True;
}

/**
 * @brief Reset BlueNRG module.
 *
 * None
 * @retval int32_t 0
 */
int32_t BLE_Reset(void)
{
 // Deselect CS PIN for BlueNRG to avoid spurious commands
 HAL_GPIO_WritePin(BLE_CS_GPIO_Port, BLE_CS_Pin, GPIO_PIN_SET);

 HAL_GPIO_WritePin(BLE_RST_GPIO_Port, BLE_RST_Pin, GPIO_PIN_RESET);
 HAL_Delay(5);
 HAL_GPIO_WritePin(BLE_RST_GPIO_Port, BLE_RST_Pin, GPIO_PIN_SET);
 HAL_Delay(5);
 return 0;
}

 

 

 

 

 

Observing the Signals on the UART-Pins (UART1_Tx and UART1_Rx) I get the following:

 

Big picture (Blue is STM32 UART_Tx)

AElgh_0-1736432060174.png

 

 

 

1st transmitted byte 0x7F

 

AElgh_1-1736432143666.png

 

 

2nd Transmited byte(after 2 seconds), I reversed the 0x7F incase the BLE reads in Bigendian.

 

AElgh_3-1736432241818.png

 

In both cases, there is no response from the BLE Board.

 

Is there something wrong with my configurations? What I'm missing here?

 

 

 

Thank you