From c4a73d03995963ba9fb493b261bbb683c08a8238 Mon Sep 17 00:00:00 2001 From: czq <860517298@qq.com> Date: Tue, 13 May 2025 17:29:54 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9A=82=E5=AD=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .mrs/launch.json | 6 +- APP/include/peripheral.h | 2 + APP/peripheral.c | 142 +++++++++--- APP/peripheral_main.c | 3 + Profile/gattprofile.c | 13 ++ Profile/include/gattprofile.h | 11 +- bsp/inc/bsp_adc.h | 1 + bsp/inc/bsp_key.h | 6 +- bsp/inc/bsp_led.h | 53 +++-- bsp/inc/bsp_ml307r.h | 4 +- bsp/inc/bsp_motor.h | 6 +- bsp/inc/bsp_valve.h | 125 ++++++++++ bsp/src/bsp_adc.c | 37 +++ bsp/src/bsp_bmp390.c | 105 +++++---- bsp/src/bsp_key.c | 18 +- bsp/src/bsp_led.c | 12 +- bsp/src/bsp_motor.c | 10 +- bsp/src/bsp_valve.c | 418 ++++++++++++++++++++++++++++++++++ 18 files changed, 842 insertions(+), 130 deletions(-) create mode 100644 bsp/inc/bsp_valve.h create mode 100644 bsp/src/bsp_valve.c diff --git a/.mrs/launch.json b/.mrs/launch.json index 4356125..6cba574 100644 --- a/.mrs/launch.json +++ b/.mrs/launch.json @@ -5,7 +5,7 @@ "type": "mrs-debugger", "request": "launch", "name": "IoT_SCV_CH584M1", - "cwd": "c:\\Users\\123\\Desktop\\物联网自闭阀\\iot_-scv_-ch584-m", + "cwd": "c:\\Users\\123\\Desktop\\纯电自闭阀\\iot_-scv_-ch584-m", "openOCDCfg": { "useLocalOpenOCD": true, "executable": "d:/MounRiverV2/MounRiver_Studio2/resources/app/resources/win32/components/WCH/OpenOCD/OpenOCD/bin/openocd.exe", @@ -39,8 +39,8 @@ "additionalCommands": [] }, "loadedFiles": { - "executableFile": "c:\\Users\\123\\Desktop\\物联网自闭阀\\iot_-scv_-ch584-m\\obj\\IoT_SCV_CH584M1.elf", - "symbolFile": "c:\\Users\\123\\Desktop\\物联网自闭阀\\iot_-scv_-ch584-m\\obj\\IoT_SCV_CH584M1.elf", + "executableFile": "c:\\Users\\123\\Desktop\\纯电自闭阀\\iot_-scv_-ch584-m\\obj\\IoT_SCV_CH584M1.elf", + "symbolFile": "c:\\Users\\123\\Desktop\\纯电自闭阀\\iot_-scv_-ch584-m\\obj\\IoT_SCV_CH584M1.elf", "executableFileOffset": 0, "symbolFileOffset": 0 }, diff --git a/APP/include/peripheral.h b/APP/include/peripheral.h index 787428c..e0774d6 100644 --- a/APP/include/peripheral.h +++ b/APP/include/peripheral.h @@ -32,6 +32,8 @@ extern "C" { #define SBP_PARAM_UPDATE_EVT 0x0008 #define SBP_PHY_UPDATE_EVT 0x0010 +#define SBP_REPLY_CMD_EVT 0x0020 +extern uint8_t Peripheral_TaskID; /********************************************************************* * MACROS */ diff --git a/APP/peripheral.c b/APP/peripheral.c index fa52813..43af28e 100644 --- a/APP/peripheral.c +++ b/APP/peripheral.c @@ -19,6 +19,17 @@ #include "gattprofile.h" #include "peripheral.h" #include "bsp_iwdg.h" +#include "bsp_valve.h" +#include "bsp_uart.h" +#include "log.h" +#include "bsp_adc.h" +#include "bsp_led.h" +#include "SLEEP.h" +#include +#undef LOG_ENABLE +#define LOG_ENABLE 1 +#undef LOG_TAG +#define LOG_TAG "peripheral" /********************************************************************* * MACROS */ @@ -61,6 +72,8 @@ // Company Identifier: WCH #define WCH_COMPANY_ID 0x07D7 +#define MAC_NAME "ZBF-93:B4:8F:10:53:5C" +#define MAC_NAME_LEN 22 /********************************************************************* * TYPEDEFS */ @@ -68,7 +81,17 @@ /********************************************************************* * GLOBAL VARIABLES */ +volatile uint8_t mtu_flag = 0; +static volatile bool periodic_upload_block_flag = false; +void BSP_NeeedReplyCMdFirst(void) +{ + periodic_upload_block_flag = true; +} +void BSP_NoNeeedReplyCMd(void) +{ + periodic_upload_block_flag = false; +} /********************************************************************* * EXTERNAL VARIABLES */ @@ -80,19 +103,19 @@ /********************************************************************* * LOCAL VARIABLES */ -static uint8_t Peripheral_TaskID = INVALID_TASK_ID; // Task ID for internal task/event processing +uint8_t Peripheral_TaskID = INVALID_TASK_ID; // ????/???????ID // GAP - SCAN RSP data (max size = 31 bytes) static uint8_t scanRspData[] = { // complete name 0x12, // length of this data GAP_ADTYPE_LOCAL_NAME_COMPLETE, - 'S', - 'i', - 'm', - 'p', - 'l', - 'e', + 'I', + 'o', + 'T', + 'z', + 'b', + 'f', ' ', 'P', 'e', @@ -137,7 +160,7 @@ static uint8_t advertData[] = { }; // GAP GATT Attributes -static uint8_t attDeviceName[GAP_DEVICE_NAME_LEN] = "Simple Peripheral"; +static uint8_t attDeviceName[GAP_DEVICE_NAME_LEN] = "IoTzbf Peripheral"; // Connection item list static peripheralConnItem_t peripheralConnList; @@ -259,11 +282,11 @@ void Peripheral_Init() // Setup the SimpleProfile Characteristic Values { - uint8_t charValue1[SIMPLEPROFILE_CHAR1_LEN] = {1}; - uint8_t charValue2[SIMPLEPROFILE_CHAR2_LEN] = {2}; - uint8_t charValue3[SIMPLEPROFILE_CHAR3_LEN] = {3}; - uint8_t charValue4[SIMPLEPROFILE_CHAR4_LEN] = {4}; - uint8_t charValue5[SIMPLEPROFILE_CHAR5_LEN] = {1, 2, 3, 4, 5}; + uint8_t charValue1[SIMPLEPROFILE_CHAR1_LEN] = {0}; + uint8_t charValue2[SIMPLEPROFILE_CHAR2_LEN] = {0}; + uint8_t charValue3[SIMPLEPROFILE_CHAR3_LEN] = {0}; + uint8_t charValue4[SIMPLEPROFILE_CHAR4_LEN] = {0}; + uint8_t charValue5[SIMPLEPROFILE_CHAR5_LEN] = {0, 0, 0, 0, 0}; SimpleProfile_SetParameter(SIMPLEPROFILE_CHAR1, SIMPLEPROFILE_CHAR1_LEN, charValue1); SimpleProfile_SetParameter(SIMPLEPROFILE_CHAR2, SIMPLEPROFILE_CHAR2_LEN, charValue2); @@ -287,6 +310,7 @@ void Peripheral_Init() // ע㲥¼¼ص LL_AdvertiseEventRegister(BLE_AdvertiseEventCB); LL_ConnectEventRegister(BLE_ConnectEventCB); + GATT_InitClient(); } /********************************************************************* @@ -343,16 +367,26 @@ uint16_t Peripheral_ProcessEvent(uint8_t task_id, uint16_t events) GAPRole_PeripheralStartDevice(Peripheral_TaskID, &Peripheral_BondMgrCBs, &Peripheral_PeripheralCBs); return (events ^ SBP_START_DEVICE_EVT); } + if(events & SBP_REPLY_CMD_EVT) + { + logDebug("SBP_REPLY_CMD_EVT"); + peripheralChar4Notify((uint8_t *)&RelyData.buf[0], RelyData.len); + BSP_NoNeeedReplyCMd(); + return (events ^ SBP_REPLY_CMD_EVT); + } if(events & SBP_PERIODIC_EVT) { // Restart timer - if(SBP_PERIODIC_EVT_PERIOD) + if(periodic_upload_block_flag == false && mtu_flag == 1) { + performPeriodicTask(); tmos_start_task(Peripheral_TaskID, SBP_PERIODIC_EVT, SBP_PERIODIC_EVT_PERIOD); } - // Perform periodic application task - performPeriodicTask(); + else + { + tmos_start_task(Peripheral_TaskID, SBP_PERIODIC_EVT, 1600 * 1); + } return (events ^ SBP_PERIODIC_EVT); } @@ -448,7 +482,8 @@ static void Peripheral_ProcessTMOSMsg(tmos_event_hdr_t *pMsg) if(pMsgEvent->method == ATT_MTU_UPDATED_EVENT) { peripheralMTU = pMsgEvent->msg.exchangeMTUReq.clientRxMTU; - PRINT("mtu exchange: %d\n", pMsgEvent->msg.exchangeMTUReq.clientRxMTU); + mtu_flag = 1; + logDebug("****mtu exchange: %d****", pMsgEvent->msg.exchangeMTUReq.clientRxMTU); } break; } @@ -492,8 +527,13 @@ static void Peripheral_LinkEstablished(gapRoleEvent_t *pEvent) // Start read rssi tmos_start_task(Peripheral_TaskID, SBP_READ_RSSI_EVT, SBP_READ_RSSI_EVT_PERIOD); + attExchangeMTUReq_t req = { + .clientRxMTU = BLE_BUFF_MAX_LEN - 4, + }; + GATT_ExchangeMTU(peripheralConnList.connHandle, &req, Peripheral_TaskID); + enable_notify(peripheralConnList.connHandle, ENABLE); - PRINT("Conn %x - Int %x \n", event->connectionHandle, event->connInterval); + logDebug("Conn %x - Int %x= %.1fms", event->connectionHandle, event->connInterval, event->connInterval * 1.25); } } @@ -518,6 +558,7 @@ static void Peripheral_LinkTerminated(gapRoleEvent_t *pEvent) peripheralConnList.connTimeout = 0; tmos_stop_task(Peripheral_TaskID, SBP_PERIODIC_EVT); tmos_stop_task(Peripheral_TaskID, SBP_READ_RSSI_EVT); + mtu_flag = 0; // Restart advertising { @@ -527,7 +568,7 @@ static void Peripheral_LinkTerminated(gapRoleEvent_t *pEvent) } else { - PRINT("ERR..\n"); + logError("ERR.."); } } @@ -543,7 +584,8 @@ static void Peripheral_LinkTerminated(gapRoleEvent_t *pEvent) */ static void peripheralRssiCB(uint16_t connHandle, int8_t rssi) { - PRINT("RSSI -%d dB Conn %x \n", -rssi, connHandle); + gValveData.rssi = rssi; + logDebug("RSSI %d dB Conn %x ", gValveData.rssi, connHandle); } /********************************************************************* @@ -567,11 +609,12 @@ static void peripheralParamUpdateCB(uint16_t connHandle, uint16_t connInterval, peripheralConnList.connSlaveLatency = connSlaveLatency; peripheralConnList.connTimeout = connTimeout; - PRINT("Update %x - Int %x \n", connHandle, connInterval); + logDebug("ParamUpdateCB (Handle)%x - (connInt 0x%x=%.1fms) - (connSlaveLatency) %x - (connTimeout 0x%x=%dms)", + connHandle, connInterval, connInterval * 1.25, connSlaveLatency, connTimeout * 10, connTimeout * 10); } else { - PRINT("ERR..\n"); + logError("ERR.."); } } @@ -672,8 +715,22 @@ static void peripheralStateNotificationCB(gapRole_States_t newState, gapRoleEven */ static void performPeriodicTask(void) { - uint8_t notiData[SIMPLEPROFILE_CHAR4_LEN] = {0x88}; - peripheralChar4Notify(notiData, SIMPLEPROFILE_CHAR4_LEN); + // ?????? + gValveData.bat = BSP_ReadVbat(); + if (gValveData.bat <= LOW_VABAT_CLOSE_VALUE) + { + gValveData.switch_status = kClosed; + tmos_set_event(vavle_task_id, VAVLE_CLOSE_START_EVT); + } + else if (gValveData.bat <= LOW_VABAT_ALARM_VALUE) + { + tmos_set_event(vavle_task_id, VAVLE_LOW_VBAT_ALARM_EVT); + } + logDebug("switch_status:%d Temp:%d Bat:%d Humi:%d%% RSSI: %d", + gValveData.switch_status, gValveData.temp, gValveData.bat, gValveData.humi, gValveData.rssi); + TsRawFrameData RawData; + BSP_VALVE_Generate_UploadData(&RawData); + peripheralChar4Notify(&RawData.buf[0], RawData.len); } /********************************************************************* @@ -719,21 +776,50 @@ static void peripheralChar4Notify(uint8_t *pValue, uint16_t len) */ static void simpleProfileChangeCB(uint8_t paramID, uint8_t *pValue, uint16_t len) { + BSP_NeeedReplyCMdFirst(); switch(paramID) { case SIMPLEPROFILE_CHAR1: { uint8_t newValue[SIMPLEPROFILE_CHAR1_LEN]; tmos_memcpy(newValue, pValue, len); - PRINT("profile ChangeCB CHAR1.. \n"); + logDebug("profile ChangeCB CHAR1.. Start"); + for (uint8_t i = 0; i < len; i++) + { + logDebug("%02x ", newValue[i]); + } + logDebug("\n profile ChangeCB CHAR1.. End"); break; } case SIMPLEPROFILE_CHAR3: { - uint8_t newValue[SIMPLEPROFILE_CHAR3_LEN]; - tmos_memcpy(newValue, pValue, len); - PRINT("profile ChangeCB CHAR3..\n"); + logDebug("CHAR3 Start"); + uint8_t *p_rev_msg; + p_rev_msg = tmos_msg_allocate(len + 1); + if (p_rev_msg) + { + p_rev_msg[0] = len; + tmos_memcpy(&p_rev_msg[1], pValue, len); + logDebug("rece data len: %d", len); + for (uint8_t i = 0; i < len; i++) { + logDebug("pValue%d: 0x%02X", i, pValue[i]); + } + int ret = tmos_msg_send(vavle_task_id, p_rev_msg); + if (ret == SUCCESS) + { + logDebug("p_rev_msg send ret = %d", ret); + } + else + { + logError("p_rev_msg send ret = %d", ret); + } + } + else + { + logError("????"); + } + logDebug("profile ChangeCB CHAR3.. End"); break; } diff --git a/APP/peripheral_main.c b/APP/peripheral_main.c index fd0ce50..0b96151 100644 --- a/APP/peripheral_main.c +++ b/APP/peripheral_main.c @@ -24,6 +24,7 @@ #include "bsp_led.h" #include "bsp_key.h" #include "bsp_iwdg.h" +#include "bsp_valve.h" #include "log.h" #undef LOG_ENABLE @@ -104,6 +105,8 @@ int main(void) BSP_MOTOR_Init(); VALVE_OPEN(); + DelayMs(2000); + BSP_VAVLE_Init(); BSP_LED_Init(); diff --git a/Profile/gattprofile.c b/Profile/gattprofile.c index 488567c..91ff557 100644 --- a/Profile/gattprofile.c +++ b/Profile/gattprofile.c @@ -726,5 +726,18 @@ static void simpleProfile_HandleConnStatusCB(uint16_t connHandle, uint8_t change } } +uint8_t enable_notify(uint16_t connection_handle, uint8_t enable) +{ + uint16_t cccd = 0; //һcccdֵ + if(enable) //ʹ + { + cccd |= GATT_CLIENT_CFG_NOTIFY; //cccdΪʹֵ֪ͨ + } + else + { + cccd &= ~GATT_CLIENT_CFG_NOTIFY; //ʹܣcccdΪֵֹ֪ͨ + } + return GATTServApp_WriteCharCfg( connection_handle, simpleProfileChar4Config, cccd); //ֵд뵽Ӿʵ֪ͨʹܻ +} /********************************************************************* *********************************************************************/ diff --git a/Profile/include/gattprofile.h b/Profile/include/gattprofile.h index 02c3a56..db1ff9a 100644 --- a/Profile/include/gattprofile.h +++ b/Profile/include/gattprofile.h @@ -46,11 +46,11 @@ extern "C" { #define SIMPLEPROFILE_SERVICE 0x00000001 // Length of characteristic in bytes ( Default MTU is 23 ) -#define SIMPLEPROFILE_CHAR1_LEN 1 -#define SIMPLEPROFILE_CHAR2_LEN 1 -#define SIMPLEPROFILE_CHAR3_LEN 1 -#define SIMPLEPROFILE_CHAR4_LEN 1 -#define SIMPLEPROFILE_CHAR5_LEN 5 +#define SIMPLEPROFILE_CHAR1_LEN 64 +#define SIMPLEPROFILE_CHAR2_LEN 64 +#define SIMPLEPROFILE_CHAR3_LEN 64 +#define SIMPLEPROFILE_CHAR4_LEN 64 +#define SIMPLEPROFILE_CHAR5_LEN 64 /********************************************************************* * TYPEDEFS @@ -125,6 +125,7 @@ extern bStatus_t SimpleProfile_GetParameter(uint8_t param, void *value); */ extern bStatus_t simpleProfile_Notify(uint16_t connHandle, attHandleValueNoti_t *pNoti); +extern uint8_t enable_notify(uint16_t connection_handle, uint8_t enable); /********************************************************************* *********************************************************************/ diff --git a/bsp/inc/bsp_adc.h b/bsp/inc/bsp_adc.h index 127f0b9..2d35bd1 100644 --- a/bsp/inc/bsp_adc.h +++ b/bsp/inc/bsp_adc.h @@ -20,4 +20,5 @@ void BSP_VBAT_Init(void); void Send_Low_Battery_Message(float vbat); void Handle_Low_Battery(float vbat); +uint8_t BSP_ReadVbat(void); #endif /* INCLUDE_BSP_ADC_H_ */ diff --git a/bsp/inc/bsp_key.h b/bsp/inc/bsp_key.h index 145a572..a5aa2cf 100644 --- a/bsp/inc/bsp_key.h +++ b/bsp/inc/bsp_key.h @@ -16,9 +16,11 @@ #define KEY_IDLE_TIMEOUT_EVT (0x0001 << 2) // KEY_B_PIN at PB7,low->active -#define KEY_B_PIN GPIO_Pin_0 +#define KEY_A_PIN GPIO_Pin_7 -#define IS_KEY_Vaild() ((GPIOB_ReadPortPin(KEY_B_PIN) ? 0 : 1)) +extern volatile uint8_t key_wakeup_flag; + +#define IS_KEY_Vaild() ((GPIOA_ReadPortPin(KEY_A_PIN) ? 0 : 1)) typedef enum { diff --git a/bsp/inc/bsp_led.h b/bsp/inc/bsp_led.h index a202890..a74bffe 100644 --- a/bsp/inc/bsp_led.h +++ b/bsp/inc/bsp_led.h @@ -10,11 +10,10 @@ #include "CH58x_common.h" -#define LED_VALVE_R_PIN GPIO_Pin_7 -#define LED_VALVE_G_PIN GPIO_Pin_8 -#define LED_VALVE_Y_PIN GPIO_Pin_9 -#define LED_ALARM_PIN GPIO_Pin_9 -#define LED_VBAT_PIN GPIO_Pin_4 +#define LED_VALVE_R_PIN GPIO_Pin_8 +#define LED_VALVE_G_PIN GPIO_Pin_9 +#define LED_ALARM_PIN GPIO_Pin_12 +#define LED_VBAT_PIN GPIO_Pin_1 /*********************************************************************************************** #define LED_VALVE_OPEN {GPIOA_ResetBits(LED_VALVE_R_PIN | LED_VALVE_G_PIN | LED_VALVE_Y_PIN);\ @@ -42,66 +41,66 @@ #define LED_VALVE_OPEN \ do \ { \ - GPIOA_ResetBits(LED_VALVE_R_PIN | LED_VALVE_G_PIN | LED_VALVE_Y_PIN);\ - GPIOA_SetBits(LED_VALVE_G_PIN); \ - GPIOA_ModeCfg(LED_VALVE_R_PIN | LED_VALVE_G_PIN | LED_VALVE_Y_PIN, GPIO_ModeOut_PP_5mA); \ + GPIOB_ResetBits(LED_VALVE_R_PIN | LED_VALVE_G_PIN );\ + GPIOB_SetBits(LED_VALVE_G_PIN); \ + GPIOB_ModeCfg(LED_VALVE_R_PIN | LED_VALVE_G_PIN, GPIO_ModeOut_PP_5mA); \ } while (0); #define LED_VALVE_CLOSE \ do \ { \ - GPIOA_ResetBits(LED_VALVE_R_PIN | LED_VALVE_G_PIN | LED_VALVE_Y_PIN);\ - GPIOA_SetBits(LED_VALVE_R_PIN); \ - GPIOA_ModeCfg(LED_VALVE_R_PIN | LED_VALVE_G_PIN | LED_VALVE_Y_PIN, GPIO_ModeOut_PP_5mA); \ + GPIOB_ResetBits(LED_VALVE_R_PIN | LED_VALVE_G_PIN);\ + GPIOB_SetBits(LED_VALVE_R_PIN); \ + GPIOB_ModeCfg(LED_VALVE_R_PIN | LED_VALVE_G_PIN, GPIO_ModeOut_PP_5mA); \ } while (0); /**********LED_ALARM**************/ #define LED_ALARM_OPEN \ do \ { \ - GPIOB_SetBits(LED_ALARM_PIN); \ - GPIOB_ModeCfg(LED_ALARM_PIN, GPIO_ModeOut_PP_5mA); \ + GPIOA_SetBits(LED_ALARM_PIN); \ + GPIOA_ModeCfg(LED_ALARM_PIN, GPIO_ModeOut_PP_5mA); \ } while (0); #define LED_ALARM_CLOSE \ do \ { \ - GPIOB_ResetBits(LED_ALARM_PIN); \ - GPIOB_ModeCfg(LED_ALARM_PIN, GPIO_ModeOut_PP_5mA); \ + GPIOA_ResetBits(LED_ALARM_PIN); \ + GPIOA_ModeCfg(LED_ALARM_PIN, GPIO_ModeOut_PP_5mA); \ } while (0); /**********LED_VBAT**************/ #define LED_VBAT_OPEN \ do \ { \ - GPIOB_SetBits(LED_VBAT_PIN); \ - GPIOB_ModeCfg(LED_VBAT_PIN, GPIO_ModeOut_PP_5mA); \ + GPIOA_SetBits(LED_VBAT_PIN); \ + GPIOA_ModeCfg(LED_VBAT_PIN, GPIO_ModeOut_PP_5mA); \ } while (0); #define LED_VBAT_CLOSE \ do \ { \ - GPIOB_ResetBits(LED_VBAT_PIN); \ - GPIOB_ModeCfg(LED_VBAT_PIN, GPIO_ModeOut_PP_5mA); \ + GPIOA_ResetBits(LED_VBAT_PIN); \ + GPIOA_ModeCfg(LED_VBAT_PIN, GPIO_ModeOut_PP_5mA); \ } while (0); /**********LED_ALL**************/ #define LED_ALL_OPEN \ do \ { \ - GPIOA_SetBits(LED_VALVE_R_PIN | LED_VALVE_G_PIN | LED_VALVE_Y_PIN);\ - GPIOB_SetBits(LED_ALARM_PIN | LED_VBAT_PIN);\ - GPIOA_ModeCfg(LED_VALVE_R_PIN | LED_VALVE_G_PIN | LED_VALVE_Y_PIN, GPIO_ModeOut_PP_5mA); \ - GPIOB_ModeCfg(LED_ALARM_PIN | LED_VBAT_PIN, GPIO_ModeOut_PP_5mA); \ + GPIOB_SetBits(LED_VALVE_R_PIN | LED_VALVE_G_PIN);\ + GPIOA_SetBits(LED_ALARM_PIN | LED_VBAT_PIN);\ + GPIOB_ModeCfg(LED_VALVE_R_PIN | LED_VALVE_G_PIN, GPIO_ModeOut_PP_5mA); \ + GPIOA_ModeCfg(LED_ALARM_PIN | LED_VBAT_PIN, GPIO_ModeOut_PP_5mA); \ } while (0); #define LED_ALL_CLOSE \ do \ { \ - GPIOA_ResetBits(LED_VALVE_R_PIN | LED_VALVE_G_PIN | LED_VALVE_Y_PIN);\ - GPIOB_ResetBits(LED_ALARM_PIN | LED_VBAT_PIN); \ - GPIOA_ModeCfg(LED_VALVE_R_PIN | LED_VALVE_G_PIN | LED_VALVE_Y_PIN, GPIO_ModeOut_PP_5mA); \ - GPIOB_ModeCfg(LED_ALARM_PIN | LED_VBAT_PIN, GPIO_ModeOut_PP_5mA); \ + GPIOB_ResetBits(LED_VALVE_R_PIN | LED_VALVE_G_PIN);\ + GPIOA_ResetBits(LED_ALARM_PIN | LED_VBAT_PIN); \ + GPIOB_ModeCfg(LED_VALVE_R_PIN | LED_VALVE_G_PIN, GPIO_ModeOut_PP_5mA); \ + GPIOA_ModeCfg(LED_ALARM_PIN | LED_VBAT_PIN, GPIO_ModeOut_PP_5mA); \ } while (0); void BSP_LED_Init(void); diff --git a/bsp/inc/bsp_ml307r.h b/bsp/inc/bsp_ml307r.h index 986039a..b718938 100644 --- a/bsp/inc/bsp_ml307r.h +++ b/bsp/inc/bsp_ml307r.h @@ -8,8 +8,8 @@ #define ENABLE_3_8_V GPIO_Pin_3 //PB3 #define USIM_DECT_PIN GPIO_Pin_5 //PB5 -#define ML307_PWR_PIN GPIO_Pin_6 //PB6 -#define ML307_RST_PIN GPIO_Pin_7 //PB7 +#define ML307_PWR_PIN GPIO_Pin_7 //PB6 +#define ML307_RST_PIN GPIO_Pin_6 //PB7 #define ML307_UART_TX_PIN GPIO_Pin_13 //PB13 #define ML307_UART_RX_PIN GPIO_Pin_12 //PB12 diff --git a/bsp/inc/bsp_motor.h b/bsp/inc/bsp_motor.h index ee3f60f..f73dd53 100644 --- a/bsp/inc/bsp_motor.h +++ b/bsp/inc/bsp_motor.h @@ -18,9 +18,9 @@ typedef struct state{ uint8_t off_state; //ѹ״̬ }valve_state; extern valve_state valve_status; -#define NSLEEP_PIN GPIO_Pin_8 -#define COIL_A GPIO_Pin_17 -#define COIL_B GPIO_Pin_16 +#define COIL_ADC GPIO_Pin_5 +#define COIL_A GPIO_Pin_1 +#define COIL_B GPIO_Pin_0 void BSP_MOTOR_Init(void); void VALVE_OPEN(void); diff --git a/bsp/inc/bsp_valve.h b/bsp/inc/bsp_valve.h new file mode 100644 index 0000000..335c6ee --- /dev/null +++ b/bsp/inc/bsp_valve.h @@ -0,0 +1,125 @@ +/* + * @Author : stark1898y 1658608470@qq.com + * @Date : 2024-12-12 15:55:38 + * @LastEditors : stark1898y 1658608470@qq.com + * @LastEditTime : 2025-02-24 16:39:07 + * @FilePath : \BLE_TYQ_CH584M\BSP\inc\bsp_valve.h + * @Description : + * + * Copyright (c) 2024 by yzy, All Rights Reserved. + */ +#ifndef __BSP_VALVE_H__ +#define __BSP_VALVE_H__ + +#include "CONFIG.h" + +extern tmosTaskID vavle_task_id; + + +#define VAVLE_RX_DATA_EVT (0x0001 << 0) +#define VAVLE_TX_DATA_EVT (0x0001 << 1) + +#define VAVLE_CLOSE_START_EVT (0x0001 << 2) // 关阀,开始准备 +#define VAVLE_CLOSE_ACTION_EVT (0x0001 << 3) // 关阀,动作 +#define VAVLE_CLOSE_END_EVT (0x0001 << 4) // 关阀结束 + +#define VAVLE_OPEN_START_EVT (0x0001 << 5) // 开阀,开始准备 +#define VAVLE_OPEN_ACTION_EVT (0x0001 << 6) // 开阀,动作 +#define VAVLE_OPEN_END_EVT (0x0001 << 9) // 开阀结束 + +#define VAVLE_LOW_VBAT_ALARM_EVT (0x0001 << 7) // 低电压提醒 + +#define VAVLE_LOOP_DECT_EVT (0x0001 << 8) // 循环检测 + +#define VALVE_LOW_VBAT_ALARM_PERIOD_MS (1600 * 60 * 10) + +#define VALVE_DECT_PERIOD_MS (1600 * 60 * 10) + + + +#define CHARGE_TIME_MS (1500) + +// 2.2V +#define LOW_VABAT_ALARM_VALUE 22 + +#define LOW_VABAT_CLOSE_VALUE 20 + + +#define FRAME_HEADER 0xAA +#define FRAME_TAIL 0x55 + +// 0xAA CMD/DATA/ DATA_LEN (DATA) checksum 0x55 + +typedef enum +{ + kCmdCfg = 0X01, + kCmdCloseVavle, + kCmdOpenVavle, + kCmdData, +} TeFrameCmd; + +typedef struct __attribute__((packed)) +{ + TeFrameCmd cmd; // CMD/DATA + uint8_t len; // DATA_LEN + // TsValveData data; + uint8_t data[]; +} TsFrameData; + +typedef struct __attribute__((packed)) +{ + uint8_t len; + uint8_t buf[64]; +} TsRawFrameData; + +extern TsRawFrameData RelyData; + +// 阀门类型 +typedef enum +{ + kTyq = 0X01, + kZbf, + kDcf, +} TeVavleType; + +typedef enum +{ + kUnknown = 0, + kClosed, + kOpened, + kDisconnect, +} TeValveSwitchStatus; + +typedef struct __attribute__((packed)) +{ + // uint8_t status; // 1B 阀门工作状态 超欠压、过流 + // uint8_t connct_status; // 1B 阀门连接状态 (电磁阀BLE控制盒) 0=未连接 1=已连接 + uint8_t switch_status; // 1B 阀门开关状态 0=未知 1=关闭=关闭过,未按按键恢复 2=关闭过,按下了恢复键 = 打开 + int8_t temp; // 1B 阀门温度 有符号整数 25 ℃ + + uint32_t in_pressure; // 4B 阀门入口压力 Pa + uint32_t out_pressure; // 4B 阀门出口压力 Pa + uint32_t atm_pressure; // 4B 阀门大气压力 Pa + uint8_t type; // 阀门类型 + uint8_t bat; // 1B 电池电压 30=3V,18=1.8V + uint8_t humi; // 1B 阀门湿度 %RH + int8_t rssi; +} TsValveData; +extern TsValveData gValveData; + +uint8_t CheckSum(const uint8_t *data, size_t len); + +void BSP_VAVLE_Init(void); +void BSP_CloseValve(void); +void BSP_OpenValve(void); + +TsFrameData* BSP_VAVLE_GetFrameData(uint8_t *data, uint8_t len); + +uint8_t GenerateRawFrame(TsRawFrameData *pRawData, uint8_t cmd, const uint8_t *p_src, uint8_t src_len); + +void BSP_VALVE_Generate_Data(TsRawFrameData *pRawData, uint8_t switch_status, uint8_t bat, int8_t temp, uint8_t humi); +void BSP_VALVE_Generate_ValveResponse(TsRawFrameData *pRawData, TeFrameCmd cmd, uint8_t status); + +void BSP_VALVE_Generate_UploadData(TsRawFrameData *pRawData); + +#endif // ! __BSP_VALVE_H__ diff --git a/bsp/src/bsp_adc.c b/bsp/src/bsp_adc.c index 3f6d81e..afd3d5c 100644 --- a/bsp/src/bsp_adc.c +++ b/bsp/src/bsp_adc.c @@ -166,3 +166,40 @@ void BSP_VBAT_Init(void) vbat_task_id = TMOS_ProcessEventRegister(VBAT_ProcessEvent); tmos_set_event(vbat_task_id, VBAT_EVT_START); } +uint16_t adcBuff[40]; +volatile uint8_t adclen; +volatile uint8_t DMA_end = 0; +uint32_t countadc = 0; +uint16_t min_number = 0; +uint16_t max_number = 0; +double voltage = 0; +uint8_t BSP_ReadVbat(void) +{ + uint8_t i; + uint32_t CountBat = 0; + ADC_InterBATSampInit(); + DelayUs(1); + ADC_ExcutSingleConver(); + DelayUs(1); + for (i = 0; i < 20; i++) + { + adcBuff[i] = ADC_ExcutSingleConver(); // 20 + } + for (i = 0; i < 20; i++) + { + CountBat += adcBuff[i]; + if (i == 0) + { + min_number = adcBuff[i]; + max_number = adcBuff[i]; + } + min_number = ((min_number > adcBuff[i]) ? adcBuff[i] : min_number); // ˲ + max_number = ((max_number < adcBuff[i]) ? adcBuff[i] : max_number); + } + logDebug("min_number = %d, max_number = %d", min_number, max_number); + CountBat = (CountBat - min_number - max_number) / 18; // ɾСֵ + CountBat = CountBat * 2.05078125 - 3150; + uint8_t vbat = (uint8_t)(CountBat / 100); + logDebug("AverageCountBat = %dmV, vbat = %d(100mV)", CountBat, vbat); + return vbat; +} \ No newline at end of file diff --git a/bsp/src/bsp_bmp390.c b/bsp/src/bsp_bmp390.c index 6022c9e..d099d52 100644 --- a/bsp/src/bsp_bmp390.c +++ b/bsp/src/bsp_bmp390.c @@ -23,14 +23,14 @@ typedef enum static tmosTaskID press_task_id = INVALID_TASK_ID; -#define PRESS_IN_CS_HIGH() GPIOA_SetBits(GPIO_Pin_5) -#define PRESS_IN_CS_LOW() GPIOA_ResetBits(GPIO_Pin_5) +#define PRESS_IN_CS_HIGH() GPIOA_SetBits(GPIO_Pin_8) +#define PRESS_IN_CS_LOW() GPIOA_ResetBits(GPIO_Pin_8) -#define PRESS_OUT_CS_HIGH() GPIOA_SetBits(GPIO_Pin_0) -#define PRESS_OUT_CS_LOW() GPIOA_ResetBits(GPIO_Pin_0) +#define PRESS_OUT_CS_HIGH() GPIOA_SetBits(GPIO_Pin_2) +#define PRESS_OUT_CS_LOW() GPIOA_ResetBits(GPIO_Pin_2) -#define PRESS_ATOM_CS_HIGH() GPIOA_SetBits(GPIO_Pin_3) -#define PRESS_ATOM_CS_LOW() GPIOA_ResetBits(GPIO_Pin_3) +#define PRESS_ATOM_CS_HIGH() GPIOA_SetBits(GPIO_Pin_0) +#define PRESS_ATOM_CS_LOW() GPIOA_ResetBits(GPIO_Pin_0) uint8_t volatile press_done_flag = 0; @@ -314,15 +314,15 @@ void PRESS_IO_SPI_Init(void) // SDA: MOSI // SDO: MISO + GPIOA_SetBits(GPIO_Pin_2); + GPIOA_ModeCfg(GPIO_Pin_2, GPIO_ModeOut_PP_5mA); + + GPIOA_SetBits(GPIO_Pin_8); + GPIOA_ModeCfg(GPIO_Pin_8, GPIO_ModeOut_PP_5mA); + GPIOA_SetBits(GPIO_Pin_0); GPIOA_ModeCfg(GPIO_Pin_0, GPIO_ModeOut_PP_5mA); - GPIOA_SetBits(GPIO_Pin_5); - GPIOA_ModeCfg(GPIO_Pin_5, GPIO_ModeOut_PP_5mA); - - GPIOA_SetBits(GPIO_Pin_3); - GPIOA_ModeCfg(GPIO_Pin_3, GPIO_ModeOut_PP_5mA); - SPI_CsStop(kPressIn); SPI_CsStop(kPressOut); SPI_CsStop(kPressAtom); @@ -342,29 +342,29 @@ void PRESS_LowerIO_Init(void) GPIOA_ModeCfg(GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15, GPIO_ModeIN_PU); // CSB3: PA0 - GPIOA_SetBits(GPIO_Pin_0); - GPIOA_ModeCfg(GPIO_Pin_0, GPIO_ModeIN_PU); + GPIOA_SetBits(GPIO_Pin_2); + GPIOA_ModeCfg(GPIO_Pin_2, GPIO_ModeIN_PU); // CSB2: PA5 - GPIOA_SetBits(GPIO_Pin_5); - GPIOA_ModeCfg(GPIO_Pin_5, GPIO_ModeIN_PU); + GPIOA_SetBits(GPIO_Pin_8); + GPIOA_ModeCfg(GPIO_Pin_8, GPIO_ModeIN_PU); // CSB1: PA3 - GPIOA_SetBits(GPIO_Pin_3); - GPIOA_ModeCfg(GPIO_Pin_3, GPIO_ModeIN_PU); + GPIOA_SetBits(GPIO_Pin_0); + GPIOA_ModeCfg(GPIO_Pin_0, GPIO_ModeIN_PU); } void Lower_IO_Deinit(void) { // LED - GPIOA_ResetBits(LED_VALVE_R_PIN | LED_VALVE_G_PIN | LED_VALVE_Y_PIN); - GPIOA_ModeCfg(LED_VALVE_R_PIN | LED_VALVE_G_PIN | LED_VALVE_Y_PIN, GPIO_ModeIN_PD); - GPIOB_ResetBits(LED_VBAT_PIN | LED_ALARM_PIN); - GPIOB_ModeCfg(LED_VBAT_PIN | LED_ALARM_PIN, GPIO_ModeIN_PD); + GPIOB_ResetBits(LED_VALVE_R_PIN | LED_VALVE_G_PIN); + GPIOB_ModeCfg(LED_VALVE_R_PIN | LED_VALVE_G_PIN, GPIO_ModeIN_PD); + GPIOA_ResetBits(LED_VBAT_PIN | LED_ALARM_PIN); + GPIOA_ModeCfg(LED_VBAT_PIN | LED_ALARM_PIN, GPIO_ModeIN_PD); // KEY | RESET KEY | boot KEY - GPIOB_ResetBits(KEY_B_PIN ); - GPIOB_ModeCfg(KEY_B_PIN, GPIO_ModeIN_PU); + GPIOA_ResetBits(KEY_A_PIN ); + GPIOA_ModeCfg(KEY_A_PIN, GPIO_ModeIN_PU); // GPIOB_ResetBits(GPIO_Pin_23 | GPIO_Pin_22); // GPIOB_ModeCfg(GPIO_Pin_23 | GPIO_Pin_22, GPIO_ModeIN_PD); @@ -375,7 +375,7 @@ void Lower_IO_Deinit(void) // BMP390 // INT1: PA2 | INT2: PA6 | INT3: PA12 - GPIOA_ModeCfg(GPIO_Pin_2 | GPIO_Pin_6 | GPIO_Pin_12, GPIO_ModeIN_PD); + GPIOA_ModeCfg(GPIO_Pin_6 | GPIO_Pin_9 | GPIO_Pin_3, GPIO_ModeIN_PD); // spiʼ GPIOA_ModeCfg(GPIO_Pin_13 | GPIO_Pin_14, GPIO_ModeIN_PD); GPIOA_ModeCfg(GPIO_Pin_15, GPIO_ModeIN_PD); @@ -392,12 +392,12 @@ void Lower_IO_Deinit(void) GPIOB_ModeCfg(USIM_DECT_PIN, GPIO_ModeIN_PD); //motor - GPIOB_ResetBits(NSLEEP_PIN); - GPIOB_ModeCfg(NSLEEP_PIN, GPIO_ModeIN_PD); + //GPIOA_ResetBits(COIL_ADC); + //GPIOA_ModeCfg(COIL_ADC, GPIO_ModeIN_PD); //IN1 + ; IN2 + //GPIOB_SetBits(COIL_A); //GPIOB_SetBits(COIL_B); - GPIOB_ModeCfg(COIL_A | COIL_B, GPIO_ModeIN_PD); + //GPIOB_ModeCfg(COIL_A | COIL_B, GPIO_ModeIN_PD); // UART3 // GPIOB_ModeCfg(GPIO_Pin_21 | GPIO_Pin_20, GPIO_ModeIN_PD); @@ -637,15 +637,15 @@ void BSP_PRESS_Init(void) PRESS_IO_SPI_Init(); // жŵ + GPIOA_ModeCfg(GPIO_Pin_9, GPIO_ModeIN_PD); + GPIOA_ITModeCfg(GPIO_Pin_9, GPIO_ITMode_RiseEdge); + + GPIOA_ModeCfg(GPIO_Pin_3, GPIO_ModeIN_PD); + GPIOA_ITModeCfg(GPIO_Pin_3, GPIO_ITMode_RiseEdge); + GPIOA_ModeCfg(GPIO_Pin_6, GPIO_ModeIN_PD); GPIOA_ITModeCfg(GPIO_Pin_6, GPIO_ITMode_RiseEdge); - GPIOA_ModeCfg(GPIO_Pin_12, GPIO_ModeIN_PD); - GPIOA_ITModeCfg(GPIO_Pin_12, GPIO_ITMode_RiseEdge); - - GPIOA_ModeCfg(GPIO_Pin_2, GPIO_ModeIN_PD); - GPIOA_ITModeCfg(GPIO_Pin_2, GPIO_ITMode_RiseEdge); - PWR_PeriphWakeUpCfg(ENABLE, RB_GPIO_WAKE_MODE | RB_SLP_GPIO_WAKE, Long_Delay); PFIC_EnableIRQ(GPIO_A_IRQn); @@ -744,7 +744,7 @@ uint16_t Check_ProcessEvent(uint8_t task_id, uint16_t events) //Ƿѹ if(P[0] - P[2] <= 80) //800 { - VALVE_CLOSE(); + // VALVE_CLOSE(); fault_state = 2; tmos_start_task(check_task_id, MOTOR_STOP_EVT, MS1_TO_SYSTEM_TIME(1500)); //1000 logDebug("motor low close"); @@ -805,23 +805,46 @@ __INTERRUPT __HIGH_CODE void GPIOA_IRQHandler(void) { - if (R16_PA_INT_IF & GPIO_Pin_6) + // жϱ־λ + GPIOA_ClearITFlagBit(KEY_A_PIN); + + // ǷΪʵ¼ͨȷϵƽǷĽӽ0V + if (GPIOA_ReadPortPin(KEY_A_PIN) == 0) { + // ٴȷǷΪ͵ƽӽ0V + DelayUs(50); // ʱ + if (GPIOA_ReadPortPin(KEY_A_PIN) == 0) { + // ȷʵ¼ + // ֹ˯ + BSP_BlockSleep(); + // ذж + BSP_KEY_ExitLowpower(); + + printf("KEY IRQ"); + key_wakeup_flag = 1; + } + } else { + // ǵԴµжϣԴ˴ж + // printf("Power Fluctuation - Ignored"); + } + + + if (R16_PA_INT_IF & GPIO_Pin_9) { - R16_PA_INT_IF = GPIO_Pin_6; + R16_PA_INT_IF = GPIO_Pin_9; flag = 1; tmos_set_event(press_task_id, BMP390_EVT_READ); // logDebug("INT2 \r\n"); } - else if (R16_PA_INT_IF & GPIO_Pin_12) + else if (R16_PA_INT_IF & GPIO_Pin_3) { - R16_PA_INT_IF = GPIO_Pin_12; + R16_PA_INT_IF = GPIO_Pin_3; flag = 2; tmos_set_event(press_task_id, BMP390_EVT_READ); // logDebug("INT3 \r\n"); } - else if (R16_PA_INT_IF & GPIO_Pin_2) + else if (R16_PA_INT_IF & GPIO_Pin_6) { - R16_PA_INT_IF = GPIO_Pin_2; + R16_PA_INT_IF = GPIO_Pin_6; flag = 3; tmos_set_event(press_task_id, BMP390_EVT_READ); // logDebug("INT1 \r\n"); diff --git a/bsp/src/bsp_key.c b/bsp/src/bsp_key.c index bbe9134..ab89226 100644 --- a/bsp/src/bsp_key.c +++ b/bsp/src/bsp_key.c @@ -167,7 +167,7 @@ void BSP_KEY_EnterLowpower(void) // TODO:按键电平触发设置 // 下降沿触发 - GPIOB_ITModeCfg(KEY_B_PIN, GPIO_ITMode_FallEdge); + GPIOA_ITModeCfg(KEY_A_PIN, GPIO_ITMode_FallEdge); // 开启GPIO的睡眠唤醒,如果需要的话 // PWR_PeriphWakeUpCfg(ENABLE, RB_SLP_GPIO_WAKE, Long_Delay); @@ -294,10 +294,10 @@ void BSP_KEY_Init(app_task_evt_handler_t handler) // 由外部上拉电阻了 // 设置为浮空输入模式 // GPIOB_SetBits(KEY_B_PIN); - GPIOB_ModeCfg(KEY_B_PIN, GPIO_ModeIN_PU); + GPIOA_ModeCfg(KEY_A_PIN, GPIO_ModeIN_PU); // 下降沿触发 - GPIOB_ITModeCfg(KEY_B_PIN, GPIO_ITMode_FallEdge); + GPIOA_ITModeCfg(KEY_A_PIN, GPIO_ITMode_FallEdge); // 开启GPIO的睡眠唤醒,如果需要的话 // PWR_PeriphWakeUpCfg(ENABLE, RB_SLP_GPIO_WAKE, Long_Delay); @@ -362,14 +362,14 @@ __INTERRUPT // 告诉编译器使用硬件压栈 __HIGH_CODE // 放到RAM里 void GPIOB_IRQHandler(void) { - // 清除中断标志位 - GPIOB_ClearITFlagBit(KEY_B_PIN); +/* // 清除中断标志位 + GPIOA_ClearITFlagBit(KEY_A_PIN); // 检查是否为真实按键事件(通过确认电平是否真的接近0V) - if (GPIOB_ReadPortPin(KEY_B_PIN) == 0) { + if (GPIOA_ReadPortPin(KEY_A_PIN) == 0) { // 再次确认是否真的为低电平(接近0V) DelayUs(50); // 短暂延时 - if (GPIOB_ReadPortPin(KEY_B_PIN) == 0) { + if (GPIOA_ReadPortPin(KEY_A_PIN) == 0) { // 确认是真实按键事件 // 阻止睡眠 BSP_BlockSleep(); @@ -382,7 +382,9 @@ void GPIOB_IRQHandler(void) } else { // 可能是电源波动导致的中断,忽略此次中断 printf("Power Fluctuation - Ignored"); - } + } */ + + // // 阻止睡眠 // BSP_BlockSleep(); // // 关按键中断 diff --git a/bsp/src/bsp_led.c b/bsp/src/bsp_led.c index 3fa8d0f..370dafb 100644 --- a/bsp/src/bsp_led.c +++ b/bsp/src/bsp_led.c @@ -8,13 +8,13 @@ void BSP_LED_Init(void) { - GPIOA_ResetBits(LED_VALVE_R_PIN | LED_VALVE_G_PIN | LED_VALVE_Y_PIN); - GPIOA_ModeCfg(LED_VALVE_R_PIN | LED_VALVE_G_PIN | LED_VALVE_Y_PIN, GPIO_ModeOut_PP_5mA); + GPIOB_ResetBits(LED_VALVE_R_PIN | LED_VALVE_G_PIN); + GPIOB_ModeCfg(LED_VALVE_R_PIN | LED_VALVE_G_PIN, GPIO_ModeOut_PP_5mA); - GPIOB_ResetBits(LED_ALARM_PIN); - GPIOB_ModeCfg(LED_ALARM_PIN, GPIO_ModeOut_PP_5mA); + GPIOA_ResetBits(LED_ALARM_PIN); + GPIOA_ModeCfg(LED_ALARM_PIN, GPIO_ModeOut_PP_5mA); - GPIOB_ResetBits(LED_VBAT_PIN); - GPIOB_ModeCfg(LED_VBAT_PIN, GPIO_ModeOut_PP_5mA); + GPIOA_ResetBits(LED_VBAT_PIN); + GPIOA_ModeCfg(LED_VBAT_PIN, GPIO_ModeOut_PP_5mA); } diff --git a/bsp/src/bsp_motor.c b/bsp/src/bsp_motor.c index 693d03a..1d4f64a 100644 --- a/bsp/src/bsp_motor.c +++ b/bsp/src/bsp_motor.c @@ -10,8 +10,8 @@ valve_state valve_status = {0}; void BSP_MOTOR_Init(void) { - GPIOB_ResetBits(NSLEEP_PIN); - GPIOB_ModeCfg(NSLEEP_PIN, GPIO_ModeOut_PP_5mA); + GPIOA_ResetBits(COIL_ADC); + GPIOA_ModeCfg(COIL_ADC, GPIO_ModeOut_PP_5mA); GPIOB_ResetBits(COIL_A); GPIOB_ModeCfg(COIL_A, GPIO_ModeOut_PP_5mA); @@ -23,7 +23,7 @@ void BSP_MOTOR_Init(void) } void VALVE_OPEN(void) { - GPIOB_SetBits(NSLEEP_PIN); + GPIOA_SetBits(COIL_ADC); //IN1 + ; IN2 - GPIOB_SetBits(COIL_A); GPIOB_ResetBits(COIL_B); @@ -32,7 +32,7 @@ void VALVE_OPEN(void) void VALVE_CLOSE(void) { - GPIOB_SetBits(NSLEEP_PIN); + GPIOA_SetBits(COIL_ADC); //IN1 - ; IN2 + GPIOB_ResetBits(COIL_A); GPIOB_SetBits(COIL_B); @@ -41,7 +41,7 @@ void VALVE_CLOSE(void) void VALVE_STOP(void) { - GPIOB_ResetBits(NSLEEP_PIN); + GPIOA_ResetBits(COIL_ADC); //IN1 + ; IN2 + GPIOB_SetBits(COIL_A); GPIOB_SetBits(COIL_B); diff --git a/bsp/src/bsp_valve.c b/bsp/src/bsp_valve.c new file mode 100644 index 0000000..349ac8d --- /dev/null +++ b/bsp/src/bsp_valve.c @@ -0,0 +1,418 @@ +/* + * @Author : stark1898y 1658608470@qq.com + * @Date : 2024-12-15 15:01:15 + * @LastEditors : stark1898y 1658608470@qq.com + * @LastEditTime : 2025-02-24 17:58:40 + * @FilePath : \BLE_TYQ_CH584M\BSP\src\bsp_valve.c + * @Description : + * + * Copyright (c) 2024 by yzy, All Rights Reserved. + */ +#include "bsp_valve.h" +#include "bsp_motor.h" +// 0xAA CMD/DATA/ DATA_LEN (DATA) checksum 0x55 + +#include "bsp_uart.h" +#include "log.h" +#include "peripheral.h" +#include "SLEEP.h" +#include "bsp_adc.h" +#include "bsp_led.h" + +#undef LOG_ENABLE +#define LOG_ENABLE 1 + +// #undef LOG_TAG +// #define LOG_TAG "BSP_VALVE" + +TsValveData gValveData = {0}; +TsRawFrameData RelyData; + +tmosTaskID vavle_task_id = INVALID_TASK_ID; + +#define ARRAY_SIZE(freq_arr) (sizeof(freq_arr) / sizeof((freq_arr)[0])) + +/** + * @description: From the frame start character to the sum of all bytes before the check code, modulo 256, i.e., the binary arithmetic sum of each byte without overflow value exceeding 255. + * @param {uint8_t} *data + * @param {uint16_t} len + * @return {*} + */ +uint8_t CheckSum(const uint8_t *data, size_t len) // 计算校验和函数 +{ + uint8_t sum = 0; + + for (size_t i = 0; i < len; i++) + { + sum += data[i]; + } + + return sum; +} + +TsFrameData *BSP_VAVLE_GetFrameData(uint8_t *data, uint8_t len) // 获取阀门数据帧函数 +{ + int ret = 0; + uint16_t index = 0; + + TsFrameData *get_buffer = NULL; + + if (len < 4) + { + logError("Data frame length insufficient"); + return NULL; + } + while (index < len && data[index] != FRAME_HEADER) + { + index++; + } + if (index >= len - 3) + { + logError("Data frame header error"); + return NULL; + } + uint16_t data_len = data[index + 2]; + if (index + 3 + data_len + 1 >= len) + { + logError("Data frame length error"); + return NULL; + } + + uint8_t check_sum = data[index + 3 + data_len]; + uint8_t calculated_sum = CheckSum(&data[index], data_len + 3); + if (check_sum != calculated_sum) + { + logError("Data frame checksum error check_sum = %02X, calculated_sum = %02X", check_sum, calculated_sum); + return NULL; + } + if (data[index + 3 + data_len + 1] != FRAME_TAIL) + { + logError("Data frame tail error"); + return NULL; + } + logDebug("Data frame verification passed"); + + get_buffer = (TsFrameData *)tmos_msg_allocate(sizeof(TsFrameData) + sizeof(uint8_t) * data_len); + if (get_buffer == NULL) + { + logError("tmos_msg_allocate fail"); + return NULL; + } + + get_buffer->cmd = data[index + 1]; // 设置命令字段 + get_buffer->len = data_len; // 设置长度字段 + // get_buffer->data = data; + + if (data_len > 0) + { + tmos_memcpy(get_buffer->data, &data[index + 3], data_len); + return get_buffer; + } + + // //有效数据长度 + // size_t data_len = (data_len + 5); + // //到这一步说明数据没问题,将接收到的数据通过中心任务发送出去 + // uint8_t *p_data; + // p_data = tmos_msg_allocate(data_len); + // if (p_data) + // { + // tmos_memcpy(p_data, data, data_len); + // tmos_msg_send(BtRxTaskId, p_data); + // tmos_start_task(BtRxTaskId, SYS_EVENT_MSG, 0); + // } +} + +uint8_t GenerateRawFrame(TsRawFrameData *pRawData, uint8_t cmd, const uint8_t *p_src, uint8_t src_len) // 生成原始帧函数 +{ + pRawData->len = src_len + 5; + + tmos_memset(pRawData->buf, 0, sizeof(pRawData->buf)); + + pRawData->buf[0] = FRAME_HEADER; + pRawData->buf[1] = cmd; + pRawData->buf[2] = src_len; + + tmos_memcpy(&pRawData->buf[3], p_src, src_len); + + pRawData->buf[pRawData->len - 2] = CheckSum(&pRawData->buf[0], pRawData->len - 2); + pRawData->buf[pRawData->len - 1] = FRAME_TAIL; + + return 0; +} + +void BSP_VALVE_Generate_UploadData(TsRawFrameData *pRawData) // 生成上传数据函数 +{ + GenerateRawFrame(pRawData, kCmdData, (uint8_t *)&gValveData, sizeof(gValveData)); +} + +void BSP_VALVE_Generate_Data(TsRawFrameData *pRawData, uint8_t switch_status, uint8_t bat, int8_t temp, uint8_t humi) // 生成阀门数据函数 +{ + TsValveData ValveData; + + ValveData.switch_status = 0; + ValveData.temp = temp; + + ValveData.in_pressure = 0; + ValveData.out_pressure = 0; + ValveData.atm_pressure = 0; + + ValveData.type = kTyq; + ValveData.bat = bat; + ValveData.humi = humi; + + ValveData.rssi = 0; + + GenerateRawFrame(pRawData, kCmdData, (uint8_t *)&ValveData, sizeof(ValveData)); +} + +void BSP_VALVE_Generate_ValveResponse(TsRawFrameData *pRawData, TeFrameCmd cmd, uint8_t status) // 生成阀门响应函数 +{ + uint8_t data = 0; + data = status; + GenerateRawFrame(pRawData, cmd, &data, 1); +} + +void BSP_CloseValve(void) +{ + VALVE_CLOSE(); + DelayMs(100); +} + +void BSP_OpenValve(void) +{ + VALVE_OPEN(); + DelayMs(100); +} + +static void VAVLE_Task_ProcessTmosMsg(uint8_t *p_rev_msg) // 处理TMOS消息函数 +{ + if (p_rev_msg) + { +#if 1 + TsFrameData *HostFrameData = BSP_VAVLE_GetFrameData(&p_rev_msg[1], p_rev_msg[0]); + if (HostFrameData != NULL) + { + switch (HostFrameData->cmd) + { + case kCmdCfg: // 配置命令 + logDebug("kCmdCfg"); + break; + case kCmdCloseVavle: // 关阀命令 + logDebug("kCmdCloseVavle"); + tmos_set_event(vavle_task_id, VAVLE_CLOSE_START_EVT); + + break; + + case kCmdOpenVavle: // 开阀命令 + logDebug("kCmdOpenVavle"); + tmos_set_event(vavle_task_id, VAVLE_OPEN_START_EVT); + break; + default: + logError("Invalid command"); + break; + } + } + else + { + logError("Data frame parsing failed"); + } + tmos_msg_deallocate((uint8_t *)HostFrameData); + HostFrameData = NULL; +#endif + } + else + { + logError("pMsg is NULL"); + } +} + +static uint16_t VAVLE_Task_ProcessEvent(uint8_t task_id, uint16_t events) // 阀门任务事件处理函数 +{ + if (events & SYS_EVENT_MSG) // 系统消息事件 + { + uint8_t *p_rev_msg; + if ((p_rev_msg = tmos_msg_receive(vavle_task_id)) != NULL) + { + VAVLE_Task_ProcessTmosMsg(p_rev_msg); + tmos_msg_deallocate(p_rev_msg); + } + return (events ^ SYS_EVENT_MSG); + } + if (events & VAVLE_RX_DATA_EVT) // 阀门接收数据事件 + { + logDebug("VAVLE_RX_DATA_EVT"); + + return (events ^ VAVLE_RX_DATA_EVT); + } + if (events & VAVLE_TX_DATA_EVT) // 阀门发送数据事件 + { + logDebug("VAVLE_TX_DATA_EVT"); + + return (events ^ VAVLE_TX_DATA_EVT); + } + if (events & VAVLE_CLOSE_START_EVT) // 阀门关闭开始事件 + { + logDebug("VAVLE_CLOSE_START_EVT"); + + BSP_BlockSleep(); + DelayUs(200); + + VALVE_STOP(); + + logDebug("MOTOR_INIT"); + + tmos_start_task(vavle_task_id, VAVLE_CLOSE_ACTION_EVT, MS1_TO_SYSTEM_TIME(CHARGE_TIME_MS)); + + return (events ^ VAVLE_CLOSE_START_EVT); + } + if (events & VAVLE_CLOSE_ACTION_EVT) // 阀门关闭动作事件 + { + BSP_BlockSleep(); + logDebug("VAVLE_CLOSE_ACTION_EVT"); + + VALVE_CLOSE(); + + logDebug("VALVE_CLOSE"); + + tmos_start_task(vavle_task_id, VAVLE_CLOSE_END_EVT, MS1_TO_SYSTEM_TIME(1600)); + + return (events ^ VAVLE_CLOSE_ACTION_EVT); + } + if (events & VAVLE_CLOSE_END_EVT) // 阀门关闭结束事件 + { + VALVE_STOP(); + + LED_ALL_CLOSE; + + gValveData.switch_status = kClosed; + + tmos_memset(&RelyData, 0, sizeof(RelyData)); + BSP_VALVE_Generate_ValveResponse(&RelyData, kCmdCloseVavle, 1); + + tmos_set_event(Peripheral_TaskID, SBP_REPLY_CMD_EVT); + + BSP_RequestSleep(); + logDebug("VAVLE_CLOSE_END_EVT"); + return (events ^ VAVLE_CLOSE_END_EVT); + } + + if (events & VAVLE_OPEN_START_EVT) // 阀门打开开始事件 + { + logDebug("VAVLE_OPEN_START_EVT"); + + BSP_BlockSleep(); + DelayUs(200); + + VALVE_STOP(); + + logDebug("MOTOR_INIT"); + + tmos_start_task(vavle_task_id, VAVLE_OPEN_ACTION_EVT, MS1_TO_SYSTEM_TIME(CHARGE_TIME_MS)); + + return (events ^ VAVLE_OPEN_START_EVT); + } + + if (events & VAVLE_OPEN_ACTION_EVT) // 阀门打开动作事件 + { + BSP_BlockSleep(); + logDebug("VAVLE_OPEN_ACTION_EVT"); + + VALVE_OPEN(); + + logDebug("VALVE_OPEN"); + + tmos_start_task(vavle_task_id, VAVLE_OPEN_END_EVT, MS1_TO_SYSTEM_TIME(1600)); + + return (events ^ VAVLE_OPEN_ACTION_EVT); + } + + if (events & VAVLE_OPEN_END_EVT) // 阀门打开结束事件 + { + VALVE_STOP(); + + LED_ALL_CLOSE; + + gValveData.switch_status = kOpened; + + tmos_memset(&RelyData, 0, sizeof(RelyData)); + BSP_VALVE_Generate_ValveResponse(&RelyData, kCmdOpenVavle, 1); + + tmos_set_event(Peripheral_TaskID, SBP_REPLY_CMD_EVT); + BSP_RequestSleep(); + logDebug("VAVLE_OPEN_END_EVT"); + return (events ^ VAVLE_OPEN_END_EVT); + } + + if (events & VAVLE_LOOP_DECT_EVT) // 循环检测事件 + { + logDebug("VAVLE_LOOP_DECT_EVT"); + + gValveData.bat = BSP_ReadVbat(); + + // 电压过低就关阀 + if (gValveData.bat <= LOW_VABAT_CLOSE_VALUE) + { + gValveData.switch_status = kClosed; + tmos_set_event(vavle_task_id, VAVLE_CLOSE_START_EVT); + } + else if (gValveData.bat <= LOW_VABAT_ALARM_VALUE) + { + tmos_set_event(vavle_task_id, VAVLE_LOW_VBAT_ALARM_EVT); + } + tmos_start_task(vavle_task_id, VAVLE_LOOP_DECT_EVT, MS1_TO_SYSTEM_TIME(VALVE_DECT_PERIOD_MS)); + + return (events ^ VAVLE_LOOP_DECT_EVT); + } + + if (events & VAVLE_LOW_VBAT_ALARM_EVT) // 低电压报警事件 + { + logDebug("VAVLE_LOW_VBAT_ALARM_EVT"); // 记录低电压报警事件的调试信息 + + // 以下是被注释掉的代码块 + // BSP_BlockSleep(); // 阻止系统进入睡眠模式 + // BSP_RequestBoost(); // 请求提升系统性能 + + // LED_ALL_OFF_DEINIT; // 关闭所有LED并反初始化 + // LED_Y_ON; // 打开黄色LED + + // BEEP_ON; // 打开蜂鸣器 + + // DelayMs(10); // 延时10毫秒 + + // LED_ALL_OFF_DEINIT; // 关闭所有LED并反初始化 + // BEEP_OFF_DEINIT; // 关闭蜂鸣器并反初始化 + + // BSP_NoNeedBoost(); // 取消系统性能提升请求 + // BSP_RequestSleep(); // 请求系统进入睡眠模式 + + // tmos_set_event(vavle_task_id, VAVLE_CLOSE_START_EVT); // 设置阀门关闭开始事件 + + // tmos_start_task(vavle_task_id, VAVLE_LOW_VBAT_ALARM_EVT, MS1_TO_SYSTEM_TIME(VALVE_LOW_VBAT_ALARM_PERIOD_MS)); // 启动低电压报警事件,延时一段时间 + + return (events ^ VAVLE_LOW_VBAT_ALARM_EVT); // 返回未处理的事件 + } + + return 0; +} + +void BSP_VAVLE_Init(void) // 阀门初始化函数 +{ + vavle_task_id = TMOS_ProcessEventRegister(VAVLE_Task_ProcessEvent); + + tmos_memset(&gValveData, 0, sizeof(gValveData)); + + gValveData.switch_status = kClosed; // 设置阀门状态为关闭 + gValveData.temp = -100; + gValveData.in_pressure = 0; + gValveData.out_pressure = 0; + gValveData.atm_pressure = 0; + + gValveData.type = kTyq; // 设置阀门类型 + gValveData.bat = BSP_ReadVbat(); // 读取电池电压 + + BSP_MOTOR_Init(); // 初始化电机 + + tmos_start_task(vavle_task_id, VAVLE_LOOP_DECT_EVT, MS1_TO_SYSTEM_TIME(VALVE_DECT_PERIOD_MS)); + + logInfo("BSP_Valve_Init"); +}