Quellcode durchsuchen

修改定时器分频系数位72m。目前配置定时器位1ms一次。完成后台蓝牙扫描时间配置

xuxinyi vor 2 Monaten
Ursprung
Commit
9cb2b84771
5 geänderte Dateien mit 199 neuen und 128 gelöschten Zeilen
  1. 58 2
      Core/Inc/E52.h
  2. 50 26
      Core/Src/E52.c
  3. 75 87
      Core/Src/main.c
  4. 5 2
      Core/Src/stm32f1xx_it.c
  5. 11 11
      lora_bl.ioc

+ 58 - 2
Core/Inc/E52.h

@@ -10,20 +10,58 @@
 #include "string.h"
 #include "stdlib.h"
 
+// 定义云端命令枚举,使命令含义更清晰
+typedef enum {
+    IDLE = 0x00,
+    REQUEST_BLUETOOTH_DATA = 0x03,  // 请求发送蓝牙数据
+    CONFIGURE_E52 = 0x07,           // E52 配置命令
+    E52_ENTER_SLEEP = 0x05,         // E52 进入睡眠模式
+    E52_HEARTBEAT = 0x08            // E52 心跳包命令
+} CloudCommand;
+
+typedef enum {
+    TIMER_IDLE,
+    TIMER_ENABLE,
+    TIMER_DISABLE
+} TimerSTATUS;
+
+// 定义定时器操作类型
+typedef enum {
+    TIMER_OP_START,  // 启动定时器
+    TIMER_OP_STOP    // 停止定时器
+} Timer_Operation;
+
+typedef enum {
+    BL_IDLE,
+    BL_START,
+    BL_STOP
+} BLSTATUS;
+
 // 设备信息结构体
 typedef struct __attribute__((packed)){
+    uint8_t isReady;            // 设备是否就绪
     uint8_t broadcast_type;         // 广播类型             01:单波 02:广播 03:多播
     uint8_t loraDeviceAddress_H;    //设备地址高位           默认0
     uint8_t loraDeviceAddress_L;    //设备地址低位           默认0
     uint8_t target_addr_H;          // 目标地址高字节         默认FF
     uint8_t target_addr_L;          // 目标地址低字节         默认FF
     uint8_t powerValue;             //电量                  默认0
-    uint8_t workMode;               //工作模式              大概区分,发送模式,接受模式。
     // uint8_t receivingNewDataFlag;       //接收lora新数据
-    uint8_t sendBlDataFlag;         //发送蓝牙数据
+
+    //使能蓝牙收发数据
+    uint8_t BlDataFlag;         //发送蓝牙数据
+
+    //lora接收到新的消息
     uint8_t newLoraDataFlag;  //接收lora数据成功标志位。1:有新数据来。0.表示等待接收数据。后续可以改成队列类型。
+
+    //后台的远程命令
+    uint8_t commandFromCloud; //从云端接收到的命令     1.请求蓝牙数据,2.请求lora数据,3.睡眠 4,重新发送点卯数据
+
+    //定时器相关
+    uint8_t  timerEnable;           //定时器使能
     uint16_t timeCount;             //定时器计数
     uint16_t forwardBLAndLoraDataDuration;   //转发蓝牙数据持续时间高位ms
+
 } Device_structure;
 
 
@@ -62,6 +100,24 @@ typedef struct __attribute__((packed)){
 void E52_Send_Bl_Data_Fun(void);
 
 
+// 发送SOS结构体
+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 SOS_data;            //蓝牙数据
+    uint8_t finish_send;        // 是否完成发送
+    uint8_t target_addr_H;       // 目标地址高字节
+    uint8_t target_addr_L;   // 目标地址低字节
+    uint8_t frame_tail_H;    // 帧尾高字节
+    uint8_t frame_tail_L;    // 帧尾低字节
+} SendSOS_structure;
+void E52_Send_SOS_Fun(void);
+
+
+
 
 
 void E52_Analyze_Data(void);

