Procházet zdrojové kódy

SOS按一下就发送MAC地址

ZhaoSai před 1 měsícem
rodič
revize
cea01b4d02
7 změnil soubory, kde provedl 413 přidání a 252 odebrání
  1. 1 1
      CMakeLists.txt
  2. 20 1
      Core/Inc/E52.h
  3. 1 1
      Core/Inc/main.h
  4. 2 2
      Core/Inc/stm32f1xx_it.h
  5. 23 0
      Core/Src/E52.c
  6. 298 245
      Core/Src/main.c
  7. 68 2
      Core/Src/stm32f1xx_it.c

+ 1 - 1
CMakeLists.txt

@@ -20,7 +20,7 @@ endif()
 
 # Set the project name
 set(CMAKE_PROJECT_NAME lora_bl)
-
+include("cmake/gcc-arm-none-eabi.cmake")
 # Enable compile command to ease indexing with e.g. clangd
 set(CMAKE_EXPORT_COMPILE_COMMANDS TRUE)
 

+ 20 - 1
Core/Inc/E52.h

@@ -176,10 +176,27 @@ typedef struct __attribute__((packed)){
     uint8_t frame_tail_H;    // 帧尾高字节
     uint8_t frame_tail_L;    // 帧尾低字节
 } SendSOS_structure;
-void E52_Send_SOS_Fun(uint8_t i,uint8_t finishData);
 
 
 
+void E52_Send_SOS_Fun(uint8_t i,uint8_t finishData);
+
+typedef struct __attribute__((packed)){
+
+uint8_t frame_header_H;     // 帧头高字节
+uint8_t frame_header_L;     // 帧头低字节
+uint8_t function_code;      // 功能码
+uint8_t badge_addr_high;    //胸牌地址高字节
+uint8_t badge_addr_low;     //胸牌地址低字节
+uint8_t mac_addr[6];            //蓝牙数据
+uint8_t finish_send;        // 是否完成发送
+uint8_t target_addr_H;       // 目标地址高字节
+uint8_t target_addr_L;   // 目标地址低字节
+uint8_t frame_tail_H;    // 帧尾高字节
+uint8_t frame_tail_L;    // 帧尾低字节
+} SendMac_structure;
+
+void E52_Send_MAC_Fun(uint8_t * mac ,uint8_t i);
 
 void E52_Analyze_Data(void);
 void E52_Heartbeat_Fun(void);
@@ -188,6 +205,8 @@ void E52_Heartbeat_Fun(void);
 void E52_CONFIG_BROADCAST_TYPE_FUN(uint8_t);
 void E104_BT5005A_DST_ADDR_Fun(void);
 
+uint8_t Read_LoRa_Power_Status();//读取lora电源状态
+
 //开启lora电源
 void E52_CtlPowerOn_Fun();
 //关闭lora电源

+ 1 - 1
Core/Inc/main.h

@@ -86,7 +86,7 @@ extern UART_HandleTypeDef huart1;
 extern UART_HandleTypeDef huart2;
 extern UART_HandleTypeDef huart3;
 extern DMA_HandleTypeDef hdma_usart2_rx;
-
+extern  uint8_t Mac_Addr[6];
 void Flash_Write_LoraAddr(uint8_t addrH, uint8_t addrL);
 /* USER CODE END Private defines */
 

+ 2 - 2
Core/Inc/stm32f1xx_it.h

