aboutsummaryrefslogtreecommitdiff
path: root/stm32f091/esp8266.c
diff options
context:
space:
mode:
authorlonkaars <loek@pipeframe.xyz>2022-10-28 11:29:09 +0200
committerlonkaars <loek@pipeframe.xyz>2022-10-28 11:29:09 +0200
commitf37af779bb836faa7571b7d47036f36f71319aca (patch)
tree17f86baa284dd9a67770e052cc6d3383afd27159 /stm32f091/esp8266.c
parent1cac46e7701ef2783aea13d55261582f4d91f2fa (diff)
use circular dma buffer for rx
Diffstat (limited to 'stm32f091/esp8266.c')
-rw-r--r--stm32f091/esp8266.c36
1 files changed, 22 insertions, 14 deletions
diff --git a/stm32f091/esp8266.c b/stm32f091/esp8266.c
index db134a0..754b45b 100644
--- a/stm32f091/esp8266.c
+++ b/stm32f091/esp8266.c
@@ -17,6 +17,8 @@
}
uint8_t g_ws_esp8266_dma_rx_buffer[WS_DMA_RX_BUFFER_SIZE];
+unsigned int g_ws_esp8266_dma_rx_head = 0;
+unsigned int g_ws_esp8266_dma_rx_tail = 0;
uint8_t g_ws_esp8266_dma_tx_buffer[WS_DMA_TX_BUFFER_SIZE];
void DMA1_Ch1_IRQHandler(void) { HAL_DMA_IRQHandler(&hdma_usart1_rx); }
@@ -24,19 +26,30 @@ void DMA1_Ch2_3_DMA2_Ch1_2_IRQHandler(void) { HAL_DMA_IRQHandler(&hdma_usart1_tx
void USART1_IRQHandler(void) {
if (__HAL_UART_GET_FLAG(&huart1, UART_FLAG_IDLE)) {
__HAL_UART_CLEAR_IDLEFLAG(&huart1);
- HAL_UART_RxCpltCallback(&huart1);
- HAL_UART_DMAStop(&huart1);
- ws_esp8266_start_receive();
+ // https://stackoverflow.com/questions/71039052/hal-uartex-rxeventcallback-circular-dma-what-address-is-the-data
+ g_ws_esp8266_dma_rx_head = huart1.RxXferSize - huart1.hdmarx->Instance->CNDTR;
+
+ ws_esp8266_incoming_data_chunk();
}
HAL_UART_IRQHandler(&huart1);
}
-void HAL_UART_RxCpltCallback(UART_HandleTypeDef* huart) {
- size_t len = strlen((char*) g_ws_esp8266_dma_rx_buffer);
- if (len > 0) ws_server_req_incoming(g_ws_esp8266_dma_rx_buffer, len);
-
- memset(g_ws_esp8266_dma_rx_buffer, 0, WS_DMA_RX_BUFFER_SIZE);
- ws_esp8266_start_receive();
+void ws_esp8266_incoming_data_chunk() {
+ if (g_ws_esp8266_dma_rx_head == g_ws_esp8266_dma_rx_tail) return; // no new data
+ if (g_ws_esp8266_dma_rx_head > g_ws_esp8266_dma_rx_tail) {
+ // read from tail until head
+ ws_server_req_incoming(&g_ws_esp8266_dma_rx_buffer[g_ws_esp8266_dma_rx_tail],
+ g_ws_esp8266_dma_rx_head - g_ws_esp8266_dma_rx_tail);
+ } else /* if (g_ws_esp8266_dma_rx_head < g_ws_esp8266_dma_rx_tail) */ {
+ // read from tail until end of buffer
+ ws_server_req_incoming(&g_ws_esp8266_dma_rx_buffer[g_ws_esp8266_dma_rx_tail],
+ WS_DMA_RX_BUFFER_SIZE - g_ws_esp8266_dma_rx_tail);
+ // read from buffer begin until head
+ ws_server_req_incoming(&g_ws_esp8266_dma_rx_buffer[0], // yes i know this looks dumb
+ g_ws_esp8266_dma_rx_head);
+ }
+ // finish read by shifting tail forward
+ g_ws_esp8266_dma_rx_tail = g_ws_esp8266_dma_rx_head;
}
void ws_esp8266_send(uint8_t* data, size_t size) {
@@ -54,11 +67,6 @@ void ws_esp8266_send(uint8_t* data, size_t size) {
__HAL_UART_ENABLE_IT(&huart1, UART_IT_TXE);
}
-void ws_esp8266_start_receive() {
- HAL_UART_Receive_DMA(&huart1, g_ws_esp8266_dma_rx_buffer, WS_DMA_RX_BUFFER_SIZE);
- __HAL_DMA_DISABLE_IT(&hdma_usart1_rx, DMA_IT_HT);
-}
-
void ws_esp8266_connect() {
ws_esp8266_send_seq("AT+CWJAP=\"" WS_ESP8266_WLAN_SSID "\",\"" WS_ESP8266_WLAN_PASSWD "\"\r\n");
}