+ 50 - 26
Core/Src/E52.c

@@ -51,6 +51,18 @@ void E52_Send_Bl_Data_Fun() {
 
 void E52_Send_SOS_Fun() {
     printf("这是发送SOS数据");
+    SendSOS_structure SendSOS_structure;
+    SendSOS_structure.frame_header_H = 0x55;
+    SendSOS_structure.frame_header_L = 0xAA;
+    SendSOS_structure.function_code = 0x04;
+    SendSOS_structure.badge_addr_high = deviceInfo.loraDeviceAddress_H;
+    SendSOS_structure.badge_addr_low = deviceInfo.loraDeviceAddress_L;
+    SendSOS_structure.SOS_data = 0x01; //暂定01
+    SendSOS_structure.finish_send = 0x01;
+    SendSOS_structure.frame_tail_H = 0xFF;
+    SendSOS_structure.frame_tail_L = 0xEE;
+    printf("blData size = %d\n", sizeof(SendSOS_structure));
+    HAL_UART_Transmit(&huart2, (uint8_t *)&SendSOS_structure, sizeof(SendSOS_structure), HAL_MAX_DELAY);
     // TODO: command:04
 }
 
@@ -60,57 +72,69 @@ void E52_Send_SOS_Fun() {
  * 帧头:55 BB
  */
 void E52_Request_Command_Fun() {
-    printf("这是请求蓝牙数据的命令");
-    // TODO: command:03
+    printf("这是请求蓝牙数据的命令\r\n");
+
+    // 修复运算符优先级警告,添加括号明确先执行位运算再比较
+    if ((((uint16_t)rx_buf_uart2[5] << 8) | rx_buf_uart2[6]) != 0) {
+        // 组合两个字节为16位的持续时间值
+        deviceInfo.forwardBLAndLoraDataDuration = ((uint16_t)rx_buf_uart2[5] << 8) | rx_buf_uart2[6];
+        deviceInfo.commandFromCloud = REQUEST_BLUETOOTH_DATA;
+    } else {
+        printf("扫描时间为0,不执行扫描\r\n");
+        deviceInfo.commandFromCloud = IDLE;
+    }
+    // TODO: command:03 - 此处添加0x03命令的其他处理逻辑
 }
 
+
 void E52_Configuration_Fun() {
-    printf("这是配置lora发送方式的命令");
+    printf("这是配置lora发送方式的命令\r\n");
     // TODO: command:07
 }
 
 void E52_Send_Sleep_Fun() {
-    printf("这是让设备睡眠的命令");
+    printf("这是让设备睡眠的命令\r\n");
     // TODO: command:05
 }
 
 void E52_Heartbeat_Fun1() {
-    printf("这是让设备重新发送点卯命令");
+    printf("这是让设备重新发送点卯命令\r\n");
     // TODO: command:08
 }
 
-
-void E52_Analyze_Command_Fun() {
-    printf("这是解析命令的");
-     if (rx_buf_uart2[2] == 0x01) {
-        // E52_Heartbeat();
-         // todo:心跳包命令
-    }else if (rx_buf_uart2[2] == 0x02) {
-        //todo:发生蓝牙数据
-    }else if (rx_buf_uart2[2] == 0x03) {
-        //todo:
-    }else {
-
-    }
-}
-
-
 void E52_Analyze_Data() {
     // uint16_t received_len = sizeof(rx_buf_uart2) - __HAL_DMA_GET_COUNTER(huart2.hdmarx);
 
     if (rx_buf_uart2[0] == 0x55 && rx_buf_uart2[1] == 0xBB) {
-        // printf("The data is command\r\n");
-        printf("开启发送蓝牙数据\r\n");
-        if (rx_buf_uart2[2] == 0x03) {  //请求发生蓝牙数据
-            deviceInfo.forwardBLAndLoraDataDuration = ((uint16_t)rx_buf_uart2[5] << 8) | rx_buf_uart2[6];
-            deviceInfo.sendBlDataFlag = 1;
+        // 根据接收到的第三个字节(命令字节)进行分支处理
+        switch (rx_buf_uart2[2]) {
+            case REQUEST_BLUETOOTH_DATA:
+                E52_Request_Command_Fun();
+                break;
+            case CONFIGURE_E52:
+                E52_Configuration_Fun();
+                break;
+            case E52_ENTER_SLEEP:
+                E52_Send_Sleep_Fun();
+                break;
+            case E52_HEARTBEAT:
+                E52_Heartbeat_Fun1();
+                break;
+            default:
+                // 处理未知命令的情况,比如打印日志或进行错误处理
+                // printf("Unknown command: 0x%02X\r\n", rx_buf_uart2[2]);
+                break;
         }
     }
     // 清空缓冲区(可选)
     memset(rx_buf_uart2, 0, sizeof(rx_buf_uart2));
     // 重新开启 DMA 接收
     HAL_UART_Receive_DMA(&huart2, rx_buf_uart2, sizeof(rx_buf_uart2));
+    deviceInfo.newLoraDataFlag = 0;//重置状态
 }
 
 
 
+
+
+

+ 75 - 87
Core/Src/main.c

@@ -135,9 +135,62 @@ void Device_Info_Init_Fun() {
   deviceInfo.powerValue = 0;
   deviceInfo.target_addr_H = 0xFF;
   deviceInfo.target_addr_L = 0xFF;
-  deviceInfo.sendBlDataFlag = 0;
+  deviceInfo.BlDataFlag = BL_IDLE;
   deviceInfo.newLoraDataFlag = 0;
+  deviceInfo.isReady = 0;
+  deviceInfo.commandFromCloud = IDLE;
+  //TODO: 大循环,获取设备地址信息,否则重新发送。发送上线信息,等待反馈,否则重新发送上线信息。一切准备就绪后,开启isready为1,进入工作模式。
+  // while (1){}
 }
+
+// 保留通用框架,但仅处理定时器4
+HAL_StatusTypeDef Timer_Managment_Fun(TIM_HandleTypeDef *htim, Timer_Operation op) {
+  HAL_StatusTypeDef status = HAL_ERROR;  // 默认返回错误状态
+
+  // 只处理定时器4,其他定时器直接返回错误
+  if (htim->Instance != TIM4) {
+    printf("错误:仅支持定时器 TIM4\r\n");
+    return status;
+  }
+
+  if (htim == NULL) {
+    printf("错误:定时器句柄为空\r\n");
+    return status;
+  }
+
+  switch (op) {
+    case TIMER_OP_START:
+      // 检查定时器4是否处于就绪状态
+      if (htim->State == HAL_TIM_STATE_READY) {
+        status = HAL_TIM_Base_Start_IT(htim);  // 启动定时器+使能中断
+        if (status == HAL_OK) {
+          printf("定时器 TIM4 启动成功\r\n");
+        } else {
+          printf("定时器 TIM4 启动失败,状态码: %d\r\n", status);
+        }
+      }
+      break;
+
+    case TIMER_OP_STOP:
+      // 检查定时器4是否正在运行
+      if (htim->State == HAL_TIM_STATE_BUSY) {
+        status = HAL_TIM_Base_Stop_IT(htim);  // 停止定时器+禁用中断
+        if (status == HAL_OK) {
+          printf("定时器 TIM4 停止成功\r\n");
+        } else {
+          printf("定时器 TIM4 停止失败,状态码: %d\r\n", status);
+        }
+      }
+      break;
+
+    default:
+      printf("错误:未知的定时器操作类型\r\n");
+      break;
+  }
+
+  return status;
+}
+
 /* USER CODE END 0 */
 
 /**
@@ -184,7 +237,6 @@ int main(void)
   // HAL_UART_Receive_IT(&huart2, uart2_rx_byte, 7);
   // 使能 USART2 空闲中断
   __HAL_UART_ENABLE_IT(&huart2, UART_IT_IDLE);
-  Device_Info_Init_Fun();
   printf("开始初始化1\r\n");
   HAL_Delay(4000);
   printf("开始初始化\r\n");
@@ -200,7 +252,7 @@ int main(void)
   printf("初始化复位\r\n");
   E104_BT5005A_RESET_Fun();
   HAL_Delay(2000);
-
+  Device_Info_Init_Fun();
   printf("开启Lora广播模块\r\n");
   const char *lora_msg = "AT+OPTION=3,0";
   HAL_UART_Transmit(&huart2, (uint8_t *)lora_msg, strlen(lora_msg), HAL_MAX_DELAY);
@@ -219,100 +271,36 @@ int main(void)
   // uint16_t count = 0;
   // uint16_t randomTime = 0;
   srand(HAL_GetTick());
-
   // HAL_TIM_Base_Start(&htim4);
-  // HAL_TIM_Base_Start_IT(&htim4);   // 启动计数 + 使能中断
   /* USER CODE END 2 */
 
   /* Infinite loop */
   /* USER CODE BEGIN WHILE */
   // deviceInfo.sendBlDataFlag = 1;
+  printf("Device is ready\r\n");
   while (1)
   {
     /* USER CODE END WHILE */
 
     /* USER CODE BEGIN 3 */
-
-    // if (workMode == 0) {  // 接收蓝牙数据
-    //   printf("接收中第%d秒,接受了%d位数据\r\n", count, receiveBlDataCount);
-    //   if (count > 30 || receiveBlDataCount >= 115) { //搜10秒数据
-    //     E104_BT5005A_SLEEP_Fun();
-    //     HAL_Delay(5);//等待蓝牙模块进入睡眠模式
-    //     // receiveBlDataCount = 0;
-    //     workMode = 1;
-    //     count = 0;
-    //   }else {
-    //     count++;
-    //   }
-    // }else if (workMode == 1) { // 发送数据给Lora
-    //   if (count < receiveBlDataCount)
-    //   {
-    //     printf("发送第%d个数据,总数据大小为%d\r\n", count,receiveBlDataCount);
-    //     // 启动 USART2 DMA 接收
-    //     sentLoraData(count);
-    //     if (loraSendNextDataFlag == 0 || loraSendNextDataFlag > 3) {
-    //       memset(totalData[count], 0, sizeof(totalData[count]));
-    //       count++;
-    //       memset(rx_buf_uart2, 0, 100);
-    //       loraSendNextDataFlag = 0;
-    //     }else  {
-    //       printf("send error!\r\n");
-    //     }
-    //   }else {
-    //     printf("发送结束,总数据大小为%d\r\n",receiveBlDataCount);
-    //     const char *end_msg = "SENDEND\r\n";
-    //     HAL_UART_Transmit(&huart2, (uint8_t *)end_msg, strlen(end_msg), HAL_MAX_DELAY);
-    //     receiveBlDataCount = 0;
-    //     workMode = 2;
-    //     count = 0;
-    //   }
-    // }else if (workMode == 2) {
-    //   printf("等待进度:%d\r\n", count);
-    //   printf("等待时间%d秒\r\n",randomTime);
-    //   if (randomTime == 0) {
-    //     randomTime = randomFun();
-    //   }
-    //   if (count > randomTime) {
-    //     E104_BT5005A_WAKE_UP_Fun();
-    //     randomTime = 0;
-    //     workMode = 0;
-    //     count = 0;
-    //   }else {
-    //     count++;
-    //   }
-    // }
-    // if (workMode == 1) {
-    //   HAL_Delay(300);
-    // }else {
-    //   HAL_Delay(1000);
-    // }
-
-    // while (1) {
-      // printf("Hello world:%d\r\n",i);
-      // //睡眠测试 --
-      // i++;
-      // if (i == 15) {
-      //   HAL_SuspendTick();   // 停止 SysTick 中断
-      //   __WFI();             // 真正进入 Sleep
-      //   HAL_ResumeTick();    // 唤醒后恢复 SysTick
-      // }
-      // HAL_Delay(1000);
-      // //睡眠测试 --
-      // printf("Hello world:%d\r\n",newLoraDataFlag);
-      // if (newLoraDataFlag == 1) {
-      //   E52_Analyze_Data();
-      //   newLoraDataFlag = 0;//重置状态
-      // }
-      // E52_Heartbeat_Fun();
-      // E52_Send_Bl_Data_Fun();
-      // const char *end_msg = "SENDEND\r\n";
-      // HAL_UART_Transmit(&huart2, (uint8_t *)end_msg, strlen(end_msg), HAL_MAX_DELAY);
-      // HAL_Delay(1000);
-    // }
     if (deviceInfo.newLoraDataFlag == 1) {
-      printf("loraDeviceAddress: 0x%02X 0x%02X\r\n", deviceInfo.loraDeviceAddress_H,deviceInfo.loraDeviceAddress_L);
+      // printf("loraDeviceAddress: 0x%02X 0x%02X\r\n", deviceInfo.loraDeviceAddress_H,deviceInfo.loraDeviceAddress_L);
       E52_Analyze_Data();
-      deviceInfo.newLoraDataFlag = 0;//重置状态
+    }
+
+    // 检查是否接收到"请求蓝牙数据"命令,且定时器处于就绪状态
+    if (deviceInfo.commandFromCloud == REQUEST_BLUETOOTH_DATA) {
+
+      if (deviceInfo.timeCount >= deviceInfo.forwardBLAndLoraDataDuration) {
+        Timer_Managment_Fun(&htim4, TIMER_OP_STOP);
+        deviceInfo.BlDataFlag = BL_STOP;
+        //TODO 停止计时器后,将数据发送出去。
+        printf("停止蓝牙扫描,开始发送蓝牙数据给Lora\r\n");
+      }else {
+        Timer_Managment_Fun(&htim4, TIMER_OP_START);
+        deviceInfo.BlDataFlag = BL_START;
+        printf("开启蓝牙扫描\r\n");
+      }
     }
   }
   /* USER CODE END 3 */
@@ -347,8 +335,8 @@ void SystemClock_Config(void)
   RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
                               |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
   RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
-  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV2;
-  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
+  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
+  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;
   RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
 
   if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK)
@@ -378,7 +366,7 @@ static void MX_TIM4_Init(void)
   htim4.Instance = TIM4;
   htim4.Init.Prescaler = 71;
   htim4.Init.CounterMode = TIM_COUNTERMODE_UP;
-  htim4.Init.Period = 4999;
+  htim4.Init.Period = 999;
   htim4.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
   htim4.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE;
   if (HAL_TIM_Base_Init(&htim4) != HAL_OK)

+ 5 - 2
Core/Src/stm32f1xx_it.c

@@ -261,7 +261,8 @@ void TIM4_IRQHandler(void)
 
   /* USER CODE END TIM4_IRQn 0 */
   HAL_TIM_IRQHandler(&htim4);
-  printf("定时器测试\r\n");
+  // printf("定时器测试\r\n");
+  deviceInfo.timeCount++;
   /* USER CODE BEGIN TIM4_IRQn 1 */
 
   /* USER CODE END TIM4_IRQn 1 */
@@ -360,8 +361,10 @@ void USART3_IRQHandler(void)
     //   HAL_UART_Receive_DMA(&huart3, rx_buf, received_len); // 重新启动
     // }
     if (strncmp((char *)rx_buf, "AT", 2) != 0) {
-      if (deviceInfo.sendBlDataFlag == 1) {
+      if (deviceInfo.BlDataFlag == BL_START) {
         E52_Send_Bl_Data_Fun();
+      }else if (deviceInfo.BlDataFlag == BL_STOP) {
+        // E52_Send_SOS_Fun();
       }
     }
 

+ 11 - 11
lora_bl.ioc

@@ -128,18 +128,18 @@ ProjectManager.ToolChainLocation=
 ProjectManager.UAScriptAfterPath=
 ProjectManager.UAScriptBeforePath=
 ProjectManager.UnderRoot=false
-ProjectManager.functionlistsort=1-SystemClock_Config-RCC-false-HAL-false,2-MX_GPIO_Init-GPIO-false-HAL-true,3-MX_DMA_Init-DMA-false-HAL-true,4-MX_USART1_UART_Init-USART1-false-HAL-true,5-MX_USART2_UART_Init-USART2-false-HAL-true,6-MX_USART3_UART_Init-USART3-false-HAL-true
-RCC.ADCFreqValue=18000000
-RCC.AHBCLKDivider=RCC_SYSCLK_DIV2
-RCC.AHBFreq_Value=36000000
+ProjectManager.functionlistsort=1-SystemClock_Config-RCC-false-HAL-false,2-MX_GPIO_Init-GPIO-false-HAL-true,3-MX_DMA_Init-DMA-false-HAL-true,4-MX_USART1_UART_Init-USART1-false-HAL-true,5-MX_USART2_UART_Init-USART2-false-HAL-true,6-MX_USART3_UART_Init-USART3-false-HAL-true,7-MX_TIM4_Init-TIM4-false-HAL-true
+RCC.ADCFreqValue=36000000
+RCC.AHBFreq_Value=72000000
+RCC.APB1CLKDivider=RCC_HCLK_DIV2
 RCC.APB1Freq_Value=36000000
-RCC.APB1TimFreq_Value=36000000
-RCC.APB2Freq_Value=36000000
-RCC.APB2TimFreq_Value=36000000
-RCC.FCLKCortexFreq_Value=36000000
+RCC.APB1TimFreq_Value=72000000
+RCC.APB2Freq_Value=72000000
+RCC.APB2TimFreq_Value=72000000
+RCC.FCLKCortexFreq_Value=72000000
 RCC.FamilyName=M
-RCC.HCLKFreq_Value=36000000
-RCC.IPParameters=ADCFreqValue,AHBCLKDivider,AHBFreq_Value,APB1Freq_Value,APB1TimFreq_Value,APB2Freq_Value,APB2TimFreq_Value,FCLKCortexFreq_Value,FamilyName,HCLKFreq_Value,MCOFreq_Value,PLLCLKFreq_Value,PLLMCOFreq_Value,PLLMUL,PLLSourceVirtual,SYSCLKFreq_VALUE,SYSCLKSource,TimSysFreq_Value,USBFreq_Value,VCOOutput2Freq_Value
+RCC.HCLKFreq_Value=72000000
+RCC.IPParameters=ADCFreqValue,AHBFreq_Value,APB1CLKDivider,APB1Freq_Value,APB1TimFreq_Value,APB2Freq_Value,APB2TimFreq_Value,FCLKCortexFreq_Value,FamilyName,HCLKFreq_Value,MCOFreq_Value,PLLCLKFreq_Value,PLLMCOFreq_Value,PLLMUL,PLLSourceVirtual,SYSCLKFreq_VALUE,SYSCLKSource,TimSysFreq_Value,USBFreq_Value,VCOOutput2Freq_Value
 RCC.MCOFreq_Value=72000000
 RCC.PLLCLKFreq_Value=72000000
 RCC.PLLMCOFreq_Value=36000000
@@ -147,7 +147,7 @@ RCC.PLLMUL=RCC_PLL_MUL9
 RCC.PLLSourceVirtual=RCC_PLLSOURCE_HSE
 RCC.SYSCLKFreq_VALUE=72000000
 RCC.SYSCLKSource=RCC_SYSCLKSOURCE_PLLCLK
-RCC.TimSysFreq_Value=36000000
+RCC.TimSysFreq_Value=72000000
 RCC.USBFreq_Value=72000000
 RCC.VCOOutput2Freq_Value=8000000
 TIM4.AutoReloadPreload=TIM_AUTORELOAD_PRELOAD_ENABLE