@@ -27,8 +27,8 @@ extern "C" {
 
 /* Private includes ----------------------------------------------------------*/
 /* USER CODE BEGIN Includes */
-
-/* USER CODE END Includes */
+/* USER CODE BEGIN EV */
+/* USER CODE END EV */
 
 /* Exported types ------------------------------------------------------------*/
 /* USER CODE BEGIN ET */

+ 23 - 0
Core/Src/E52.c

@@ -8,10 +8,17 @@ Device_structure deviceInfo;
 
 
 void E52_CtlPowerOn_Fun() {
+    printf("打开LORA模块电源\r\n");
     HAL_GPIO_WritePin(POWER_ON_GPIO_Port, CTL_LORA_POWER_Pin, GPIO_PIN_RESET);
 }
 
+ uint8_t Read_LoRa_Power_Status() {
+    return HAL_GPIO_ReadPin(POWER_ON_GPIO_Port, CTL_LORA_POWER_Pin);
+}
+
+
 void E52_CtlPowerOff_Fun() {
+    printf("关闭LORA模块电源\r\n");
     HAL_GPIO_WritePin(POWER_ON_GPIO_Port, CTL_LORA_POWER_Pin, GPIO_PIN_SET);
 }
 
@@ -120,6 +127,22 @@ void E52_Send_SOS_Fun(uint8_t i,uint8_t finishData) {
     // TODO: command:04
 }
 
+
+void E52_Send_MAC_Fun(uint8_t * mac ,uint8_t i)
+{
+    SendMac_structure SendMAC_structure;
+    SendMAC_structure.frame_header_H = 0x55;
+    SendMAC_structure.frame_header_L = 0xAA;
+    SendMAC_structure.function_code = 0x05;
+    SendMAC_structure.badge_addr_high = deviceInfo.loraDeviceAddress_H;
+    SendMAC_structure.badge_addr_low = deviceInfo.loraDeviceAddress_L;
+    memcpy(SendMAC_structure.mac_addr, mac, i);
+    SendMAC_structure.frame_tail_H = 0xFF;
+    SendMAC_structure.frame_tail_L = 0xEE;
+    // printf("blData size = %d\n", sizeof(SendSOS_structure));
+    HAL_UART_Transmit(&huart2, (uint8_t *)&SendMAC_structure, sizeof(SendMAC_structure), HAL_MAX_DELAY);
+
+}
 /**
  *
  *后台向设备发送数据

+ 298 - 245
Core/Src/main.c

@@ -65,14 +65,14 @@ uint8_t uart2_rx_byte[10] = {0};
 uint8_t loraSendNextDataFlag = 0;
 uint8_t baseRandomTimer = 3*60;
 uint8_t RandomTimer= 3*60;
-
+uint8_t Mac_Addr[6];
 RingBuffer queue1;
 RingBuffer queue2;
 
 // uint8_t loraDataErrorCount = 0;
 uint8_t workMode = 0;  // 0: 接收蓝牙数据 1: 使用lora发生数据 2:等待间隔时间
 uint8_t receiveBlDataCount = 0;
-
+uint8_t key_pressed_flag = 0;
 /* USER CODE END PV */
 
 /* Private function prototypes -----------------------------------------------*/
@@ -262,8 +262,7 @@ int main(void)
   /* USER CODE BEGIN 2 */
 
   powerOn();
-  // E52_CtlPowerOn_Fun();
-  E52_CtlPowerOff_Fun();
+
 
   // 启动 USART2 DMA 接收
   HAL_UART_Receive_DMA(&huart3, rx_buf, sizeof(rx_buf));
@@ -272,7 +271,7 @@ int main(void)
   __HAL_UART_ENABLE_IT(&huart2, UART_IT_IDLE);
   Flash_Read_LoraAddr(&deviceInfo.loraDeviceAddress_H, &deviceInfo.loraDeviceAddress_L);
   printf("deviceInfo.loraDeviceAddress_H:%02X,deviceInfo.loraDeviceAddress_L:%02X\r\n", deviceInfo.loraDeviceAddress_H, deviceInfo.loraDeviceAddress_L);
-  HAL_Delay(4000);
+  HAL_Delay(2000);
   E104_BT5005A_ROLE1_Fun();
   HAL_Delay(2000);
 
@@ -287,10 +286,12 @@ int main(void)
 
   // E104_BT5005A_SLEEP_Fun();
   // HAL_Delay(2000);
-
+   E104_BT5005A_MAC_Fun(); //用来打印MAC地址
+  HAL_Delay(2000);
   printf("初始化复位\r\n");
   E104_BT5005A_RESET_Fun();
   HAL_Delay(2000);
+
   E104_BT5005A_SLEEP_Fun();
   HAL_Delay(2000);
 
@@ -298,254 +299,305 @@ int main(void)
   // 进入睡眠模式,等待中断唤醒
   // HAL_PWR_EnterSTOPMode(PWR_MAINREGULATOR_ON, PWR_SLEEPENTRY_WFI);
   // HAL_PWR_EnterSLEEPMode(PWR_MAINREGULATOR_ON, PWR_SLEEPENTRY_WFI);
-  HAL_PWR_EnterSTANDBYMode();//这个是进入待机模式
+  // HAL_PWR_EnterSTANDBYMode();//这个是进入待机模式
   // 醒来后恢复 SysTick
-  HAL_ResumeTick();
-
-  while (TRUE) {
-    // HAL_Delay(1000);
-  }
-  if (deviceInfo.loraDeviceAddress_H == 0xFF || deviceInfo.loraDeviceAddress_L == 0xFF || deviceInfo.loraDeviceAddress_H == 0x00 || deviceInfo.loraDeviceAddress_L == 0x00) { // 未设置Lora地址,应该是初次启动,配置Lora地址蓝牙等
-    HAL_Delay(4000);
-    printf("开始初始化\r\n");
-    printf("切换为观察者模式\r\n");
-    E104_BT5005A_ROLE1_Fun();
-    HAL_Delay(2000);
-    printf("初始化扫描间隔\r\n");
-    E104_BT5005A_SCANINTV_Fun();
-    HAL_Delay(2000);
-    printf("初始化扫描窗口\r\n");
-    E104_BT5005A_SCANWND_Fun();
-    HAL_Delay(2000);
-
-
-    printf("初始化复位\r\n");
-    E104_BT5005A_RESET_Fun();
-    HAL_Delay(2000);
-    Device_Info_Init_Fun();
-    printf("开启Lora广播模块\r\n");
-    E52_CONFIG_BROADCAST_TYPE_FUN(BROADCAST_ALL);
-    HAL_Delay(2000);
-    const char *lora_msg1 = "AT+TYPE=1";
-    HAL_UART_Transmit(&huart2, (uint8_t *)lora_msg1, strlen(lora_msg1), HAL_MAX_DELAY);
-    HAL_Delay(2000);
-    const char *lora_msg3 = "AT+HEAD=0";
-    HAL_UART_Transmit(&huart2, (uint8_t *)lora_msg3, strlen(lora_msg3), HAL_MAX_DELAY);
-    HAL_Delay(2000);
-    const char *lora_msg4 = "AT+SRC_ADDR=?";
-    HAL_UART_Transmit(&huart2, (uint8_t *)lora_msg4, strlen(lora_msg4), HAL_MAX_DELAY);
-    HAL_Delay(2000);
-
-    while (TRUE) {
-      if (deviceInfo.loraDeviceAddress_H == 0xFF && deviceInfo.loraDeviceAddress_L == 0xFF) {
-        HAL_UART_Transmit(&huart2, (uint8_t *)lora_msg4, strlen(lora_msg4), HAL_MAX_DELAY);
-        HAL_Delay(4000);
-      }else {
-        break;
-      }
-    }
-  }else {
-    printf("已配置\r\n");
-  }
-
-  srand(HAL_GetTick());
-  /* USER CODE END 2 */
-
-  /* Infinite loop */
-  /* USER CODE BEGIN WHILE */
-
-  printf("Device is ready\r\n");
-  printf("设备地址:0x%02X%02X\n", deviceInfo.loraDeviceAddress_H, deviceInfo.loraDeviceAddress_L);
-  uint8_t i = 0;
-  // uint8_t ledShanshuo = 0;
-  while (1)
+  // HAL_ResumeTick();
+ uint8_t Count = 0;
+      printf("start to sleep\r\n");
+      //进入睡眠模式
+    HAL_SuspendTick();
+    HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_SLEEPENTRY_WFI);
+    HAL_ResumeTick();
+    SystemClock_Config(); // STOP 模式后必须恢复时钟
+  while (TRUE)
   {
-    /* USER CODE END WHILE */
-
-    /* USER CODE BEGIN 3 */
-
-    // 检查是否接收到"心跳"命令,且设备在线
-    if (!deviceInfo.isOnline) {
-      RTC_TimeTypeDef now = {0};
-      HAL_RTC_GetTime(&hrtc, &now, RTC_FORMAT_BIN);
 
-      int pressedSeconds = (now.Hours * 3600 + now.Minutes * 60 + now.Seconds)
-                         - (Online_struct.Hours * 3600 + Online_struct.Minutes * 60 + Online_struct.Seconds);
-      if (pressedSeconds < 0) pressedSeconds += 24 * 3600;
 
-      // printf("发送上报时间 按下持续时间: %d 秒\r\n", pressedSeconds);
-
-      if (pressedSeconds >= 10) {
-        E52_Heartbeat_Fun();
-        // printf("111111\r\n");
-        Online_struct = now;  // 记录上报时间
-      }
-    }
-
-    if (deviceInfo.isSOS) {
-      deviceInfo.isOnline = TRUE;
-      RTC_TimeTypeDef now = {0};
-      HAL_RTC_GetTime(&hrtc, &now, RTC_FORMAT_BIN);
-
-      int pressedSeconds = (now.Hours * 3600 + now.Minutes * 60 + now.Seconds)
-                         - (SOS_struct.Hours * 3600 + SOS_struct.Minutes * 60 + SOS_struct.Seconds);
-      if (pressedSeconds < 0) pressedSeconds += 24 * 3600;
-      printf("SOS按下时间为:%d\r\n",pressedSeconds);
-
-      if (pressedSeconds >= 20) { //如果出现异常情况,导致SOS一直处于被按下情况,关闭SOS。
-        deviceInfo.isSOS = FALSE;
-      }
-    }
-
-    if (GET_CMD( deviceInfo.commandFromCloud) == IDLE || GET_STEP(deviceInfo.commandFromCloud) == STEP_INIT) {
-      // printf("为idle状态的时间为\r\n");
-      RTC_TimeTypeDef now = {0};
-      HAL_RTC_GetTime(&hrtc, &now, RTC_FORMAT_BIN);
-      IDLE_struct = now;  // 记录上报时间
-    }else {
-      RTC_TimeTypeDef now = {0};
-      HAL_RTC_GetTime(&hrtc, &now, RTC_FORMAT_BIN);
-
-      int pressedSeconds = (now.Hours * 3600 + now.Minutes * 60 + now.Seconds)
-                         - (IDLE_struct.Hours * 3600 + IDLE_struct.Minutes * 60 + IDLE_struct.Seconds);
-      if (pressedSeconds < 0) pressedSeconds += 24 * 3600;
-      // printf("不为idle状态的时间为:%d\r\n",pressedSeconds);
-
-      if (pressedSeconds >= 20) {
-        deviceInfo.commandFromCloud = COMBINE_CMD_STEP(IDLE, STEP_INIT);
-        // printf("111111\r\n");
-        IDLE_struct = now;  // 记录上报时间
+    // if (Mac_Addr[0] != 0)
+    // {
+    //   E52_CtlPowerOn_Fun();
+    //   HAL_Delay(1500);
+    //   // for (uint8_t i = 0; i < 6; i++)
+    //   // {
+    //   //   printf("%02x ", Mac_Addr[i]);
+    //   // }
+    //   // printf("\r\n");
+    //   E52_Send_MAC_Fun(Mac_Addr, 6);
+    //   HAL_Delay(1000);
+    //   E52_CtlPowerOff_Fun();
+    // }
+      if (key_pressed_flag)
+      {
+        key_pressed_flag = 0;  // 清除标志
+        Count = 0;
+        if (Read_LoRa_Power_Status() == 1)
+        {
+          E52_CtlPowerOn_Fun();
+          HAL_Delay(2000);
+        }
+        if (Mac_Addr[0] != 0)
+        {
+          printf("模块被唤醒。开始发送自身MAC地址\r\n");
+          E52_Send_MAC_Fun(Mac_Addr, 6);
+        }
       }
+    HAL_Delay(100);
+    Count++;
+    if (Count == 100)
+    {
+      E52_CtlPowerOff_Fun();
+      HAL_SuspendTick();
+      HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_SLEEPENTRY_WFI);
+      HAL_ResumeTick();
+      SystemClock_Config(); // STOP 模式后必须恢复时钟
     }
 
 
 
-    // 解析后台命令
-    if (GET_CMD( deviceInfo.commandFromCloud) == IDLE && GET_STEP(deviceInfo.commandFromCloud) == STEP_VERIFY) {
-      E52_Analyze_Data();
-    }
-
-    // 03:请求蓝牙数据
-    if (((GET_CMD(deviceInfo.commandFromCloud) == REQUEST_BLUETOOTH_DATA && deviceInfo.isOnline ) || deviceInfo.isSOS))  {
-      switch (GET_STEP(deviceInfo.commandFromCloud)) {
-        case REQUEST_BLUETOOTH_DATA_SCAN:
-          Timer_Managment_Fun(&htim4, TIMER_OP_START);
-          deviceInfo.BlDataFlag = BL_START;
-          printf("开启蓝牙扫描\r\n");
-          break;    //扫描蓝牙阶段
-
-        case REQUEST_BLUETOOTH_DATA_SEND:
-          Timer_Managment_Fun(&htim4, TIMER_OP_STOP);
-          deviceInfo.BlDataFlag = BL_STOP;
-          i = 0;
-          while (receiveBlDataCount > i) {
-
-            // printf("发送第%d个蓝牙数据给Lora\r\n", i);
-            if (deviceInfo.loraSendSuccessFlag == 0) {
-              E52_Send_Bl_Data_Fun(i,0x00);
-            }else {
-              continue;
-            }
-            memset(totalData[i], 0, sizeof(totalData[i]));
-            i++;
-          }
-          // printf("发送最后一位,开始发送蓝牙数据给Lora\r\n");
-          E52_Send_Bl_Data_Fun(i,0x01);
-          deviceInfo.commandFromCloud = COMBINE_CMD_STEP(REQUEST_BLUETOOTH_DATA, STEP_COMPLETE);
-          printf("发送完成\r\n");
-          break;          //发送数据阶段
-        case STEP_COMPLETE:
-          receiveBlDataCount = 0;
-          deviceInfo.timeCount = 0;
-          deviceInfo.forwardBLAndLoraDataDuration = 0;
-          i = 0;
-          deviceInfo.commandFromCloud = COMBINE_CMD_STEP(IDLE, STEP_INIT);
-          break;
-
-        default:
-          // 处理未知步骤
-          if (deviceInfo.isSOS) {
-            // HAL_Delay(1000);
-            deviceInfo.commandFromCloud = COMBINE_CMD_STEP(IDLE, STEP_VERIFY);
-            rx_buf_uart2[0] = 0x55;
-            rx_buf_uart2[1] = 0xBB;
-            rx_buf_uart2[2] = 0x03;
-            rx_buf_uart2[3] = deviceInfo.loraDeviceAddress_H;
-            rx_buf_uart2[4] = deviceInfo.loraDeviceAddress_L;
-            rx_buf_uart2[5] = 0x03;
-            rx_buf_uart2[6] = 0xE8;
-            rx_buf_uart2[7] = 0x00;
-            rx_buf_uart2[8] = 0xFF;
-            rx_buf_uart2[9] = 0xEE;
-          }else {
-            receiveBlDataCount = 0;
-            deviceInfo.timeCount = 0;
-            deviceInfo.forwardBLAndLoraDataDuration = 0;
-            i = 0;
-            deviceInfo.commandFromCloud = COMBINE_CMD_STEP(IDLE, STEP_INIT);
-          }
-          break;
-      }
-    }
-
-    // 08:请求心跳数据
-    if (GET_CMD( deviceInfo.commandFromCloud)  == E52_HEARTBEAT && deviceInfo.isOnline) {
-      switch (GET_STEP(deviceInfo.commandFromCloud)) {
-        case HEARTBEAT_SEND:
-          if (deviceInfo.loraSendSuccessFlag == 0) {
-            E52_Heartbeat_Fun();
-          }else {
-            continue;
-          }
-          deviceInfo.commandFromCloud = COMBINE_CMD_STEP(REQUEST_BLUETOOTH_DATA, STEP_COMPLETE);
-          break;
-        case STEP_COMPLETE:
-          deviceInfo.commandFromCloud = COMBINE_CMD_STEP(IDLE, STEP_INIT);
-          break;
-
-        default:
-          deviceInfo.commandFromCloud = COMBINE_CMD_STEP(IDLE, STEP_INIT);
-          printf("收到未知步骤,忽略处理\r\n");
-          break;
-      }
-    }
-
-    // 07:配置E52
-    if (GET_CMD( deviceInfo.commandFromCloud)  == CONFIGURE_E52 && deviceInfo.isOnline) {
-      switch (GET_STEP(deviceInfo.commandFromCloud)) {
-          case CONFIGURE_E52_SET_BROADCAST_TYPE:      //第一步,配置广播类型
-              E52_CONFIG_BROADCAST_TYPE_FUN(deviceInfo.broadcast_type);
-              HAL_Delay(2000);
-              if (deviceInfo.broadcast_type == BROADCAST_ALL) {
-                deviceInfo.commandFromCloud = COMBINE_CMD_STEP(CONFIGURE_E52, STEP_COMPLETE);       //TODO 广播,直接结束.或者进入测试流程。
-              }else {
-                deviceInfo.commandFromCloud = COMBINE_CMD_STEP(CONFIGURE_E52, CONFIGURE_E52_SET_LORA_ADDRESS); //第三步,配置Lora地址
-              }
-          break;
-
-          case CONFIGURE_E52_SET_LORA_ADDRESS:
-              E104_BT5005A_DST_ADDR_Fun();
-              HAL_Delay(2000);
-              deviceInfo.commandFromCloud = COMBINE_CMD_STEP(CONFIGURE_E52, STEP_COMPLETE);       //TODO 广播,直接结束.或者进入测试流程。
-          break;        //如果是单波,多播,配置目标地址
-
-          case STEP_COMPLETE:
-            if (deviceInfo.loraSendSuccessFlag == 0) {
-              E52_Heartbeat_Fun();
-            }else {
-              continue;
-            }
-            deviceInfo.commandFromCloud = COMBINE_CMD_STEP(IDLE, STEP_INIT);
-          break;
-
-          default:
-            printf("未知配置命令\r\n");
-            deviceInfo.commandFromCloud = COMBINE_CMD_STEP(IDLE, STEP_INIT);
-          ;break;
-      }
-    }
 
+    // HAL_Delay(1000);
   }
+  // if (deviceInfo.loraDeviceAddress_H == 0xFF || deviceInfo.loraDeviceAddress_L == 0xFF || deviceInfo.loraDeviceAddress_H == 0x00 || deviceInfo.loraDeviceAddress_L == 0x00) { // 未设置Lora地址,应该是初次启动,配置Lora地址蓝牙等
+  //   HAL_Delay(4000);
+  //   printf("开始初始化\r\n");
+  //   printf("切换为观察者模式\r\n");
+  //   E104_BT5005A_ROLE1_Fun();
+  //   HAL_Delay(2000);
+  //   printf("初始化扫描间隔\r\n");
+  //   E104_BT5005A_SCANINTV_Fun();
+  //   HAL_Delay(2000);
+  //   printf("初始化扫描窗口\r\n");
+  //   E104_BT5005A_SCANWND_Fun();
+  //   HAL_Delay(2000);
+  //
+  //
+  //   printf("初始化复位\r\n");
+  //   E104_BT5005A_RESET_Fun();
+  //   HAL_Delay(2000);
+  //   Device_Info_Init_Fun();
+  //   printf("开启Lora广播模块\r\n");
+  //   E52_CONFIG_BROADCAST_TYPE_FUN(BROADCAST_ALL);
+  //   HAL_Delay(2000);
+  //   const char *lora_msg1 = "AT+TYPE=1";
+  //   HAL_UART_Transmit(&huart2, (uint8_t *)lora_msg1, strlen(lora_msg1), HAL_MAX_DELAY);
+  //   HAL_Delay(2000);
+  //   const char *lora_msg3 = "AT+HEAD=0";
+  //   HAL_UART_Transmit(&huart2, (uint8_t *)lora_msg3, strlen(lora_msg3), HAL_MAX_DELAY);
+  //   HAL_Delay(2000);
+  //   const char *lora_msg4 = "AT+SRC_ADDR=?";
+  //   HAL_UART_Transmit(&huart2, (uint8_t *)lora_msg4, strlen(lora_msg4), HAL_MAX_DELAY);
+  //   HAL_Delay(2000);
+  //
+  //   while (TRUE) {
+  //     if (deviceInfo.loraDeviceAddress_H == 0xFF && deviceInfo.loraDeviceAddress_L == 0xFF) {
+  //       HAL_UART_Transmit(&huart2, (uint8_t *)lora_msg4, strlen(lora_msg4), HAL_MAX_DELAY);
+  //       HAL_Delay(4000);
+  //     }else {
+  //       break;
+  //     }
+  //   }
+  // }else {
+  //   printf("已配置\r\n");
+  // }
+  //
+  // srand(HAL_GetTick());
+  // /* USER CODE END 2 */
+  //
+  // /* Infinite loop */
+  // /* USER CODE BEGIN WHILE */
+  //
+  // printf("Device is ready\r\n");
+  // printf("设备地址:0x%02X%02X\n", deviceInfo.loraDeviceAddress_H, deviceInfo.loraDeviceAddress_L);
+  // uint8_t i = 0;
+  // // uint8_t ledShanshuo = 0;
+  // while (1)
+  // {
+  //   /* USER CODE END WHILE */
+  //
+  //   /* USER CODE BEGIN 3 */
+  //
+  //   // 检查是否接收到"心跳"命令,且设备在线
+  //   if (!deviceInfo.isOnline) {
+  //     RTC_TimeTypeDef now = {0};
+  //     HAL_RTC_GetTime(&hrtc, &now, RTC_FORMAT_BIN);
+  //
+  //     int pressedSeconds = (now.Hours * 3600 + now.Minutes * 60 + now.Seconds)
+  //                        - (Online_struct.Hours * 3600 + Online_struct.Minutes * 60 + Online_struct.Seconds);
+  //     if (pressedSeconds < 0) pressedSeconds += 24 * 3600;
+  //
+  //     // printf("发送上报时间 按下持续时间: %d 秒\r\n", pressedSeconds);
+  //
+  //     if (pressedSeconds >= 10) {
+  //       E52_Heartbeat_Fun();
+  //       // printf("111111\r\n");
+  //       Online_struct = now;  // 记录上报时间
+  //     }
+  //   }
+  //
+  //   if (deviceInfo.isSOS) {
+  //     deviceInfo.isOnline = TRUE;
+  //     RTC_TimeTypeDef now = {0};
+  //     HAL_RTC_GetTime(&hrtc, &now, RTC_FORMAT_BIN);
+  //
+  //     int pressedSeconds = (now.Hours * 3600 + now.Minutes * 60 + now.Seconds)
+  //                        - (SOS_struct.Hours * 3600 + SOS_struct.Minutes * 60 + SOS_struct.Seconds);
+  //     if (pressedSeconds < 0) pressedSeconds += 24 * 3600;
+  //     printf("SOS按下时间为:%d\r\n",pressedSeconds);
+  //
+  //     if (pressedSeconds >= 20) { //如果出现异常情况,导致SOS一直处于被按下情况,关闭SOS。
+  //       deviceInfo.isSOS = FALSE;
+  //     }
+  //   }
+  //
+  //   if (GET_CMD( deviceInfo.commandFromCloud) == IDLE || GET_STEP(deviceInfo.commandFromCloud) == STEP_INIT) {
+  //     // printf("为idle状态的时间为\r\n");
+  //     RTC_TimeTypeDef now = {0};
+  //     HAL_RTC_GetTime(&hrtc, &now, RTC_FORMAT_BIN);
+  //     IDLE_struct = now;  // 记录上报时间
+  //   }else {
+  //     RTC_TimeTypeDef now = {0};
+  //     HAL_RTC_GetTime(&hrtc, &now, RTC_FORMAT_BIN);
+  //
+  //     int pressedSeconds = (now.Hours * 3600 + now.Minutes * 60 + now.Seconds)
+  //                        - (IDLE_struct.Hours * 3600 + IDLE_struct.Minutes * 60 + IDLE_struct.Seconds);
+  //     if (pressedSeconds < 0) pressedSeconds += 24 * 3600;
+  //     // printf("不为idle状态的时间为:%d\r\n",pressedSeconds);
+  //
+  //     if (pressedSeconds >= 20) {
+  //       deviceInfo.commandFromCloud = COMBINE_CMD_STEP(IDLE, STEP_INIT);
+  //       // printf("111111\r\n");
+  //       IDLE_struct = now;  // 记录上报时间
+  //     }
+  //   }
+  //
+  //
+  //
+  //   // 解析后台命令
+  //   if (GET_CMD( deviceInfo.commandFromCloud) == IDLE && GET_STEP(deviceInfo.commandFromCloud) == STEP_VERIFY) {
+  //     E52_Analyze_Data();
+  //   }
+  //
+  //   // 03:请求蓝牙数据
+  //   if (((GET_CMD(deviceInfo.commandFromCloud) == REQUEST_BLUETOOTH_DATA && deviceInfo.isOnline ) || deviceInfo.isSOS))  {
+  //     switch (GET_STEP(deviceInfo.commandFromCloud)) {
+  //       case REQUEST_BLUETOOTH_DATA_SCAN:
+  //         Timer_Managment_Fun(&htim4, TIMER_OP_START);
+  //         deviceInfo.BlDataFlag = BL_START;
+  //         printf("开启蓝牙扫描\r\n");
+  //         break;    //扫描蓝牙阶段
+  //
+  //       case REQUEST_BLUETOOTH_DATA_SEND:
+  //         Timer_Managment_Fun(&htim4, TIMER_OP_STOP);
+  //         deviceInfo.BlDataFlag = BL_STOP;
+  //         i = 0;
+  //         while (receiveBlDataCount > i) {
+  //
+  //           // printf("发送第%d个蓝牙数据给Lora\r\n", i);
+  //           if (deviceInfo.loraSendSuccessFlag == 0) {
+  //             E52_Send_Bl_Data_Fun(i,0x00);
+  //           }else {
+  //             continue;
+  //           }
+  //           memset(totalData[i], 0, sizeof(totalData[i]));
+  //           i++;
+  //         }
+  //         // printf("发送最后一位,开始发送蓝牙数据给Lora\r\n");
+  //         E52_Send_Bl_Data_Fun(i,0x01);
+  //         deviceInfo.commandFromCloud = COMBINE_CMD_STEP(REQUEST_BLUETOOTH_DATA, STEP_COMPLETE);
+  //         printf("发送完成\r\n");
+  //         break;          //发送数据阶段
+  //       case STEP_COMPLETE:
+  //         receiveBlDataCount = 0;
+  //         deviceInfo.timeCount = 0;
+  //         deviceInfo.forwardBLAndLoraDataDuration = 0;
+  //         i = 0;
+  //         deviceInfo.commandFromCloud = COMBINE_CMD_STEP(IDLE, STEP_INIT);
+  //         break;
+  //
+  //       default:
+  //         // 处理未知步骤
+  //         if (deviceInfo.isSOS) {
+  //           // HAL_Delay(1000);
+  //           deviceInfo.commandFromCloud = COMBINE_CMD_STEP(IDLE, STEP_VERIFY);
+  //           rx_buf_uart2[0] = 0x55;
+  //           rx_buf_uart2[1] = 0xBB;
+  //           rx_buf_uart2[2] = 0x03;
+  //           rx_buf_uart2[3] = deviceInfo.loraDeviceAddress_H;
+  //           rx_buf_uart2[4] = deviceInfo.loraDeviceAddress_L;
+  //           rx_buf_uart2[5] = 0x03;
+  //           rx_buf_uart2[6] = 0xE8;
+  //           rx_buf_uart2[7] = 0x00;
+  //           rx_buf_uart2[8] = 0xFF;
+  //           rx_buf_uart2[9] = 0xEE;
+  //         }else {
+  //           receiveBlDataCount = 0;
+  //           deviceInfo.timeCount = 0;
+  //           deviceInfo.forwardBLAndLoraDataDuration = 0;
+  //           i = 0;
+  //           deviceInfo.commandFromCloud = COMBINE_CMD_STEP(IDLE, STEP_INIT);
+  //         }
+  //         break;
+  //     }
+  //   }
+  //
+  //   // 08:请求心跳数据
+  //   if (GET_CMD( deviceInfo.commandFromCloud)  == E52_HEARTBEAT && deviceInfo.isOnline) {
+  //     switch (GET_STEP(deviceInfo.commandFromCloud)) {
+  //       case HEARTBEAT_SEND:
+  //         if (deviceInfo.loraSendSuccessFlag == 0) {
+  //           E52_Heartbeat_Fun();
+  //         }else {
+  //           continue;
+  //         }
+  //         deviceInfo.commandFromCloud = COMBINE_CMD_STEP(REQUEST_BLUETOOTH_DATA, STEP_COMPLETE);
+  //         break;
+  //       case STEP_COMPLETE:
+  //         deviceInfo.commandFromCloud = COMBINE_CMD_STEP(IDLE, STEP_INIT);
+  //         break;
+  //
+  //       default:
+  //         deviceInfo.commandFromCloud = COMBINE_CMD_STEP(IDLE, STEP_INIT);
+  //         printf("收到未知步骤,忽略处理\r\n");
+  //         break;
+  //     }
+  //   }
+  //
+  //   // 07:配置E52
+  //   if (GET_CMD( deviceInfo.commandFromCloud)  == CONFIGURE_E52 && deviceInfo.isOnline) {
+  //     switch (GET_STEP(deviceInfo.commandFromCloud)) {
+  //         case CONFIGURE_E52_SET_BROADCAST_TYPE:      //第一步,配置广播类型
+  //             E52_CONFIG_BROADCAST_TYPE_FUN(deviceInfo.broadcast_type);
+  //             HAL_Delay(2000);
+  //             if (deviceInfo.broadcast_type == BROADCAST_ALL) {
+  //               deviceInfo.commandFromCloud = COMBINE_CMD_STEP(CONFIGURE_E52, STEP_COMPLETE);       //TODO 广播,直接结束.或者进入测试流程。
+  //             }else {
+  //               deviceInfo.commandFromCloud = COMBINE_CMD_STEP(CONFIGURE_E52, CONFIGURE_E52_SET_LORA_ADDRESS); //第三步,配置Lora地址
+  //             }
+  //         break;
+  //
+  //         case CONFIGURE_E52_SET_LORA_ADDRESS:
+  //             E104_BT5005A_DST_ADDR_Fun();
+  //             HAL_Delay(2000);
+  //             deviceInfo.commandFromCloud = COMBINE_CMD_STEP(CONFIGURE_E52, STEP_COMPLETE);       //TODO 广播,直接结束.或者进入测试流程。
+  //         break;        //如果是单波,多播,配置目标地址
+  //
+  //         case STEP_COMPLETE:
+  //           if (deviceInfo.loraSendSuccessFlag == 0) {
+  //             E52_Heartbeat_Fun();
+  //           }else {
+  //             continue;
+  //           }
+  //           deviceInfo.commandFromCloud = COMBINE_CMD_STEP(IDLE, STEP_INIT);
+  //         break;
+  //
+  //         default:
+  //           printf("未知配置命令\r\n");
+  //           deviceInfo.commandFromCloud = COMBINE_CMD_STEP(IDLE, STEP_INIT);
+  //         ;break;
+  //     }
+    // }
+
+  // }
   /* USER CODE END 3 */
 }
 
