Can I retrigger a HAL_UART_Receive_IT() in HAL_UART_RxCpltCallback() ?
I'm trying to talk to a device that sends a 122 byte message every 500 milliseconds at 115.2 KBaud. I can make it work with HAL_UART_Receive_IT() in a while loop as shown here.
#include <stm32l4xx_hal.h>
#include <stm32_hal_legacy.h>
#include <iostream>
#include <string.h>
using namespace std;
#ifdef __cplusplus
extern "C"
#endif
void SysTick_Handler(void)
{
HAL_IncTick();
HAL_SYSTICK_IRQHandler();
}
void lpuart1RXIdleCallback(UART_HandleTypeDef *huart);
void configureUART();
static UART_HandleTypeDef s_UARTHandle = UART_HandleTypeDef();
#define RXBufferSize 122
static uint8_t RXBuffer[RXBufferSize];
extern "C" void LPUART1_IRQHandler()
{
HAL_UART_IRQHandler(&s_UARTHandle);
}
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
cout << uwTick << " RXBuffer: " << RXBuffer;
}
int main(void)
{
HAL_Init();
configureUART();
while (1)
{
memset(RXBuffer, 0, sizeof(RXBuffer));
HAL_UART_Receive_IT(&s_UARTHandle, RXBuffer, RXBufferSize);
HAL_Delay(400);
}
}I'd like to make the 500 millisecond much, much less. Seems like I should be able to execute the HAL_UART_Receive_IT() once and then re-execute it in the HAL_UART_RXCpltCallback() like this but the HAL_UART_RXCpltCallback() doesn't ever get called.
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
memset(RXBuffer, 0, sizeof(RXBuffer));
HAL_UART_Receive_IT(&s_UARTHandle, RXBuffer, RXBufferSize);
cout << uwTick << " RXBuffer: " << RXBuffer << endl;
}
int main(void)
{
HAL_Init();
configureUART();
memset(RXBuffer, 0, sizeof(RXBuffer));
cout << "Sending first Receive_IT()" << endl;
HAL_UART_Receive_IT(&s_UARTHandle, RXBuffer, RXBufferSize);
cout << "Starting while loop" << endl;
while (1)
{
// memset(RXBuffer, 0, sizeof(RXBuffer));
// HAL_UART_Receive_IT(&s_UARTHandle, RXBuffer, RXBufferSize);
// HAL_Delay(400);
}
}Any help will be greatly appreciated, thanks.
And here's configUART() for reference
void configureUART()
{
__LPUART1_CLK_ENABLE();
__GPIOC_CLK_ENABLE();
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.Pin = GPIO_PIN_1;
GPIO_InitStructure.Mode = GPIO_MODE_AF_PP;
GPIO_InitStructure.Alternate = GPIO_AF8_LPUART1;
GPIO_InitStructure.Speed = GPIO_SPEED_HIGH;
GPIO_InitStructure.Pull = GPIO_NOPULL;
HAL_GPIO_Init(GPIOC, &GPIO_InitStructure);
GPIO_InitStructure.Pin = GPIO_PIN_0;
GPIO_InitStructure.Mode = GPIO_MODE_AF_OD;
GPIO_InitStructure.Mode = GPIO_MODE_AF_PP;
HAL_GPIO_Init(GPIOC, &GPIO_InitStructure);
s_UARTHandle.Instance = LPUART1;
s_UARTHandle.Init.BaudRate = 115200;
s_UARTHandle.Init.WordLength = UART_WORDLENGTH_8B;
s_UARTHandle.Init.StopBits = UART_STOPBITS_1;
s_UARTHandle.Init.Parity = UART_PARITY_NONE;
s_UARTHandle.Init.HwFlowCtl = UART_HWCONTROL_NONE;
s_UARTHandle.Init.Mode = UART_MODE_TX_RX;
if (HAL_UART_Init(&s_UARTHandle) != HAL_OK)
{
cout << "Error in UART_Init" << endl;
while (1) {}
}
NVIC_EnableIRQ(LPUART1_IRQn);
}