diff --git a/.idea/workspace.xml b/.idea/workspace.xml index 3928d54..9194319 100644 --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -29,23 +29,15 @@ - - - - + - - - + + - - - + + - - - - + - - + @@ -249,7 +305,8 @@ - + + - @@ -326,9 +399,19 @@ - + + + + file://$PROJECT_DIR$/Core/Src/OneNet.c + 199 + + + @@ -336,15 +419,15 @@ - + - - - + + + diff --git a/Core/Inc/FreeRTOSConfig.h b/Core/Inc/FreeRTOSConfig.h index a0a6387..0a6628b 100644 --- a/Core/Inc/FreeRTOSConfig.h +++ b/Core/Inc/FreeRTOSConfig.h @@ -64,7 +64,7 @@ #define configTICK_RATE_HZ ((TickType_t)1000) #define configMAX_PRIORITIES ( 56 ) #define configMINIMAL_STACK_SIZE ((uint16_t)128) -#define configTOTAL_HEAP_SIZE ((size_t)3600) +#define configTOTAL_HEAP_SIZE ((size_t)8192) #define configMAX_TASK_NAME_LEN ( 16 ) #define configUSE_TRACE_FACILITY 1 #define configUSE_16_BIT_TICKS 0 diff --git a/Core/Inc/esp8266.h b/Core/Inc/esp8266.h index 822bec5..898878d 100644 --- a/Core/Inc/esp8266.h +++ b/Core/Inc/esp8266.h @@ -5,14 +5,15 @@ #define REV_OK 0 //接收完成标志 #define REV_WAIT 1 //接收未完成标志 - -void ESP8266_Init(void); +void ESP8266_Init(int isSmartConfig); +void ESP8266_SmartConfig(void); void ESP8266_Clear(void); void ESP8266_SendData(unsigned char* data, unsigned short len); unsigned char* ESP8266_GetIPD(unsigned short timeOut); +unsigned char* ESP8266_GetIPD_soft(unsigned short timeOut); #endif diff --git a/Core/Inc/main.h b/Core/Inc/main.h index 54feb38..876ea5b 100644 --- a/Core/Inc/main.h +++ b/Core/Inc/main.h @@ -53,8 +53,7 @@ extern "C" { void Error_Handler(void); /* USER CODE BEGIN EFP */ -void KeyScan(void); -void Display_IM1281B(void); + /* USER CODE END EFP */ /* Private defines -----------------------------------------------------------*/ diff --git a/Core/Src/esp8266.c b/Core/Src/esp8266.c index d16e94e..ba7f96f 100644 --- a/Core/Src/esp8266.c +++ b/Core/Src/esp8266.c @@ -12,12 +12,13 @@ #include #include +#include "cmsis_os.h" +#include "cmsis_os2.h" -#define ESP8266_WIFI_INFO "AT+CWJAP=\"Redmi K20 Pro Premium\",\"11223344\"\r\n" +// #define ESP8266_WIFI_INFO "AT+CWJAP=\"Timo\",\"11223344\"\r\n" #define ESP8266_ONENET_INFO "AT+CIPSTART=\"TCP\",\"183.230.40.96\",1883\r\n" - unsigned char esp8266_buf[128]; unsigned short esp8266_cnt = 0, esp8266_cntPre = 0; @@ -172,67 +173,83 @@ unsigned char* ESP8266_GetIPD(unsigned short timeOut) } } - HAL_Delay(5); //延时等待 + HAL_Delay(5); } while (timeOut--); return NULL; //超时还未找到,返回空指针 } -//========================================================== -// 函数名称: ESP8266_Init -// -// 函数功能: 初始化ESP8266 -// -// 入口参数: 无 -// -// 返回参数: 无 -// -// 说明: -//========================================================== -void ESP8266_Init(void) +unsigned char* ESP8266_GetIPD_soft(unsigned short timeOut) { - // GPIO_InitTypeDef GPIO_Initure; - // - // RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); + char* ptrIPD = NULL; - // //ESP8266复位引脚 - // GPIO_Initure.GPIO_Mode = GPIO_Mode_Out_PP; - // GPIO_Initure.GPIO_Pin = GPIO_Pin_5; //GPIOB5-复位 - // GPIO_Initure.GPIO_Speed = GPIO_Speed_50MHz; - // GPIO_Init(GPIOB, &GPIO_Initure); - // - // GPIO_WriteBit(GPIOB, GPIO_Pin_5, Bit_RESET); - // HAL_Delay(250); - // GPIO_WriteBit(GPIOB, GPIO_Pin_5, Bit_SET); - // HAL_Delay(500); + do + { + if (ESP8266_WaitRecive() == REV_OK) //如果接收完成 + { + ptrIPD = strstr((char*)esp8266_buf, "IPD,"); //搜索“IPD”头 + if (ptrIPD == NULL) //如果没找到,可能是IPD头的延迟,还是需要等待一会,但不会超过设定的时间 + { + //printf("\"IPD\" not found\r\n"); + } + else + { + ptrIPD = strchr(ptrIPD, ':'); //找到':' + if (ptrIPD != NULL) + { + ptrIPD++; + return (unsigned char*)(ptrIPD); + } + else + return NULL; + } + } - // HAL_GPIO_WritePin(ESP_RST_GPIO_Port,ESP_RST_Pin,GPIO_PIN_RESET); - // HAL_Delay(250); - // HAL_GPIO_WritePin(ESP_RST_GPIO_Port,ESP_RST_Pin,GPIO_PIN_SET); - // HAL_Delay(500); + osDelay(5); + } + while (timeOut--); - ESP8266_Clear(); - - // printf("1. AT\r\n"); - while (ESP8266_SendCmd("AT\r\n", "OK")) - HAL_Delay(1000); - - // printf("2. CWMODE\r\n"); - while (ESP8266_SendCmd("AT+CWMODE=1\r\n", "OK")) - HAL_Delay(1000); - - // printf("3. CWJAP\r\n"); - while (ESP8266_SendCmd(ESP8266_WIFI_INFO, "GOT IP")) - HAL_Delay(1000); - - // printf("4. CIPSTART\r\n"); - while (ESP8266_SendCmd(ESP8266_ONENET_INFO, "CONNECT")) - HAL_Delay(1000); - - // printf("5. ESP8266 Init OK\r\n"); + return NULL; //超时还未找到,返回空指针 } +void ESP8266_Init(const int isSmartConfig) +{ + ESP8266_Clear(); + + // reset ESP8266 + while (ESP8266_SendCmd("AT+RST\r\n", "ready")) HAL_Delay(500); + // make sure ESP is up + while (ESP8266_SendCmd("AT\r\n", "OK")) HAL_Delay(500); + // set auto connect to AP + while (ESP8266_SendCmd("AT+CWAUTOCONN=1\r\n", "OK")) HAL_Delay(500); + // set CWMODE + while (ESP8266_SendCmd("AT+CWMODE=1\r\n", "OK")) HAL_Delay(500); + + if (isSmartConfig) + { + ESP8266_SmartConfig(); + } + else + { + // connect to built-in AP + // while (ESP8266_SendCmd(ESP8266_WIFI_INFO, "GOT IP")) HAL_Delay(1000); + // wait until WiFi is up + while (ESP8266_SendCmd("AT\r\n", "GOT IP")) HAL_Delay(1000); + } + // connect to OneNet via TCP + while (ESP8266_SendCmd(ESP8266_ONENET_INFO, "CONNECT")) HAL_Delay(1000); +} + +void ESP8266_SmartConfig(void) +{ + // start smart config + while (ESP8266_SendCmd("AT+CWSTARTSMART=1\r\n", "OK")) HAL_Delay(500); + // wait for smart config to finish + while (ESP8266_SendCmd("AT\r\n", "smartconfig connected wifi")) HAL_Delay(500); + // stop smart config + while (ESP8266_SendCmd("AT+CWSTOPSMART\r\n", "OK")) HAL_Delay(500); +} //========================================================== // 函数名称: ESP8266_IRQHandler diff --git a/Core/Src/freertos.c b/Core/Src/freertos.c index a2b0eec..e110b5d 100644 --- a/Core/Src/freertos.c +++ b/Core/Src/freertos.c @@ -25,8 +25,15 @@ /* Private includes ----------------------------------------------------------*/ /* USER CODE BEGIN Includes */ +#include + #include "esp8266.h" #include "OneNet.h" +#include "oled.h" +#include "stm32f1xx_hal.h" +#include +#include "retarget.h" +#include "timers.h" /* USER CODE END Includes */ /* Private typedef -----------------------------------------------------------*/ @@ -36,7 +43,10 @@ /* Private define ------------------------------------------------------------*/ /* USER CODE BEGIN PD */ - +#define K1 HAL_GPIO_ReadPin(KEY1_GPIO_Port, KEY1_Pin) +#define K2 HAL_GPIO_ReadPin(KEY2_GPIO_Port, KEY2_Pin) +#define K3 HAL_GPIO_ReadPin(KEY3_GPIO_Port, KEY3_Pin) +#define K4 HAL_GPIO_ReadPin(KEY4_GPIO_Port, KEY4_Pin) /* USER CODE END PD */ /* Private macro -------------------------------------------------------------*/ @@ -46,13 +56,13 @@ /* Private variables ---------------------------------------------------------*/ /* USER CODE BEGIN Variables */ - +char ONENET_CONNECTED = 0; /* USER CODE END Variables */ /* Definitions for defaultTask */ osThreadId_t defaultTaskHandle; const osThreadAttr_t defaultTask_attributes = { .name = "defaultTask", - .stack_size = 128 * 4, + .stack_size = 256 * 4, .priority = (osPriority_t) osPriorityNormal, }; /* Definitions for keyScanTask */ @@ -62,22 +72,23 @@ const osThreadAttr_t keyScanTask_attributes = { .stack_size = 128 * 4, .priority = (osPriority_t) osPriorityNormal, }; -/* Definitions for dataHandler */ -osThreadId_t dataHandlerHandle; -const osThreadAttr_t dataHandler_attributes = { - .name = "dataHandler", - .stack_size = 128 * 4, +/* Definitions for cmdTask */ +osThreadId_t cmdTaskHandle; +const osThreadAttr_t cmdTask_attributes = { + .name = "cmdTask", + .stack_size = 256 * 4, .priority = (osPriority_t) osPriorityNormal, }; /* Private function prototypes -----------------------------------------------*/ /* USER CODE BEGIN FunctionPrototypes */ - +void KeyScan(void); +void Display_IM1281B(void); /* USER CODE END FunctionPrototypes */ void StartDefaultTask(void *argument); void startKeyScanTask(void *argument); -void startDataHandler(void *argument); +void startCmdTask(void *argument); void MX_FREERTOS_Init(void); /* (MISRA C 2004 rule 8.1) */ @@ -88,7 +99,21 @@ void MX_FREERTOS_Init(void); /* (MISRA C 2004 rule 8.1) */ */ void MX_FREERTOS_Init(void) { /* USER CODE BEGIN Init */ + OLED_ShowString(0,0,"initializing...",12); + int const isSmartConfigMode = !HAL_GPIO_ReadPin(KEY1_GPIO_Port, KEY1_Pin); + + if (isSmartConfigMode) OLED_ShowString(0,0,"smartConfigMode",12); + ESP8266_Init(isSmartConfigMode); + + OLED_ShowString(0, 0, "connectOneNet", 12); + + while (OneNet_DevLink()) {} + OneNET_Subscribe(); + ONENET_CONNECTED = 1; + + OLED_ShowString(0,0,"OneNet online ",12); + HAL_GPIO_WritePin(LED0_GPIO_Port, LED0_Pin, GPIO_PIN_RESET); /* USER CODE END Init */ /* USER CODE BEGIN RTOS_MUTEX */ @@ -114,8 +139,8 @@ void MX_FREERTOS_Init(void) { /* creation of keyScanTask */ keyScanTaskHandle = osThreadNew(startKeyScanTask, NULL, &keyScanTask_attributes); - /* creation of dataHandler */ - dataHandlerHandle = osThreadNew(startDataHandler, NULL, &dataHandler_attributes); + /* creation of cmdTask */ + cmdTaskHandle = osThreadNew(startCmdTask, NULL, &cmdTask_attributes); /* USER CODE BEGIN RTOS_THREADS */ /* add threads, ... */ @@ -140,7 +165,16 @@ void StartDefaultTask(void *argument) /* Infinite loop */ for(;;) { - osDelay(1); + IM_ReadFlag = 1; //抄读标志 + IM_Read(); + + osDelay(500); + + OneNet_SendData(); + osDelay(500); + ESP8266_Clear(); + + Display_IM1281B(); } /* USER CODE END StartDefaultTask */ } @@ -163,36 +197,97 @@ void startKeyScanTask(void *argument) /* USER CODE END startKeyScanTask */ } -/* USER CODE BEGIN Header_startDataHandler */ +/* USER CODE BEGIN Header_startCmdTask */ /** -* @brief Function implementing the dataHandler thread. +* @brief Function implementing the cmdTask thread. * @param argument: Not used * @retval None */ -/* USER CODE END Header_startDataHandler */ -void startDataHandler(void *argument) +/* USER CODE END Header_startCmdTask */ +void startCmdTask(void *argument) { - /* USER CODE BEGIN startDataHandler */ + /* USER CODE BEGIN startCmdTask */ /* Infinite loop */ for(;;) { - HAL_GPIO_TogglePin(LED0_GPIO_Port, LED0_Pin); - IM_ReadFlag = 1; //抄读标志 - IM_Read(); - - osDelay(500); - - // OneNet_SendData(); - // osDelay(500); - // ESP8266_Clear(); - - Display_IM1281B(); + if (ONENET_CONNECTED) + { + uint8_t* dataPtr = ESP8266_GetIPD_soft(0); + if (dataPtr != NULL) + { + OneNet_RevPro(dataPtr); + } + } } - /* USER CODE END startDataHandler */ + /* USER CODE END startCmdTask */ } /* Private application code --------------------------------------------------*/ /* USER CODE BEGIN Application */ +void KeyScan(void) +{ + if (K1 == GPIO_PIN_RESET) + { + // HAL_Delay(5); + osDelay(5); + if (K1 == GPIO_PIN_RESET) + { + HAL_GPIO_TogglePin(RELAY1_GPIO_Port, RELAY1_Pin); + } + while (K1 == GPIO_PIN_RESET); + } + if (K2 == GPIO_PIN_RESET) + { + // HAL_Delay(5); + osDelay(5); + if (K2 == GPIO_PIN_RESET) + { + HAL_GPIO_TogglePin(RELAY1_GPIO_Port, RELAY1_Pin); + } + while (K2 == GPIO_PIN_RESET); + } + if (K3 == GPIO_PIN_RESET) + { + // HAL_Delay(5); + osDelay(5); + if (K3 == GPIO_PIN_RESET) + { + HAL_GPIO_TogglePin(RELAY1_GPIO_Port, RELAY1_Pin); + } + while (K3 == GPIO_PIN_RESET); + } + if (K4 == GPIO_PIN_RESET) + { + // HAL_Delay(5); + osDelay(5); + if (K4 == GPIO_PIN_RESET) + { + HAL_GPIO_TogglePin(RELAY1_GPIO_Port, RELAY1_Pin); + } + while (K4 == GPIO_PIN_RESET); + } +} +void Display_IM1281B(void) +{ + OLED_ShowString(0, 0, "Volt:", 12); + OLED_ShowString(0, 2, "Curr:", 12); + OLED_ShowString(0, 4, "Pwr: ", 12); + OLED_ShowString(0, 6, "Eng: ", 12); + + char buffer[16]; + + snprintf(buffer, sizeof(buffer), "%.2fV", IM_Volt * 0.0001); + OLED_ShowString(40, 0, buffer, 12); + + snprintf(buffer, sizeof(buffer), "%.2fA", IM_Curr * 0.0001); + OLED_ShowString(40, 2, buffer, 12); + + snprintf(buffer, sizeof(buffer), "%.2fW", IM_Power * 0.0001); + OLED_ShowString(40, 4, buffer, 12); + + snprintf(buffer, sizeof(buffer), "%.3fKWh", IM_Energy * 0.0001); + OLED_ShowString(40, 6, buffer, 12); +} /* USER CODE END Application */ diff --git a/Core/Src/main.c b/Core/Src/main.c index d5e9f37..a3877c8 100644 --- a/Core/Src/main.c +++ b/Core/Src/main.c @@ -44,10 +44,7 @@ /* Private define ------------------------------------------------------------*/ /* USER CODE BEGIN PD */ -#define K1 HAL_GPIO_ReadPin(KEY1_GPIO_Port, KEY1_Pin) -#define K2 HAL_GPIO_ReadPin(KEY2_GPIO_Port, KEY2_Pin) -#define K3 HAL_GPIO_ReadPin(KEY3_GPIO_Port, KEY3_Pin) -#define K4 HAL_GPIO_ReadPin(KEY4_GPIO_Port, KEY4_Pin) + /* USER CODE END PD */ /* Private macro -------------------------------------------------------------*/ @@ -60,8 +57,6 @@ /* USER CODE BEGIN PV */ extern unsigned short esp8266_cnt; extern unsigned char esp8266_buf[128]; -char ONENET_CONNECTED = 0; -uint8_t* dataPtr; uint8_t* UART1_RxData[40]; uint8_t UART2_RxData; @@ -86,72 +81,7 @@ void MX_FREERTOS_Init(void); /* Private user code ---------------------------------------------------------*/ /* USER CODE BEGIN 0 */ -void KeyScan(void) -{ - if (K1 == GPIO_PIN_RESET) - { - // HAL_Delay(5); - osDelay(5); - if (K1 == GPIO_PIN_RESET) - { - HAL_GPIO_TogglePin(RELAY1_GPIO_Port, RELAY1_Pin); - } - while (K1 == GPIO_PIN_RESET); - } - if (K2 == GPIO_PIN_RESET) - { - // HAL_Delay(5); - osDelay(5); - if (K2 == GPIO_PIN_RESET) - { - HAL_GPIO_TogglePin(RELAY1_GPIO_Port, RELAY1_Pin); - } - while (K2 == GPIO_PIN_RESET); - } - if (K3 == GPIO_PIN_RESET) - { - // HAL_Delay(5); - osDelay(5); - if (K3 == GPIO_PIN_RESET) - { - HAL_GPIO_TogglePin(RELAY1_GPIO_Port, RELAY1_Pin); - } - while (K3 == GPIO_PIN_RESET); - } - if (K4 == GPIO_PIN_RESET) - { - // HAL_Delay(5); - osDelay(5); - if (K4 == GPIO_PIN_RESET) - { - HAL_GPIO_TogglePin(RELAY1_GPIO_Port, RELAY1_Pin); - } - while (K4 == GPIO_PIN_RESET); - } -} -void Display_IM1281B(void) -{ - OLED_ShowString(0, 0, "Volt:", 12); - OLED_ShowString(0, 2, "Curr:", 12); - OLED_ShowString(0, 4, "Pwr: ", 12); - OLED_ShowString(0, 6, "Eng: ", 12); - - char buffer[16]; - - snprintf(buffer, sizeof(buffer), "%.2fV", IM_Volt * 0.0001); - OLED_ShowString(40, 0, buffer, 12); - - snprintf(buffer, sizeof(buffer), "%.2fA", IM_Curr * 0.0001); - OLED_ShowString(40, 2, buffer, 12); - - snprintf(buffer, sizeof(buffer), "%.2fW", IM_Power * 0.0001); - OLED_ShowString(40, 4, buffer, 12); - - snprintf(buffer, sizeof(buffer), "%.3fKWh", IM_Energy * 0.0001); - OLED_ShowString(40, 6, buffer, 12); - -} /* USER CODE END 0 */ /** @@ -192,31 +122,22 @@ int main(void) /* USER CODE BEGIN 2 */ // Retarget uart - RetargetInit(&huart1); + // RetargetInit(&huart1); // Init OLED OLED_Init(); OLED_Clear(); - OLED_ShowString(0,0,"initializing...",12); - // HAL_TIM_Base_Start_IT(&htim1); // HAL_TIM_Base_Start_IT(&htim3); - HAL_UARTEx_ReceiveToIdle_IT(&huart1, (uint8_t*)UART1_RxData, 40); - HAL_UART_Receive_IT(&huart2, &UART2_RxData, 1); - - ESP8266_Init(); - while (OneNet_DevLink()) {} - OneNET_Subscribe(); - ONENET_CONNECTED = 1; - // Init RC522 MFRC_Init(); PCD_Reset(); - OLED_ShowString(0,0,"OneNet online ",12); - HAL_GPIO_WritePin(LED0_GPIO_Port, LED0_Pin, GPIO_PIN_RESET); + HAL_UARTEx_ReceiveToIdle_IT(&huart1, (uint8_t*)UART1_RxData, 40); + HAL_UART_Receive_IT(&huart2, &UART2_RxData, 1); + /* USER CODE END 2 */ /* Init scheduler */ @@ -404,17 +325,17 @@ void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) // if(htim->Instance == TIM1){ // KeyScan(); // } - if (htim->Instance == TIM3) - { - if (ONENET_CONNECTED) - { - dataPtr = ESP8266_GetIPD(0); - if (dataPtr != NULL) - { - OneNet_RevPro(dataPtr); - } - } - } + // if (htim->Instance == TIM3) + // { + // if (ONENET_CONNECTED) + // { + // dataPtr = ESP8266_GetIPD(0); + // if (dataPtr != NULL) + // { + // OneNet_RevPro(dataPtr); + // } + // } + // } /* USER CODE END Callback 0 */ if (htim->Instance == TIM4) { diff --git a/IntelliChargingPile.ioc b/IntelliChargingPile.ioc index 4487189..893610d 100644 --- a/IntelliChargingPile.ioc +++ b/IntelliChargingPile.ioc @@ -4,8 +4,8 @@ CAD.pinconfig=Dual CAD.provider= FREERTOS.FootprintOK=true FREERTOS.IPParameters=Tasks01,configUSE_NEWLIB_REENTRANT,FootprintOK,configTOTAL_HEAP_SIZE -FREERTOS.Tasks01=defaultTask,24,128,StartDefaultTask,Default,NULL,Dynamic,NULL,NULL;keyScanTask,24,128,startKeyScanTask,Default,NULL,Dynamic,NULL,NULL;dataHandler,24,128,startDataHandler,Default,NULL,Dynamic,NULL,NULL -FREERTOS.configTOTAL_HEAP_SIZE=3600 +FREERTOS.Tasks01=defaultTask,24,256,StartDefaultTask,Default,NULL,Dynamic,NULL,NULL;keyScanTask,24,128,startKeyScanTask,Default,NULL,Dynamic,NULL,NULL;cmdTask,24,256,startCmdTask,Default,NULL,Dynamic,NULL,NULL +FREERTOS.configTOTAL_HEAP_SIZE=8192 FREERTOS.configUSE_NEWLIB_REENTRANT=1 File.Version=6 GPIO.groupedBy=Group By Peripherals @@ -236,3 +236,4 @@ VP_TIM1_VS_ClockSourceINT.Signal=TIM1_VS_ClockSourceINT VP_TIM3_VS_ClockSourceINT.Mode=Internal VP_TIM3_VS_ClockSourceINT.Signal=TIM3_VS_ClockSourceINT board=custom +rtos.0.ip=FREERTOS