@@ -839,14 +891,15 @@ static void MX_GPIO_Init(void)
   HAL_GPIO_WritePin(POWER_ON_GPIO_Port, POWER_ON_Pin, GPIO_PIN_SET);
 
   /*Configure GPIO pin Output Level */
-  HAL_GPIO_WritePin(CTL_LORA_POWER_GPIO_Port, CTL_LORA_POWER_Pin, GPIO_PIN_RESET);
+  HAL_GPIO_WritePin(CTL_LORA_POWER_GPIO_Port, CTL_LORA_POWER_Pin, GPIO_PIN_SET);
 
   /*Configure GPIO pin Output Level */
   HAL_GPIO_WritePin(PowerLED_GPIO_Port, PowerLED_Pin, GPIO_PIN_RESET);
 
   /*Configure GPIO pins : SOS_KEY_Pin JUGE_PIN_Pin */
   GPIO_InitStruct.Pin = SOS_KEY_Pin|JUGE_PIN_Pin;
-  GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING_FALLING;
+  // GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING_FALLING;  // 上升沿和下降沿都触发中断
+   GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING;  // 上升沿触发中断
   GPIO_InitStruct.Pull = GPIO_PULLUP;
   HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
 

+ 68 - 2
Core/Src/stm32f1xx_it.c

