Explorar o código

把拔针组合键修改为单独的PA7引脚触发

DESKTOP-34DQRNR\TJK hai 2 meses
pai
achega
22828da02f
Modificáronse 5 ficheiros con 171 adicións e 34 borrados
  1. 3 0
      Core/Inc/main.h
  2. 5 5
      Core/Src/gpio.c
  3. 34 29
      Core/Src/main.c
  4. 1 0
      Core/Src/stm32f0xx_it.c
  5. 128 0
      通信协议说明.md

+ 3 - 0
Core/Inc/main.h

@@ -65,6 +65,9 @@ void Error_Handler(void);
 #define RESET_GPIO_Port GPIOA
 #define BUZZ_Pin GPIO_PIN_6
 #define BUZZ_GPIO_Port GPIOA
+#define UNPIN_KEY_Pin GPIO_PIN_7
+#define UNPIN_KEY_GPIO_Port GPIOA
+#define UNPIN_KEY_EXTI_IRQn EXTI4_15_IRQn
 #define HADLE_KEY_Pin GPIO_PIN_0
 #define HADLE_KEY_GPIO_Port GPIOB
 #define HADLE_KEY_EXTI_IRQn EXTI0_1_IRQn

+ 5 - 5
Core/Src/gpio.c

@@ -81,11 +81,11 @@ void MX_GPIO_Init(void)
   GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
   HAL_GPIO_Init(BUZZ_GPIO_Port, &GPIO_InitStruct);
 
-  /*Configure GPIO pin : PA7 */
-  GPIO_InitStruct.Pin = GPIO_PIN_7;
-  GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
-  GPIO_InitStruct.Pull = GPIO_NOPULL;
-  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
+  /*Configure GPIO pin : PtPin */
+  GPIO_InitStruct.Pin = UNPIN_KEY_Pin;
+  GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING_FALLING;
+  GPIO_InitStruct.Pull = GPIO_PULLUP;
+  HAL_GPIO_Init(UNPIN_KEY_GPIO_Port, &GPIO_InitStruct);
 	
 	 /*Configure GPIO pins :  PA15 */
   GPIO_InitStruct.Pin = GPIO_PIN_15;

+ 34 - 29
Core/Src/main.c

@@ -69,12 +69,12 @@
 
 #define EVENT_MARK_C_D			0x0010
 #define EVENT_MARK_CANCEL		0x0020
-#define EVENT_MARK_UNPIN		0x0018
+#define EVENT_MARK_UNPIN		0x0040
 #define EVENT_MARK_BAT_LOW	0x0080
 
 #define EVENT_MARK_SOS			0x0100 
  
-#define SCAN_KEY_NUM 6 
+#define SCAN_KEY_NUM 7 
 //RF TX packet
 //$ABlora1,1E#,(µØÖ·AB£º0xF1234) 
 
@@ -133,8 +133,8 @@ typedef struct __key_model {
 }KEY_MODLE;
 
 KEY_MODLE keyboard_v[SCAN_KEY_NUM];
-uint16_t keyboard_gpio[SCAN_KEY_NUM] = {CANCEL_KEY_Pin, CHANGE_KEY_Pin, HADLE_KEY_Pin, CALL_KEY_Pin, NURSE_KEY_Pin, REINFORCE_KEY_Pin};
-GPIO_TypeDef *key_io_group[SCAN_KEY_NUM] = {CANCEL_KEY_GPIO_Port, CHANGE_KEY_GPIO_Port, HADLE_KEY_GPIO_Port, CALL_KEY_GPIO_Port, NURSE_KEY_GPIO_Port, REINFORCE_KEY_GPIO_Port};
+uint16_t keyboard_gpio[SCAN_KEY_NUM] = {CANCEL_KEY_Pin, CHANGE_KEY_Pin, HADLE_KEY_Pin, CALL_KEY_Pin, NURSE_KEY_Pin, REINFORCE_KEY_Pin, UNPIN_KEY_Pin};
+GPIO_TypeDef *key_io_group[SCAN_KEY_NUM] = {CANCEL_KEY_GPIO_Port, CHANGE_KEY_GPIO_Port, HADLE_KEY_GPIO_Port, CALL_KEY_GPIO_Port, NURSE_KEY_GPIO_Port, REINFORCE_KEY_GPIO_Port, UNPIN_KEY_GPIO_Port};
 uart_comm uart1;
 
 extern DMA_HandleTypeDef hdma_usart1_rx;
@@ -313,6 +313,13 @@ void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
 					event_bits |= EVENT_MARK_CB;
           break;	
 			
+      case UNPIN_KEY_Pin:
+#if ENABLE_UART1_DEBUG				
+          printf("UNPIN_KEY_Pin.\r\n");
+#endif			
+					event_bits |= EVENT_MARK_UNPIN;
+          break;	
+			
       default:
           break;
     }
