From b76977326a96cb0f0f840a5d7ae7a929962d6477 Mon Sep 17 00:00:00 2001 From: czq <860517298@qq.com> Date: Wed, 7 May 2025 11:24:51 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BB=A3=E7=A0=81=E6=9A=82=E5=AD=98=20?= =?UTF-8?q?=E9=98=80=E9=97=A8=E7=8A=B6=E6=80=81=E4=B8=8A=E6=8A=A5=E5=8F=8A?= =?UTF-8?q?=E4=BC=98=E5=8C=96=E6=8C=89=E9=94=AE=E4=B8=AD=E6=96=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- APP/peripheral_main.c | 4 +- README.md | 7 +--- bsp/inc/bsp_ml307r.h | 5 ++- bsp/src/bsp_bmp390.c | 21 +++------- bsp/src/bsp_key.c | 63 ++++++++++++++++++++--------- bsp/src/bsp_ml307r.c | 94 ++++++++++++++++++++++++++++--------------- 6 files changed, 117 insertions(+), 77 deletions(-) diff --git a/APP/peripheral_main.c b/APP/peripheral_main.c index 1fb03c3..abdee94 100644 --- a/APP/peripheral_main.c +++ b/APP/peripheral_main.c @@ -109,8 +109,8 @@ int main(void) BSP_VBAT_Init(); logDebug("VBAT init ok\n"); - BSP_Ml307r_Init(); - logDebug("BSP_M1307r ok\n"); + // BSP_Ml307r_Init(); + // logDebug("BSP_M1307r ok\n"); ShowRestartReason(); IWDG_Init(5000); diff --git a/README.md b/README.md index cd990f2..b97cc1c 100644 --- a/README.md +++ b/README.md @@ -1,6 +1 @@ -获取sim信息(用于上报) -获取实时时间 - -数据上报(低电压、阀门状态) -下行数据处理 -滴答定时器精度 \ No newline at end of file +目前存在当电容电压较低时启动模组会偶现系统卡住现象 \ No newline at end of file diff --git a/bsp/inc/bsp_ml307r.h b/bsp/inc/bsp_ml307r.h index cb28da9..986039a 100644 --- a/bsp/inc/bsp_ml307r.h +++ b/bsp/inc/bsp_ml307r.h @@ -19,9 +19,9 @@ typedef struct __attribute__((packed)) { uint8_t module_init_flag : 1; //ģʼ - uint8_t module_Sleep_flag : 1; //ģ˯ + uint8_t Date_Sending_flag : 1; //ݷ uint8_t Low_Voltage_flag : 1; //͵ѹ - uint8_t Regular_report_flag : 1; //ϱ + uint8_t Key_Finish_flag : 1; // uint8_t PowerOn_success_flag : 1; //ģ鿪ɹ uint8_t PowerOn_error_flag : 1; //ģ鿪ʧ @@ -110,6 +110,7 @@ static void BSP_Ml307_Power_Off(void); void BSP_Ml307r_Init(void); +void Iot_Send_Data(void); void Ml307r_Loop(void); void BSP_Module_Emergency_Send(uint8_t* data, uint8_t len); void BSP_ML307_StartTimeoutTimer(void); diff --git a/bsp/src/bsp_bmp390.c b/bsp/src/bsp_bmp390.c index ce40327..6022c9e 100644 --- a/bsp/src/bsp_bmp390.c +++ b/bsp/src/bsp_bmp390.c @@ -730,7 +730,6 @@ uint16_t Check_ProcessEvent(uint8_t task_id, uint16_t events) { if (events & CHECK_EVT_START) { - uint8_t Status_upload = 0; // logDebug("fault_state = %d \r\n",fault_state); if(!fault_state) { @@ -738,9 +737,7 @@ uint16_t Check_ProcessEvent(uint8_t task_id, uint16_t events) if(P[0] - P[2] >= 80) //8000 { VALVE_CLOSE(); - IotFlag_t.Valve_Close_flag = 1; fault_state = 1; - Status_upload = 1; tmos_start_task(check_task_id, MOTOR_STOP_EVT, MS1_TO_SYSTEM_TIME(1500)); //1000 logDebug("motor high close"); } @@ -748,9 +745,7 @@ uint16_t Check_ProcessEvent(uint8_t task_id, uint16_t events) if(P[0] - P[2] <= 80) //800 { VALVE_CLOSE(); - IotFlag_t.Valve_Close_flag = 1; fault_state = 2; - Status_upload = 1; tmos_start_task(check_task_id, MOTOR_STOP_EVT, MS1_TO_SYSTEM_TIME(1500)); //1000 logDebug("motor low close"); } @@ -758,9 +753,7 @@ uint16_t Check_ProcessEvent(uint8_t task_id, uint16_t events) if( P[0] - P[1] >= 7) //700 { VALVE_CLOSE(); - IotFlag_t.Valve_Close_flag = 1; fault_state = 3; - Status_upload = 1; tmos_start_task(check_task_id, MOTOR_STOP_EVT, MS1_TO_SYSTEM_TIME(1500)); //1000 logDebug("motor ver close"); } @@ -773,7 +766,6 @@ uint16_t Check_ProcessEvent(uint8_t task_id, uint16_t events) VALVE_OPEN(); IotFlag_t.Valve_Open_flag = 1; fault_state = 0; - Status_upload = 2; LED_VALVE_OPEN; logDebug("motor/LED open"); tmos_start_task(check_task_id, MOTOR_STOP_EVT, MS1_TO_SYSTEM_TIME(1000)); @@ -782,17 +774,11 @@ uint16_t Check_ProcessEvent(uint8_t task_id, uint16_t events) { motor_flag = 0; VALVE_CLOSE(); - IotFlag_t.Valve_Close_flag = 1; - Status_upload = 1; LED_VALVE_CLOSE; + fault_state = 4; logDebug("motor/LED close"); tmos_start_task(check_task_id, MOTOR_STOP_EVT, MS1_TO_SYSTEM_TIME(1000)); } - // if(Status_upload){ - // logDebug("BSP_M1307r start_send message!!!\n"); - // BSP_Ml307r_Init(); - // Status_upload = 0; - // } tmos_start_task(check_task_id, CHECK_EVT_START, MS1_TO_SYSTEM_TIME(200)); //100 return (events ^ CHECK_EVT_START); } @@ -800,6 +786,11 @@ uint16_t Check_ProcessEvent(uint8_t task_id, uint16_t events) { VALVE_STOP(); logDebug("motor STOP"); + if(fault_state == 4) + { + IotFlag_t.Valve_Close_flag = 1; + Iot_Send_Data(); + } return (events ^ MOTOR_STOP_EVT); } return 0; diff --git a/bsp/src/bsp_key.c b/bsp/src/bsp_key.c index 1f98c36..bbe9134 100644 --- a/bsp/src/bsp_key.c +++ b/bsp/src/bsp_key.c @@ -2,6 +2,7 @@ #include "bsp_motor.h" #include "bsp_uart.h" #include "bsp_led.h" +#include "bsp_ml307r.h" #include "log.h" #include "SLEEP.h" @@ -38,9 +39,8 @@ void app_task_handler(TeAppEvtType app_evt_type) case kKeyRelease: BSP_KEY_EnterLowpower(); // DelayMs(10); - // BSP_RequestSleep(); + BSP_RequestSleep(); logDebug("gpio relase;BSP_RequestSleep "); - break; default: break; @@ -123,10 +123,21 @@ static uint16_t KEY_Task_ProcessEvent(uint8_t task_id, uint16_t events) } else { + // if(key_run == 1) + // { + // p_handler(kKeyRelease); + // key_run = 0; + // } if(key_run == 1) { - p_handler(kKeyRelease); - key_run = 0; + // 确保按键已真正释放后再触发释放事件 + if (!IS_KEY_Vaild()) { + p_handler(kKeyRelease); + key_run = 0; + } else { + // 按键仍未释放,继续检测 + tmos_start_task(key_task_id, KEY_SCAN_EVT, MS1_TO_SYSTEM_TIME(KEY_SACN_MS)); + } } } return (events ^ KEY_SCAN_EVT); @@ -317,6 +328,7 @@ void KEY_ProcessLoop(void) // logDebug("KEY_ProcessLoop"); // } // } + if (key_wakeup_flag) { key_wakeup_flag = 0; @@ -350,25 +362,36 @@ __INTERRUPT // 告诉编译器使用硬件压栈 __HIGH_CODE // 放到RAM里 void GPIOB_IRQHandler(void) { - // 阻止睡眠 - BSP_BlockSleep(); - // 关按键中断 - BSP_KEY_ExitLowpower(); - - printf("KEY IRQ"); - + // 清除中断标志位 GPIOB_ClearITFlagBit(KEY_B_PIN); - key_wakeup_flag = 1; - // key_timeout_flag = 0; + // 检查是否为真实按键事件(通过确认电平是否真的接近0V) + if (GPIOB_ReadPortPin(KEY_B_PIN) == 0) { + // 再次确认是否真的为低电平(接近0V) + DelayUs(50); // 短暂延时 + if (GPIOB_ReadPortPin(KEY_B_PIN) == 0) { + // 确认是真实按键事件 + // 阻止睡眠 + BSP_BlockSleep(); + // 关按键中断 + BSP_KEY_ExitLowpower(); + printf("KEY IRQ"); + key_wakeup_flag = 1; + } + } else { + // 可能是电源波动导致的中断,忽略此次中断 + printf("Power Fluctuation - Ignored"); + } + // // 阻止睡眠 // BSP_BlockSleep(); + // // 关按键中断 + // BSP_KEY_ExitLowpower(); + + // printf("KEY IRQ"); + + // GPIOB_ClearITFlagBit(KEY_B_PIN); + + // key_wakeup_flag = 1; - // if (R16_PB_INT_IF & KEY_B_PIN) - // { - // R16_PB_INT_IF = KEY_B_PIN; - // // tmos_set_event(key_task_id, KEY_SCAN_EVT); - // BSP_KEY_ExitLowpower(); - // } - // tmos_set_event(key_task_id,KEY_SCAN_EVT); } diff --git a/bsp/src/bsp_ml307r.c b/bsp/src/bsp_ml307r.c index 5ac6de4..a3702bd 100644 --- a/bsp/src/bsp_ml307r.c +++ b/bsp/src/bsp_ml307r.c @@ -30,20 +30,9 @@ MultiTimer Multi_StopTask_t; //StopTask MultiTimer Multi_Loop_t; //Loop MultiTimer Multi_GetInfo_t; //siminfo -// Դ״̬ -typedef enum { - POWER_STATE_INIT, - POWER_STATE_ON_START, - POWER_STATE_ON_COMPLETE, - POWER_STATE_OFF_START, - POWER_STATE_OFF_COMPLETE -} ml307_power_state_t; - -static ml307_power_state_t ml307_power_state = POWER_STATE_INIT; static tmosTaskID ml307_task_id = INVALID_TASK_ID; at_obj_t *ml307r_obj; -uint8_t databuf[5] = {0x01,0xaa,0x12,0xde,0x39}; int Ml307r_Gpio_Init(void) @@ -58,7 +47,6 @@ int Ml307r_Gpio_Init(void) GPIOB_ModeCfg(ML307_PWR_PIN, GPIO_ModeOut_PP_5mA); - return 0; } @@ -107,7 +95,7 @@ static uint8_t state = 0; #define CPIN_RETRY_INTERVAL_TIME (20*1000UL) #define CONNECT_RETRY_INTERVAL_TIME (20*1000UL) #define SEND_RETRY_INTERVAL_TIME (30*1000UL) -#define STOP_TASK_INTERVAL_TIME (25*1000UL) +#define STOP_TASK_INTERVAL_TIME (15*1000UL) #define LOOP_INTERVAL_TIME (30*1000UL) #define GETINFO_INTERVAL_TIME (20*1000UL) @@ -167,10 +155,11 @@ void StopTask_CallBack(MultiTimer* timer, void* userData) tmos_stop_task(ml307_task_id, ML307_PERIODIC_EVT); BSP_RequestSleep(); }else{ - BSP_Ml307_Power_Off(); //ػ + // BSP_Ml307_Power_Off(); //ػ tmos_stop_task(ml307_task_id, ML307_PERIODIC_EVT); BSP_RequestSleep(); } + IotFlag_t.Date_Sending_flag = 0; } //ģ׼ @@ -530,7 +519,7 @@ static int BSP_Module_Connect_CtWing_Handle(at_env_t *e) { case 0: logDebug("create device...\r\n"); - e->println(e, "AT+MIPOPEN=0,\"TCP\",\"112.125.89.8\",42499,,1"); // 8.135.10.183,32994 + e->println(e, "AT+MIPOPEN=0,\"TCP\",\"112.125.89.8\",44679,,1"); // 8.135.10.183,32994 e->reset_timer(e); e->state++; break; @@ -819,13 +808,20 @@ void BSP_ML307_SendMessage(void) // ϵͳ״̬ȷ豸״̬ device_status_t device_status; - // ʵϵͳ״̬ж߼޸ - if (fault_state) { - device_status = DEVICE_STATUS_FAULT; - } else { - // ״̬ص - // Ӹ״̬߼ - device_status = DEVICE_STATUS_NORMAL; + // // ʵϵͳ״̬ж߼޸ + // if (fault_state) { + // device_status = DEVICE_STATUS_FAULT; + // } else { + // // ״̬ص + // // Ӹ״̬߼ + // device_status = DEVICE_STATUS_NORMAL; + // } + + + if(IotFlag_t.Valve_Close_flag) + { + IotFlag_t.Valve_Close_flag = 0; + device_status = DEVICE_STATUS_CLOSED; } @@ -1191,16 +1187,50 @@ uint16_t Ml307r_Handle(uint8_t task_id, uint16_t events) void BSP_Ml307r_Init(void) { - Ml307r_Gpio_Init(); - BSP_UART1_Init(); - Init_cJSON_With_TMOS(); - ml307r_obj = at_obj_create(&at_adapter);//Create AT communication object - if(ml307r_obj != NULL) + if(IotFlag_t.Date_Sending_flag == 0) { - at_obj_set_urc(ml307r_obj, urc_table, sizeof(urc_table) / sizeof(urc_table[0])); - IotFlag_t.module_init_flag = 1; - BSP_BlockSleep(); + BSP_UART1_Init(); + Ml307r_Gpio_Init(); + ml307r_obj = at_obj_create(&at_adapter);//Create AT communication object + if(ml307r_obj != NULL) + { + Init_cJSON_With_TMOS(); + at_obj_set_urc(ml307r_obj, urc_table, sizeof(urc_table) / sizeof(urc_table[0])); + IotFlag_t.module_init_flag = 1; + IotFlag_t.Date_Sending_flag = 1; + BSP_BlockSleep(); + ml307_task_id = TMOS_ProcessEventRegister(Ml307r_Handle); + // tmos_set_event(ml307_task_id, ML307_PERIODIC_EVT); + tmos_start_task(ml307_task_id, ML307_PERIODIC_EVT, MS1_TO_SYSTEM_TIME(300)); //ȶģ + } + }else + { + logDebug("ERROR ,Iot_Send_Data!!!\r\n"); + } +} + +void Iot_Send_Data(void) +{ + if(IotFlag_t.Date_Sending_flag == 0) + { + logDebug("Iot_Send_Data!!!\r\n"); + BSP_UART1_Init(); + Ml307r_Gpio_Init(); + logDebug("Ml307r_Init_Finish!!!\r\n"); + if(ml307r_obj != NULL) + { + IotFlag_t.Date_Sending_flag = 1; + IotFlag_t.module_init_flag = 1; + BSP_BlockSleep(); + ml307_task_id = TMOS_ProcessEventRegister(Ml307r_Handle); + // tmos_set_event(ml307_task_id, ML307_PERIODIC_EVT); + tmos_start_task(ml307_task_id, ML307_PERIODIC_EVT, MS1_TO_SYSTEM_TIME(300)); //ȶģ + }else + { + BSP_Ml307r_Init(); + } + }else + { + logDebug("ERROR ,Iot_Send_Data!!!\r\n"); } - ml307_task_id = TMOS_ProcessEventRegister(Ml307r_Handle); - tmos_set_event(ml307_task_id, ML307_PERIODIC_EVT); }