|
|
@@ -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)
|