@@ -653,6 +660,13 @@ static void event_scan_key_status(void)
 						event_bits |= EVENT_MARK_CB;
 	          break;	
 				
+	      case UNPIN_KEY_Pin:
+	#if ENABLE_UART1_DEBUG				
+	          printf("UNPIN_KEY_Pin.\r\n");
+	#endif			
+						event_bits |= EVENT_MARK_UNPIN;
+	          break;	
+			
 	      default:
 	          break;
 	    }
@@ -699,38 +713,29 @@ static uint8_t event_checkout_and_scan(void)
 		type = VALUE_CANCEL;//VALUE_CALL;
 		event_response_func(type);
 		event_bits &= ~EVENT_MARK_CALL;
-	}	
+	}
 	
-		//multi-key event at the same time
-	//if(flag_cd_event == 1 && flag_handle_event == 1)
-//	if ((event_bits & EVENT_MARK_HANDLE) == EVENT_MARK_HANDLE && 
-//			((event_bits & EVENT_MARK_C_D) == EVENT_MARK_C_D))
-	if((event_bits&EVENT_MARK_UNPIN)==EVENT_MARK_UNPIN)
+	if (event_bits & EVENT_MARK_UNPIN)
 	{
 		type = VALUE_UNPIN;
 		event_response_func(type);
-		//flag_cd_event = 0;
-		//flag_handle_event = 0;	
-		event_bits &= ~EVENT_MARK_HANDLE;
-		event_bits &= ~EVENT_MARK_C_D;
+		event_bits &= ~EVENT_MARK_UNPIN;
 	}
-	else
+
+	if (event_bits & EVENT_MARK_HANDLE)
 	{
-		if (event_bits & EVENT_MARK_HANDLE)
-		{
-			type = VALUE_HANDLE_CALL;
-			flag_handle_event = 1;	
-			event_response_func(type);
-			event_bits &= ~EVENT_MARK_HANDLE;
-		}			
+		type = VALUE_HANDLE_CALL;
+		flag_handle_event = 1;	
+		event_response_func(type);
+		event_bits &= ~EVENT_MARK_HANDLE;
+	}			
 
-		if (event_bits & EVENT_MARK_C_D)
-		{
-			type = VALUE_C_D;
-			flag_cd_event = 1;
-			event_response_func(type);
-			event_bits &= ~EVENT_MARK_C_D;
-		}		
+	if (event_bits & EVENT_MARK_C_D)
+	{
+		type = VALUE_C_D;
+		flag_cd_event = 1;
+		event_response_func(type);
+		event_bits &= ~EVENT_MARK_C_D;
 	}
 	
 	if (event_bits & EVENT_MARK_SOS)

+ 1 - 0
Core/Src/stm32f0xx_it.c

@@ -185,6 +185,7 @@ void EXTI4_15_IRQHandler(void)
   HAL_GPIO_EXTI_IRQHandler(CALL_KEY_Pin);
   HAL_GPIO_EXTI_IRQHandler(NURSE_KEY_Pin);
   HAL_GPIO_EXTI_IRQHandler(REINFORCE_KEY_Pin);
+  HAL_GPIO_EXTI_IRQHandler(UNPIN_KEY_Pin);
   /* USER CODE BEGIN EXTI4_15_IRQn 1 */
 
   /* USER CODE END EXTI4_15_IRQn 1 */

+ 128 - 0
通信协议说明.md