@@ -73,7 +73,7 @@ extern UART_HandleTypeDef huart3;
 extern TIM_HandleTypeDef htim3;
 
 /* USER CODE BEGIN EV */
-
+extern uint8_t key_pressed_flag ;
 /* USER CODE END EV */
 
 /******************************************************************************/
@@ -345,12 +345,52 @@ void USART2_IRQHandler(void)
   }
   /* USER CODE END USART2_IRQn 1 */
 }
+/**
+  * @brief  解析 AT+MAC? 指令响应
+  * @param  at_response: 输入,UART 接收到的缓冲区
+  * @param  len: 输入,实际接收长度
+  * @param  mac_addr: 输出,解析后的 6 字节 MAC 地址
+  * @retval HAL_StatusTypeDef: HAL_OK(成功)/ HAL_ERROR(失败)
+  */
+HAL_StatusTypeDef BT52_ParseMACResponse(uint8_t *at_response, uint16_t len, uint8_t *mac_addr)
+{
+  if (at_response == NULL || mac_addr == NULL || len < 10) {
+    return HAL_ERROR;
+  }
+
+  // 查找 "+OK=" (ASCII)
+  uint8_t *ok_prefix = (uint8_t *)strstr((char *)at_response, "+OK=");
+  if (ok_prefix == NULL) {
+    printf("解析错误:未找到 +OK= 前缀\r\n");
+    return HAL_ERROR;
+  }
+
+  // "+OK=" 后面紧跟 6 字节原始 MAC
+  uint8_t *mac_ptr = ok_prefix + 4;
+  if ((mac_ptr + 6) > (at_response + len)) {
+    printf("解析错误:MAC 地址数据不足,len=%d\r\n", len);
+    return HAL_ERROR;
+  }
+
+  // 复制 MAC 地址
+  memcpy(mac_addr, mac_ptr, 6);
+
+  // 调试打印
+  printf("MAC 地址解析成功: %02X:%02X:%02X:%02X:%02X:%02X\r\n",
+         mac_addr[0], mac_addr[1], mac_addr[2],
+         mac_addr[3], mac_addr[4], mac_addr[5]);
+
+  return HAL_OK;
+}
+
+
 
 /**
   * @brief This function handles USART3 global interrupt.
   */
 void USART3_IRQHandler(void)
 {
+  uint8_t bt_mac_addr[6] = {0};
   /* USER CODE BEGIN USART3_IRQn 0 */
 
   /* USER CODE END USART3_IRQn 0 */
@@ -362,8 +402,31 @@ void USART3_IRQHandler(void)
     HAL_UART_DMAStop(&huart3);
 
     uint32_t received_len = sizeof(rx_buf) - __HAL_DMA_GET_COUNTER(huart3.hdmarx);
+    // 1. 识别 AT 指令响应(包含 "+OK=",对应 AT+MAC? 响应格式,)
+    // === 处理 AT+MAC? 响应 ===
+    if (strstr((char *)rx_buf, "+OK=") != NULL)
+    {
+      printf("receive data is %s\r\n", (char*) rx_buf);
+      if (BT52_ParseMACResponse(rx_buf, received_len, bt_mac_addr) == HAL_OK) {
+        // printf("MAC 地址解析成功: %02X:%02X:%02X:%02X:%02X:%02X\r\n",
+        //        bt_mac_addr[0], bt_mac_addr[1], bt_mac_addr[2],
+        //        bt_mac_addr[3], bt_mac_addr[4], bt_mac_addr[5]);
+        memcpy(Mac_Addr, bt_mac_addr, sizeof(Mac_Addr));
+      } else {
+        printf("MAC 地址解析失败,响应数据:%.*s\r\n", received_len, rx_buf);
+      }
+    }
+
+        // HAL_UART_Transmit(&huart1, rx_buf, received_len, HAL_MAX_DELAY);
+    // printf("USART3 接收长度=%d, 内容 %.*s\r\n", (int)received_len, (int)received_len, rx_buf);
+    // for (uint16_t i = 0; i < received_len; i++)
+    // {
+    //   printf("%02x", rx_buf[i]);
+    // }
+    // printf("\r\n");
 
     if (strncmp((char *)rx_buf, "AT", 2) != 0) {
+
       if (deviceInfo.BlDataFlag == BL_START) {
         if (receiveBlDataCount < 45)
         {
@@ -376,8 +439,9 @@ void USART3_IRQHandler(void)
       }
     }
 
+
     memset(rx_buf, 0, received_len);
-    HAL_UART_Receive_DMA(&huart3, rx_buf, received_len); // 重新启动
+    HAL_UART_Receive_DMA(&huart3, rx_buf, sizeof(rx_buf)); // 重新启动
   }
   /* USER CODE END USART3_IRQn 1 */
 }
@@ -421,10 +485,12 @@ void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) {
     if (HAL_GPIO_ReadPin(SOS_KEY_GPIO_Port, SOS_KEY_Pin) == GPIO_PIN_SET) {
       // 松开(上升沿)
       printf("SOS_KEY 松开\r\n");
+           key_pressed_flag = 1;
       deviceInfo.isSOS = FALSE;
     } else {
       // 按下(下降沿)
       printf("SOS_KEY 按下\r\n");
+
       SOS_struct = currentTime;  // 记录上报时间
       deviceInfo.isSOS = TRUE;
     }