STM32H750VB_LwESP/Core/Src/lwesp_ll.c

90 lines
2.3 KiB
C

#include "system/lwesp_ll.h"
#include "lwesp/lwesp.h"
#include "lwesp/lwesp_input.h"
#include "lwesp/lwesp_mem.h"
#include "stm32h7xx_hal.h"
#include "cmsis_os.h"
#define UART_TIMEOUT 1000
#define UART_BUFFER_SIZE 1024
#define HEAP_SIZE 4096
#define UART_HANDLE huart4
extern UART_HandleTypeDef UART_HANDLE;
static uint8_t s_uart_rxbuf[UART_BUFFER_SIZE];
static uint8_t s_lwesp_heap[HEAP_SIZE];
static uint8_t s_initialized;
static osThreadId_t usart_ll_thread_id;
static osMessageQueueId_t usart_ll_mbox_id;
void usart_rx_event_callback(UART_HandleTypeDef *huart, uint16_t Pos) {
// Count pos in buffer, notify UART LL thread.
}
void usart_rx_cplt_callback(UART_HandleTypeDef *huart) {
// Circular DMA is used, so no complete event will be received normally
}
void usart_error_callback(UART_HandleTypeDef *huart) {
// Error encountered, DMA aborted.
}
static void usart_ll_thread(void *arg) {
for (;;) {
}
}
static void configure_uart(uint32_t baudrate) {
// Register callbacks
HAL_UART_RegisterCallback(&UART_HANDLE, HAL_UART_RX_COMPLETE_CB_ID, usart_rx_cplt_callback);
HAL_UART_RegisterCallback(&UART_HANDLE, HAL_UART_ERROR_CB_ID, usart_error_callback);
HAL_UART_RegisterRxEventCallback(&UART_HANDLE, usart_rx_event_callback);
// Enable DMA Rx
HAL_UART_Receive_DMA(&UART_HANDLE, s_uart_rxbuf, UART_BUFFER_SIZE);
}
static size_t send_data(const void *data, size_t len) {
HAL_UART_Transmit(&UART_HANDLE, (uint8_t *)data, len, 1000);
return len;
}
lwespr_t lwesp_ll_init(lwesp_ll_t *ll) {
lwesp_mem_region_t mem_regions[] = {{s_lwesp_heap, HEAP_SIZE}};
if (!s_initialized) {
// Internal heap management
lwesp_mem_assignmemory(mem_regions, LWESP_ARRAYSIZE(mem_regions));
// Initialize callbacks
ll->send_fn = send_data;
}
// Configure UART device and RX ring buffer
configure_uart(ll->uart.baudrate);
if(!s_initialized) {
const osThreadAttr_t attr = {
.stack_size = 1024
};
usart_ll_mbox_id = osMessageQueueNew(10, sizeof(void *), NULL);
usart_ll_thread_id = osThreadNew(usart_ll_thread, usart_ll_mbox_id, &attr);
}
s_initialized = 1;
return lwespOK;
}
lwespr_t lwesp_ll_deinit(lwesp_ll_t *ll) {
//
return lwespOK;
}