@@ -0,0 +1,128 @@
+# STM32 MCU Lora通信协议说明
+
+## 1. 概述
+
+本文档描述了STM32 MCU基于LoRa无线通信模块的数据传输协议。该协议用于按键事件检测和上报,电池状态监控,以及设备在线状态维护。
+
+## 2. 通信硬件
+
+- MCU型号: STM32F030系列
+- 通信模块: LoRa模块
+- 通信方式: UART接口,波特率设置为9600bps
+- 通信频率: 483.2MHz (可配置)
+- 通信速率: 1868bps (可配置)
+
+## 3. 消息格式
+
+### 3.1 发送消息格式
+
+发送消息采用如下格式:
+
+```
+$XXXX<LORA7>,<E><V>#\r\n
+```
+
+其中:
+- `$`: 消息起始符
+- `XXXX`: 设备MAC地址 (4字节)
+- `LORA7`: 固定设备标识
+- `,`: 分隔符
+- `E`: 事件类型代码 (ASCII字符,实际为事件类型值+48)
+- `V`: 事件数值 (ASCII字符,实际为事件数值+48)
+- `#`: 消息结束符
+- `\r\n`: 回车换行
+
+示例: `$ABCDEFGLORA7,1F#\r\n`
+
+总长度: 16字节
+
+### 3.2 接收消息格式
+
+接收消息格式与发送格式相同,MCU会检查消息中的MAC地址是否与自身MAC地址匹配,如果匹配则处理该消息。
+
+## 4. 事件类型定义
+
+系统支持以下事件类型:
+
+| 事件类型 | 十六进制值 | 描述 | 详细消息示例 |
+|---------|-----------|------|------------|
+| VALUE_UNKOWN | 0x00 | 未知事件 | `$ABCDFGLORA7,01#\r\n` |
+| VALUE_CALL | 0x01 | 面板呼叫事件 | `$ABCDFGLORA7,11#\r\n` |
+| VALUE_CANCEL | 0x02 | 取消呼叫事件 | `$ABCDFGLORA7,21#\r\n` |
+| VALUE_NURSING | 0x03 | 护理呼叫事件 | `$ABCDFGLORA7,31#\r\n` |
+| VALUE_CB | 0x04 | 增援呼叫事件 | `$ABCDFGLORA7,41#\r\n` |
+| VALUE_UNPIN | 0x05 | 拔针事件 | `$ABCDFGLORA7,51#\r\n` |
+| VALUE_C_D | 0x06 | 更换药物事件 | `$ABCDFGLORA7,61#\r\n` |
+| VALUE_SOS | 0x07 | 紧急事件 | `$ABCDFGLORA7,71#\r\n` |
+| VALUE_HANDLE_CALL | 0x08 | 手柄呼叫事件 | `$ABCDFGLORA7,81#\r\n` |
+| VALUE_CANCEL_TO | 0x09 | 取消超时事件 | `$ABCDFGLORA7,91#\r\n` |
+| VALUE_ONLINE_FB | 0x18 | 设备在线心跳 | `$ABCDFGLORA7,H1#\r\n` (H=0x18+48=72) |
+| VALUE_BAT_LOW | 0x1C | 电池电量低事件 | `$ABCDFGLORA7,L1#\r\n` (L=0x1C+48=76) |
+
+## 5. 事件数值定义
+
+事件数值用于表示事件的附加信息:
+
+| 事件数值 | 描述 |
+|---------|------|
+| KEY_EVENT_0 | 0 - 默认值 |
+| KEY_EVENT_1 | 1 - 常用事件值 |
+| KEY_EVENT_3 | 2 - 备用事件值 |
+
+## 6. 按键与事件映射
+
+设备上的物理按键与事件类型的映射关系:
+
+| 物理按键 | 引脚 | 事件标记 | 实际触发事件 |
+|---------|-----|---------|------------|
+| CANCEL_KEY | PA9 | EVENT_MARK_CANCEL | VALUE_CB (增援) |
+| REINFORCE_KEY | PA12 | EVENT_MARK_CB | VALUE_NURSING (护理) |
+| NURSE_KEY | PA11 | EVENT_MARK_NURSE | VALUE_CALL (呼叫) |
+| CALL_KEY | PA10 | EVENT_MARK_CALL | VALUE_CANCEL (取消) |
+| UNPIN_KEY | PA7 | EVENT_MARK_UNPIN | VALUE_UNPIN (拔针) |
+| HADLE_KEY | PB0 | EVENT_MARK_HANDLE | VALUE_HANDLE_CALL (手柄呼叫) |
+| CHANGE_KEY | PB1 | EVENT_MARK_C_D | VALUE_C_D (更换药物) |
+
+## 7. 通信流程
+
+### 7.1 设备初始化
+1. MCU启动时初始化GPIO、ADC、RTC、定时器和UART
+2. 从Flash读取设备MAC地址
+3. 配置LoRa模块通信参数
+   - 工作模式: 透传模式
+   - 工作频率: 483.2MHz
+   - 通信速率: 1868bps
+
+### 7.2 事件检测与上报
+1. MCU通过GPIO中断或定时扫描检测按键状态
+2. 当检测到按键按下时,设置对应的事件标志位
+3. 在主循环中检查事件标志位,根据标志位调用事件响应函数
+4. 事件响应函数发送对应的事件消息,一般发送3次以提高可靠性
+5. 发送消息时会添加随机延时以避免冲突
+
+### 7.3 心跳与电池检测
+1. MCU定期上报心跳消息以维持在线状态
+2. 通过ADC检测电池电压
+3. 当电池电压低于阈值时,发送低电量事件
+
+### 7.4 低功耗管理
+1. 处理完事件后,MCU进入待机模式以节省电量
+2. 通过RTC闹钟或外部中断唤醒MCU
+
+## 8. LoRa模块配置命令
+
+LoRa模块通过UART接口接收以下AT命令进行配置:
+
+| 命令 | 说明 |
+|-----|------|
+| AT+WORKMODE=82 | 设置为AT命令模式 |
+| AT+WORKMODE=81 | 设置为透传模式 |
+| AT+FREQ=483200000,483200000,483200000,483200000 | 设置工作频率为483.2MHz |
+| AT+RATE=6,6 | 设置通信速率为1868bps |
+| AT+ENTERSLEEP | 使模块进入休眠模式 |
+
+## 9. 异常处理
+
+1. UART通信错误: 重新初始化UART
+2. 低电量检测: 发送低电量事件
+3. 通信超时: 重新发送