aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.gitignore1
-rw-r--r--stm32f091/consts.h2
-rw-r--r--stm32f091/esp8266.c53
-rw-r--r--stm32f091/esp8266.h10
-rw-r--r--stm32f091/setup.c46
-rw-r--r--stm32f091/setup.h2
6 files changed, 114 insertions, 0 deletions
diff --git a/.gitignore b/.gitignore
index 18c2616..90d7960 100644
--- a/.gitignore
+++ b/.gitignore
@@ -18,4 +18,5 @@ shared/main
.qmake.stash
.vscode/.cortex-debug.registers.state.json
copyright
+temp/
diff --git a/stm32f091/consts.h b/stm32f091/consts.h
index 349ff21..1d8648d 100644
--- a/stm32f091/consts.h
+++ b/stm32f091/consts.h
@@ -4,6 +4,8 @@
#define WS_SERVER_PORT "80"
+#define WS_DMA_RX_BUFFER_SIZE 50
+
#define WS_PINOUT_I2C_SDA_PIN GPIO_PIN_9
#define WS_PINOUT_I2C_SDA_PORT GPIOB
#define WS_PINOUT_I2C_SCL_PIN GPIO_PIN_8
diff --git a/stm32f091/esp8266.c b/stm32f091/esp8266.c
index 4fdf7e6..6a9f254 100644
--- a/stm32f091/esp8266.c
+++ b/stm32f091/esp8266.c
@@ -2,11 +2,64 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
+#include <stm32f0xx.h>
#include "esp8266.h"
#include "setup.h"
#include "consts.h"
+char g_ws_esp8266_dma_rx_buffer[WS_DMA_RX_BUFFER_SIZE];
+char MainBuf[WS_DMA_RX_BUFFER_SIZE]; // TODO: remove
+int isOK = 0; // TODO: remove
+uint16_t g_ws_esp8266_dma_old_pos = 0;
+uint16_t g_ws_esp8266_dma_new_pos = 0;
+
+// when rx receives data handle the message. this function is in stm32. this name needs to stay the same or else it wont work.
+void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size){
+ if(huart->Instance == USART1) {
+ g_ws_esp8266_dma_old_pos = g_ws_esp8266_dma_new_pos; // Update the last position before copying new data
+
+ if(g_ws_esp8266_dma_old_pos+Size > WS_DMA_RX_BUFFER_SIZE) { // if the current position + new data is greater than the main buffer
+ uint16_t dataToCopy = WS_DMA_RX_BUFFER_SIZE-g_ws_esp8266_dma_old_pos; // find remaining space left
+ memcpy ((uint8_t*)MainBuf+g_ws_esp8266_dma_old_pos,g_ws_esp8266_dma_rx_buffer,dataToCopy); // copy data in the remaining space
+
+ g_ws_esp8266_dma_old_pos = 0; // point to the start of the buffer
+ memcpy ((uint8_t*)MainBuf,(uint8_t*)g_ws_esp8266_dma_rx_buffer+dataToCopy,(Size-dataToCopy)); // copy the remaing data
+ g_ws_esp8266_dma_new_pos = (Size-dataToCopy); // update position
+ }
+ // if data is less than new data
+ else {
+ memcpy ((uint8_t*)MainBuf+g_ws_esp8266_dma_old_pos,g_ws_esp8266_dma_rx_buffer,Size);
+ g_ws_esp8266_dma_new_pos = Size+g_ws_esp8266_dma_old_pos;
+ }
+ // start DMA again
+ // memset(g_ws_esp8266_dma_rx_buffer,'\0',g_ws_esp8266_dma_rx_buffer_Size); // clear rx_buff
+ HAL_UARTEx_ReceiveToIdle_DMA(&huart1, g_ws_esp8266_dma_rx_buffer, WS_DMA_RX_BUFFER_SIZE);
+ __HAL_DMA_DISABLE_IT(&hdma_usart1_rx,DMA_IT_HT);
+ }
+
+ // check for OK messagge
+ for(int i=0;i<Size;i++){
+ if(g_ws_esp8266_dma_rx_buffer[i]=='O' && g_ws_esp8266_dma_rx_buffer[i+1]=='K'){
+ isOK=1;
+ //memset(MainBuf,'\0',MainBuf_Size); // clear main buffer if OK is in the main buffer.
+ //memset(g_ws_esp8266_dma_rx_buffer,'\0',g_ws_esp8266_dma_rx_buffer_Size); // clear rx_buff
+
+ }
+ else if(strncmp(g_ws_esp8266_dma_rx_buffer, "+IPD", 4) == 0){
+
+ }
+ }
+}
+
+void DMA1_Ch1_IRQHandler(void) {
+ HAL_DMA_IRQHandler(&hdma_usart1_rx);
+}
+
+void DMA1_Ch2_3_DMA2_Ch1_2_IRQHandler(void) {
+ HAL_DMA_IRQHandler(&hdma_usart1_tx);
+}
+
void ws_esp8266_ATsendCommand(uint8_t* data){
char dataChar[20];
uint8_t Tx_send[]="AT+CIPSEND=0,";
diff --git a/stm32f091/esp8266.h b/stm32f091/esp8266.h
index c09a557..9df02cb 100644
--- a/stm32f091/esp8266.h
+++ b/stm32f091/esp8266.h
@@ -1,7 +1,17 @@
#pragma once
+#include "consts.h"
+
#include <stdint.h>
+extern char g_ws_esp8266_dma_rx_buffer[WS_DMA_RX_BUFFER_SIZE];
+
+void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *, uint16_t);
+/** @brief This function handles DMA1 channel 2 to 3 and DMA2 channel 1 to 2 interrupts. */
+void DMA1_Ch2_3_DMA2_Ch1_2_IRQHandler(void);
+/** @brief This function handles DMA1 channel 1 interrupt. */
+void DMA1_Ch1_IRQHandler(void);
+
void ws_esp8266_ATsendCommand(uint8_t* data);
int ws_esp8266_checkOK(uint8_t *receiveData,int length);
int ws_esp8266_receivingMsg(uint8_t *receiveData,int length);
diff --git a/stm32f091/setup.c b/stm32f091/setup.c
index fec2b7c..318de5a 100644
--- a/stm32f091/setup.c
+++ b/stm32f091/setup.c
@@ -5,6 +5,7 @@
#include <FreeRTOS.h>
#include <task.h>
+#include "esp8266.h"
#include "setup.h"
I2C_HandleTypeDef hi2c1 = {
@@ -45,10 +46,33 @@ UART_HandleTypeDef huart2 = {
.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT,
};
+DMA_HandleTypeDef hdma_usart1_rx = {
+ .Instance = DMA1_Channel1,
+ .Init.Direction = DMA_PERIPH_TO_MEMORY,
+ .Init.PeriphInc = DMA_PINC_DISABLE,
+ .Init.MemInc = DMA_MINC_ENABLE,
+ .Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE,
+ .Init.MemDataAlignment = DMA_MDATAALIGN_BYTE,
+ .Init.Mode = DMA_NORMAL,
+ .Init.Priority = DMA_PRIORITY_LOW,
+};
+
+DMA_HandleTypeDef hdma_usart1_tx {
+ .Instance = DMA1_Channel2,
+ .Init.Direction = DMA_MEMORY_TO_PERIPH,
+ .Init.PeriphInc = DMA_PINC_DISABLE,
+ .Init.MemInc = DMA_MINC_ENABLE,
+ .Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE,
+ .Init.MemDataAlignment = DMA_MDATAALIGN_BYTE,
+ .Init.Mode = DMA_NORMAL,
+ .Init.Priority = DMA_PRIORITY_LOW,
+};
+
static void ws_io_clock_setup();
static void ws_io_i2c_setup();
static void ws_io_usart1_setup();
static void ws_io_usart2_setup();
+static void ws_io_dma_setup();
static void ws_setup_error_handler();
void ws_io_setup() {
@@ -58,6 +82,7 @@ void ws_io_setup() {
ws_io_i2c_setup();
ws_io_usart1_setup();
ws_io_usart2_setup();
+ ws_io_dma_setup();
}
static void ws_io_clock_setup() {
@@ -97,6 +122,9 @@ static void ws_io_i2c_setup() {
static void ws_io_usart1_setup() {
if (HAL_UART_Init(&huart1) != HAL_OK)
return ws_setup_error_handler();
+
+ HAL_UARTEx_ReceiveToIdle_DMA(&huart1, g_ws_esp8266_dma_rx_buffer, WS_DMA_RX_BUFFER_SIZE);
+ __HAL_DMA_DISABLE_IT(&hdma_usart1_rx, DMA_IT_HT);
}
static void ws_io_usart2_setup() {
@@ -104,6 +132,16 @@ static void ws_io_usart2_setup() {
return ws_setup_error_handler();
}
+static void ws_io_dma_setup() {
+ __HAL_RCC_DMA1_CLK_ENABLE();
+
+ // interrupt priorities
+ HAL_NVIC_SetPriority(DMA1_Ch1_IRQn, 3, 0);
+ HAL_NVIC_EnableIRQ(DMA1_Ch1_IRQn);
+ HAL_NVIC_SetPriority(DMA1_Ch2_3_DMA2_Ch1_2_IRQn, 3, 0);
+ HAL_NVIC_EnableIRQ(DMA1_Ch2_3_DMA2_Ch1_2_IRQn);
+}
+
void HAL_MspInit() {
__HAL_RCC_SYSCFG_CLK_ENABLE();
__HAL_RCC_PWR_CLK_ENABLE();
@@ -136,6 +174,14 @@ void HAL_UART_MspInit(UART_HandleTypeDef *huart) {
.Alternate = GPIO_AF1_USART1,
});
+ // DMA setup
+ if (HAL_DMA_Init(&hdma_usart1_rx) != HAL_OK) return ws_setup_error_handler();
+ __HAL_DMA1_REMAP(HAL_DMA1_CH1_USART1_RX);
+ __HAL_LINKDMA(huart, hdmarx, hdma_usart1_rx);
+ if (HAL_DMA_Init(&hdma_usart1_tx) != HAL_OK) return ws_setup_error_handler();
+ __HAL_DMA1_REMAP(HAL_DMA1_CH2_USART1_TX);
+ __HAL_LINKDMA(huart, hdmatx, hdma_usart1_tx);
+
// USART1 interrupt Init
HAL_NVIC_SetPriority(USART1_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(USART1_IRQn);
diff --git a/stm32f091/setup.h b/stm32f091/setup.h
index 04fa177..d459635 100644
--- a/stm32f091/setup.h
+++ b/stm32f091/setup.h
@@ -9,6 +9,8 @@
extern I2C_HandleTypeDef hi2c1;
extern UART_HandleTypeDef huart1;
extern UART_HandleTypeDef huart2;
+extern DMA_HandleTypeDef hdma_usart1_rx;
+extern DMA_HandleTypeDef hdma_usart1_tx;
void ws_io_setup();