cancel
Showing results for 
Search instead for 
Did you mean: 

STM32U5A9J-DK / en.x-cube-gnss1

PascalP
Associate II

Hello dear community,

I'm interested in the en.x-cube-gnss1 middleware package as I'm developping a solution based on a custom GPS module.

For me, this ST package is a good starting point to write my own package. More over, I would want to use it with Azure RTOS.

So,

In a first attempt, I configured a sort of "generic" project around the STM32U5A9J-DK / en.x-cube-gnss1 and generate the code to see how it works. In my case, the GPS module is wired to STM32 thought LPUART1

As I understood, when starting the app creates 3 threads:

190: ret = tx_thread_create(&teseoConsumerTaskHandle, "TeseoConsumerTask", TeseoConsumerTask, 0,

211: ret = tx_thread_create(&backgroundTaskHandle, "BackgroundTask", BackgroundTask, 0,

231: ret = tx_thread_create(&consoleParseTaskHandle, "ConsoleParseTask", ConsoleParseTask, 0,

In a trial purpose, I just added one extra menu in the CLI (located in /GNSS/App/app_gnss.c)

static void AppCmdProcess(char *com)

 to have the hability to send one command manually to the GPS. So on the terminal it looks like:
image.png

Extra menu option is "20",  which permits to type manually the command to be sent to the GPS through LPUART1

Basically, it just uses this function: 

GNSS_DATA_SendCommand((uint8_t *)com);

where the *com is the entered string that comes from the CLI. Then, datas are placed by Azure in a queue to be 

finally sent by BSP_LPUART1_Send_IT :

int32_t BSP_LPUART1_Send_IT(uint16_t DevAddr, uint8_t *pData, uint16_t Length)
{
int32_t ret = BSP_ERROR_BUS_FAILURE;
UNUSED(DevAddr);
if(HAL_UART_Transmit_IT(&hlpuart1, (uint8_t *)pData, Length) == HAL_OK)
{
ret = BSP_ERROR_NONE;
}
else
{
ret = BSP_ERROR_PERIPH_FAILURE;
}
return ret;
}

But unfortunately, nothing happens physically, PG7 output (LPUART1_TX) stays always high.

However,

if I send datas with "BSP_LPUART1_Send" function soon after choosing the right option in the menu, instead of using the intented function "GNSS_DATA_SendCommand" it works as I would espect. But this isn't very clean in the whole Azure system.

Can you help me please ?

Thanks a lot in advance.

3 REPLIES 3
PascalP
Associate II

Hello everybody,

I suceeded to output something on LPUART1 : I just forgot to enable LPUART1 global interrupt !

PascalP_0-1724144889887.png

 

 

PascalP
Associate II

But now,

I've got another problem...

With my "sendcommand" menu, I can now send any command to the GPS module.

For example, if I send the "$PSTMGETSWVER" command, I see something happening on LPUART_TX, and in reply the GPS send something on LPUART_RX. So sending commands works well.

But despite receiving something on LPUART1_RX coming from the GPS module,

The TeseoConsumerTask is always in SLEEP(1) state,

whereas ConsoleParseTask always in running state.

After executing step-by-step, 

I found that it comes into 

const TESEO_LIV3F_Msg_t *teseo_queue_claim_rd_buffer(TESEO_LIV3F_Queue_t *pTeseoQueue)

(in /project/Drivers/BSP/Components/teseo_liv3f/teseo_liv3f_queue.c)

but never get any available buffer as pTeseoQueue->bitmap_buffer_readable is always 0:

/* first available readable buffer */ i = teseo_ffs(pTeseoQueue->bitmap_buffer_readable); if (i == 0) { #if (ANY_RTOS) /* release the semaphore */ semaphore_free(pTeseoQueue->semaphore); //PRINT_DBG("No read buffer available... going to sleep...\n\r"); os_delay(); continue;

Any clue ?

Thanks a lot in advance for your valuable help.

PascalP
Associate II

In

typedef struct { #if (USE_FREE_RTOS_NATIVE_API) SemaphoreHandle_t semaphore; uint32_t bitmap_unreleased_buffer_irq; #endif /* USE_FREE_RTOS_NATIVE_API */ #if (USE_AZRTOS_NATIVE_API) TX_SEMAPHORE semaphore; uint32_t bitmap_unreleased_buffer_irq; #endif /* USE_AZRTOS_NATIVE_API */ #if (osCMSIS) #if (osCMSIS < 0x20000U) osSemaphoreId semaphore; uint32_t bitmap_unreleased_buffer_irq; #elif (osCMSIS >= 0x20000U) osSemaphoreId_t semaphore; uint32_t bitmap_unreleased_buffer_irq; #endif /* (osCMSIS < 0x20000U) */ #endif /* osCMSIS */ uint32_t bitmap_buffer_writable; uint32_t bitmap_buffer_readable; SONY_CXD56XX_Msg_t nmea_queue[MAX_MSG_QUEUE]; uint8_t single_message_buffer[MAX_MSG_QUEUE * MAX_MSG_BUF]; } SONY_CXD56XX_Queue_t;

What's purpose of 

uint32_t bitmap_buffer_readable;

?