From 4480a85138e705f5aa950bb75a5202e8b441f348 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B0=8F=E9=A9=AC=5F666?= <13089258+pony-six-hundred-and-sixty-six@user.noreply.gitee.com> Date: Mon, 16 Dec 2024 15:34:47 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9A=82=E5=AD=98+1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .settings/org.eclipse.core.resources.prefs | 2 - .vscode/settings.json | 4 +- APP/include/multiCentral.h | 1 + APP/multiCentral.c | 320 +++++++++++---------- APP/multiCentral_main.c | 17 +- HAL/MCU.c | 8 +- bsp/inc/bsp_iwdg.h | 36 +++ bsp/inc/bsp_master.h | 19 -- bsp/inc/bsp_uart.h | 3 +- bsp/inc/bsp_valve.h | 22 +- bsp/src/bsp_flash.c | 15 +- bsp/src/bsp_iwdg.c | 130 +++++++++ bsp/src/bsp_master.c | 23 -- bsp/src/bsp_tim.c | 22 +- bsp/src/bsp_uart.c | 46 +-- bsp/src/bsp_valve.c | 215 +++++++------- 16 files changed, 515 insertions(+), 368 deletions(-) create mode 100644 bsp/inc/bsp_iwdg.h delete mode 100644 bsp/inc/bsp_master.h create mode 100644 bsp/src/bsp_iwdg.c delete mode 100644 bsp/src/bsp_master.c diff --git a/.settings/org.eclipse.core.resources.prefs b/.settings/org.eclipse.core.resources.prefs index 887abf0..3af6d1f 100644 --- a/.settings/org.eclipse.core.resources.prefs +++ b/.settings/org.eclipse.core.resources.prefs @@ -16,6 +16,4 @@ encoding//StdPeriphDriver/inc/CH58x_gpio.h=GBK encoding//StdPeriphDriver/inc/CH58x_sys.h=GBK encoding//StdPeriphDriver/inc/CH58x_uart.h=GBK encoding//StdPeriphDriver/inc/ISP585.h=GBK -encoding//bsp/inc/bsp_master.h=GBK encoding//bsp/inc/bsp_uart.h=UTF-8 -encoding//bsp/src/bsp_master.c=GBK diff --git a/.vscode/settings.json b/.vscode/settings.json index e34c388..2b10faf 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -20,6 +20,8 @@ "files.associations": { "*.dbclient-js": "javascript", "config.h": "c", - "ch58xble_lib.h": "c" + "ch58xble_lib.h": "c", + "bsp_uart.h": "c", + "bsp_iwdg.h": "c" } } \ No newline at end of file diff --git a/APP/include/multiCentral.h b/APP/include/multiCentral.h index 78b4834..d8d36c1 100644 --- a/APP/include/multiCentral.h +++ b/APP/include/multiCentral.h @@ -116,6 +116,7 @@ extern centralConnItem_t centralConnList[CENTRAL_MAX_CONNECTION]; int BSP_Master_Send(centralConnItem_t *centralConnList, uint8_t id, uint8_t *Data, uint8_t Len); void Master_Connect(void); +void Master_DisConnect(void); /********************************************************************* *********************************************************************/ diff --git a/APP/multiCentral.c b/APP/multiCentral.c index b355d61..6b9134d 100644 --- a/APP/multiCentral.c +++ b/APP/multiCentral.c @@ -12,6 +12,13 @@ #undef LOG_ENABLE #define LOG_ENABLE 1 +#define MASTER_START_EVT (0X01 << 0) +#define MASTER_CONNECT_EVT (0X01 << 1) +#define MASTER_DISCONN_EVT (0X01 << 2) +#define MASTER_DETECT_EVT (0X01 << 3) +uint8_t MasterCtrTaskId; + + /********************************************************************* * MACROS */ @@ -23,20 +30,19 @@ * CONSTANTS */ // Maximum number of scan responses -#define DEFAULT_MAX_SCAN_RES 30 +#define DEFAULT_MAX_SCAN_RES 1 // Scan duration in 0.625ms -#define DEFAULT_SCAN_DURATION 2400 // 2400*0.625 = 1500ms +#define DEFAULT_SCAN_DURATION 1600 * 3 // 2400*0.625 = 1500ms // Connection min interval in 1.25ms -#define DEFAULT_MIN_CONNECTION_INTERVAL 80 +#define DEFAULT_MIN_CONNECTION_INTERVAL (80 * 9) // Connection max interval in 1.25ms -#define DEFAULT_MAX_CONNECTION_INTERVAL 80 * 5 +#define DEFAULT_MAX_CONNECTION_INTERVAL 80 * 10 // Connection supervision timeout in 10ms -/*修改为最大值*/ -#define DEFAULT_CONNECTION_TIMEOUT 100 // 32s +#define DEFAULT_CONNECTION_TIMEOUT (100 * 5) // Discovey mode (limited, general, all) #define DEFAULT_DISCOVERY_MODE DEVDISC_MODE_ALL @@ -54,19 +60,19 @@ #define DEFAULT_LINK_WHITE_LIST FALSE // Default read RSSI period in 0.625ms -#define DEFAULT_RSSI_PERIOD 2400 +#define DEFAULT_RSSI_PERIOD 4800 // Minimum connection interval (units of 1.25ms) -#define DEFAULT_UPDATE_MIN_CONN_INTERVAL 20 +#define DEFAULT_UPDATE_MIN_CONN_INTERVAL DEFAULT_MIN_CONNECTION_INTERVAL // Maximum connection interval (units of 1.25ms) -#define DEFAULT_UPDATE_MAX_CONN_INTERVAL 100 +#define DEFAULT_UPDATE_MAX_CONN_INTERVAL DEFAULT_MAX_CONNECTION_INTERVAL // Slave latency to use parameter update -#define DEFAULT_UPDATE_SLAVE_LATENCY 5 +#define DEFAULT_UPDATE_SLAVE_LATENCY 3 // Supervision timeout value (units of 10ms) -#define DEFAULT_UPDATE_CONN_TIMEOUT 600 +#define DEFAULT_UPDATE_CONN_TIMEOUT 100 * 5 // Default passcode #define DEFAULT_PASSCODE 0 @@ -84,10 +90,10 @@ #define DEFAULT_IO_CAPABILITIES GAPBOND_IO_CAP_NO_INPUT_NO_OUTPUT // Default service discovery timer delay in 0.625ms -#define DEFAULT_SVC_DISCOVERY_DELAY 800 +#define DEFAULT_SVC_DISCOVERY_DELAY 10 // Default parameter update delay in 0.625ms -#define DEFAULT_PARAM_UPDATE_DELAY 3200 +#define DEFAULT_PARAM_UPDATE_DELAY 1600 // Default read or write timer delay in 0.625ms #define DEFAULT_READ_OR_WRITE_DELAY 1600 @@ -96,7 +102,7 @@ #define DEFAULT_WRITE_CCCD_DELAY 1600 // Establish link timeout in 0.625ms -#define ESTABLISH_LINK_TIMEOUT 3200 +#define ESTABLISH_LINK_TIMEOUT 1600 * 3 // Application states enum @@ -147,10 +153,7 @@ static gapDevRec_t centralDevList[DEFAULT_MAX_SCAN_RES]; // Peer device address peerAddrDefItem_t PeerAddrDef[CENTRAL_MAX_CONNECTION] = { - // {0xcf, 0xb4, 0x8f, 0x10, 0x53, 0x5c}, - // {0xe1, 0X51, 0x89, 0x88, 0x19, 0x70}, // {0xb6, 0xb4, 0x8f, 0x10, 0x53, 0x5c}, - // {0x03, 0x02, 0x03, 0xE4, 0xC2, 0x84}, }; // Connection item list @@ -181,6 +184,7 @@ static void centralInitConnItem(uint8_t task_id, centralConnItem_t *centralConnL static uint8_t centralAddrCmp(peerAddrDefItem_t *PeerAddrDef, uint8_t *addr); int BSP_Master_Receive_Data(uint8_t task_id, uint8_t *data, uint16_t len); +uint16_t Master_ProcessEvent(uint8_t task_id, uint16_t events); /********************************************************************* * PROFILE CALLBACKS */ @@ -244,10 +248,15 @@ void Central_Init() centralInitConnItem(centralTaskId, centralConnList); // Initialize GATT Client GATT_InitClient(); + // Register to receive incoming ATT Indications/Notifications GATT_RegisterForInd(centralTaskId); // Setup a delayed profile startup tmos_set_event(centralTaskId, START_DEVICE_EVT); + + //用户自定义 + MasterCtrTaskId = TMOS_ProcessEventRegister(Master_ProcessEvent); + tmos_set_event(MasterCtrTaskId, MASTER_START_EVT); } /********************************************************************* @@ -348,14 +357,19 @@ uint16_t Central_ProcessEvent(uint8_t task_id, uint16_t events) */ static uint16_t connect0_ProcessEvent(uint8_t task_id, uint16_t events) { + logDebug("connect0_ProcessEvent 0x%02x", events); if (events & START_SVC_DISCOVERY_EVT) { + logDebug("START_SVC_DISCOVERY_EVT"); + centralConnList[CONNECT0_ITEM].procedureInProgress = FALSE; // start service discovery - centralConnIistStartDiscovery_0(); + // centralConnIistStartDiscovery_0();; + return (events ^ START_SVC_DISCOVERY_EVT); } if (events & START_READ_OR_WRITE_EVT) { + logDebug("START_READ_OR_WRITE_EVT"); if (centralConnList[CONNECT0_ITEM].procedureInProgress == FALSE) { if (centralDoWrite) @@ -421,14 +435,14 @@ static uint16_t connect0_ProcessEvent(uint8_t task_id, uint16_t events) logDebug("CH3_WRITE_EVT\r\n"); if (centralConnList[CONNECT0_ITEM].procedureInProgress == FALSE) { - logDebug("centralConnList CH3_WRITE_EVT\n"); + // logDebug("centralConnList CH3_WRITE_EVT\n"); static uint8_t sendcnt = 0; attWriteReq_t req; req.cmd = FALSE; req.sig = FALSE; req.handle = centralConnList[CONNECT0_ITEM].charHd3; - logDebug("handle:%x\r\n", req.handle); + // logDebug("handle:%x\r\n", req.handle); req.len = 3; req.pValue = GATT_bm_alloc(centralConnList[CONNECT0_ITEM].connHandle, ATT_WRITE_REQ, req.len, NULL, 0); if (req.pValue != NULL) @@ -459,10 +473,10 @@ static uint16_t connect0_ProcessEvent(uint8_t task_id, uint16_t events) { // Do a write attWriteReq_t req; - logDebug("CH4_NOTI_EVT handle:%x\r\n", req.handle); + logDebug("CH4_NOTI_EVT handle:%x\r\n", req.handle + 1); req.cmd = FALSE; req.sig = FALSE; - req.handle = centralConnList[CONNECT0_ITEM].charHd4; + req.handle = centralConnList[CONNECT0_ITEM].charHd4 + 1; req.len = 2; req.pValue = GATT_bm_alloc(centralConnList[CONNECT0_ITEM].connHandle, ATT_WRITE_REQ, req.len, NULL, 0); // 内存申请 if (req.pValue != NULL) @@ -599,9 +613,7 @@ static void centralProcessGATTMsg(gattMsgEvent_t *pMsg) logDebug("MTU: %x\r\n", pMsg->msg.mtuEvt.MTU); } - if ((pMsg->method == ATT_READ_RSP) || - ((pMsg->method == ATT_ERROR_RSP) && - (pMsg->msg.errorRsp.reqOpcode == ATT_READ_REQ))) + if ((pMsg->method == ATT_READ_RSP) || ((pMsg->method == ATT_ERROR_RSP) && (pMsg->msg.errorRsp.reqOpcode == ATT_READ_REQ))) { if (pMsg->method == ATT_ERROR_RSP) { @@ -613,13 +625,11 @@ static void centralProcessGATTMsg(gattMsgEvent_t *pMsg) { // After a successful read, display the read value logDebug("Read rsp: "); - logHexDumpAll(pMsg->msg.readRsp.pValue, pMsg->msg.readRsp.len); + // logHexDumpAll(pMsg->msg.readRsp.pValue, pMsg->msg.readRsp.len); } centralConnList[connItem].procedureInProgress = FALSE; } - else if ((pMsg->method == ATT_WRITE_RSP) || - ((pMsg->method == ATT_ERROR_RSP) && - (pMsg->msg.errorRsp.reqOpcode == ATT_WRITE_REQ))) + else if ((pMsg->method == ATT_WRITE_RSP) || ((pMsg->method == ATT_ERROR_RSP) && (pMsg->msg.errorRsp.reqOpcode == ATT_WRITE_REQ))) { if (pMsg->method == ATT_ERROR_RSP == ATT_ERROR_RSP) { @@ -638,7 +648,6 @@ static void centralProcessGATTMsg(gattMsgEvent_t *pMsg) else if (pMsg->method == ATT_HANDLE_VALUE_NOTI) { logDebug("Noti: "); - logHexDumpAll(pMsg->msg.handleValueNoti.pValue, pMsg->msg.handleValueNoti.len); if (connItem == CONNECT0_ITEM) { BSP_Master_Receive_Data(CONNECT0_ITEM, pMsg->msg.handleValueNoti.pValue, pMsg->msg.handleValueNoti.len); @@ -647,6 +656,7 @@ static void centralProcessGATTMsg(gattMsgEvent_t *pMsg) else if (centralConnList[connItem].discState != BLE_DISC_STATE_IDLE) { centralGATTDiscoveryEvent(connItem, pMsg); + centralConnList[connItem].discState = BLE_DISC_STATE_IDLE; } GATT_bm_free(&pMsg->msg, pMsg->method); } @@ -678,6 +688,9 @@ static void centralRssiCB(uint16_t connHandle, int8_t rssi) */ static void centralHciMTUChangeCB(uint16_t connHandle, uint16_t maxTxOctets, uint16_t maxRxOctets) { + logDebug("MTU changed: %d, %d\r\n", maxTxOctets, maxRxOctets); + // centralConnList[CONNECT0_ITEM].procedureInProgress = FALSE; + // tmos_start_task(centralConnList[CONNECT0_ITEM].taskID, CH4_NOTI_EVT, 1600); } /********************************************************************* @@ -695,13 +708,11 @@ static void centralEventCB(gapRoleEvent_t *pEvent) { case GAP_DEVICE_INIT_DONE_EVENT: { - logDebug("Discovering...\r\n"); - GAPRole_CentralStartDiscovery(DEFAULT_DISCOVERY_MODE, - DEFAULT_DISCOVERY_ACTIVE_SCAN, - DEFAULT_DISCOVERY_WHITE_LIST); + GAPRole_CentralCancelDiscovery(); + logDebug("停止扫瞄,发起直连\r\n"); + tmos_start_task(MasterCtrTaskId, MASTER_CONNECT_EVT, 800); } break; - case GAP_DEVICE_INFO_EVENT: { // Add device to list @@ -710,49 +721,8 @@ static void centralEventCB(gapRoleEvent_t *pEvent) break; case GAP_DEVICE_DISCOVERY_EVENT: { - uint8_t i; -#if 1 - // See if peer device has been discovered - for (i = 0; i < centralScanRes; i++) - { - // if (centralAddrCmp(PeerAddrDef, centralDevList[i].addr)) - // break; - // if (tmos_memcmp(valve_list.valve_data[0].valve_mac, centralDevList[i].addr, B_ADDR_LEN)) - break; - } - // Peer device not found - if (i == centralScanRes) - { - logDebug("Device not found...\r\n"); - centralScanRes = 0; - GAPRole_CentralStartDiscovery(DEFAULT_DISCOVERY_MODE, - DEFAULT_DISCOVERY_ACTIVE_SCAN, - DEFAULT_DISCOVERY_WHITE_LIST); - logDebug("Discovering...\r\n"); - } - - // Peer device found - else - { - logDebug("Device found...\r\n"); -#if 0 - GAPRole_CentralEstablishLink(DEFAULT_LINK_HIGH_DUTY_CYCLE, - DEFAULT_LINK_WHITE_LIST, - centralDevList[i].addrType, - centralDevList[i].addr); -#endif - - GAPRole_CentralEstablishLink(DEFAULT_LINK_HIGH_DUTY_CYCLE, - DEFAULT_LINK_WHITE_LIST, - ADDRTYPE_PUBLIC, - valve_list.valve_data[0].valve_mac); - logInfo("valve_list.valve_data[0].valve_mac:"); - logHexDumpAll(valve_list.valve_data[0].valve_mac, B_ADDR_LEN); - // Start establish link timeout event - tmos_start_task(centralTaskId, ESTABLISH_LINK_TIMEOUT_EVT, ESTABLISH_LINK_TIMEOUT); - logDebug("Connecting...\r\n"); - } -#endif + Master_Connect(); + logDebug("Connecting...\r\n"); } break; @@ -784,8 +754,13 @@ static void centralEventCB(gapRoleEvent_t *pEvent) if (connItem == CONNECT0_ITEM) { centralConnList[connItem].procedureInProgress = TRUE; - - // Initiate service discovery + // update MTU + // attExchangeMTUReq_t req = + // { + // .clientRxMTU = BLE_BUFF_MAX_LEN - 4, + // }; + // GATT_ExchangeMTU(pEvent->linkCmpl.connectionHandle, &req, centralTaskId); + // Initiate service discovery tmos_start_task(centralConnList[connItem].taskID, START_SVC_DISCOVERY_EVT, DEFAULT_SVC_DISCOVERY_DELAY); // Initiate connect parameter update @@ -793,19 +768,7 @@ static void centralEventCB(gapRoleEvent_t *pEvent) // Start RSSI polling tmos_start_task(centralConnList[connItem].taskID, START_READ_RSSI_EVT, DEFAULT_RSSI_PERIOD); - } - - // 连接1 - else if (connItem == CONNECT1_ITEM) - { - } - - // 连接2 - // else if(connItem == CONNECT2_ITEM) - // { - // } - logDebug("Connected...\r\n"); // See if need discover again @@ -818,9 +781,6 @@ static void centralEventCB(gapRoleEvent_t *pEvent) { logDebug("Discovering...\r\n"); centralScanRes = 0; - GAPRole_CentralStartDiscovery(DEFAULT_DISCOVERY_MODE, - DEFAULT_DISCOVERY_ACTIVE_SCAN, - DEFAULT_DISCOVERY_WHITE_LIST); } } } @@ -829,13 +789,9 @@ static void centralEventCB(gapRoleEvent_t *pEvent) logDebug("Connect Failed...Reason:%X\r\n", pEvent->gap.hdr.status); logDebug("Discovering...\r\n"); centralScanRes = 0; - GAPRole_CentralStartDiscovery(DEFAULT_DISCOVERY_MODE, - DEFAULT_DISCOVERY_ACTIVE_SCAN, - DEFAULT_DISCOVERY_WHITE_LIST); } } break; - case GAP_LINK_TERMINATED_EVENT: { uint8_t connItem; @@ -855,22 +811,15 @@ static void centralEventCB(gapRoleEvent_t *pEvent) centralConnList[connItem].charHdl = 0; centralConnList[connItem].procedureInProgress = FALSE; centralScanRes = 0; - tmos_stop_task(centralConnList[connItem].taskID, START_READ_RSSI_EVT); - logDebug("Discovering...\r\n"); - GAPRole_CentralStartDiscovery(DEFAULT_DISCOVERY_MODE, - DEFAULT_DISCOVERY_ACTIVE_SCAN, - DEFAULT_DISCOVERY_WHITE_LIST); } break; - case GAP_LINK_PARAM_UPDATE_EVENT: { logDebug("Update %x - Int %x \r\n", pEvent->linkUpdate.connectionHandle, pEvent->linkUpdate.connInterval); } break; - default: break; } @@ -960,12 +909,10 @@ static void centralConnIistStartDiscovery_0(void) centralConnList[CONNECT0_ITEM].svcStartHdl = centralConnList[CONNECT0_ITEM].svcEndHdl = centralConnList[CONNECT0_ITEM].charHdl = 0; centralConnList[CONNECT0_ITEM].discState = BLE_DISC_STATE_SVC; - - // Discovery simple BLE service GATT_DiscPrimaryServiceByUUID(centralConnList[CONNECT0_ITEM].connHandle, uuid, ATT_BT_UUID_SIZE, - centralTaskId); + centralTaskId); } /********************************************************************* @@ -981,6 +928,13 @@ static void centralGATTDiscoveryEvent(uint8_t connItem, gattMsgEvent_t *pMsg) // 连接0的枚举 if (connItem == CONNECT0_ITEM) { + logDebug("发现句柄配置\r\n"); + centralConnList[connItem].charHdl = 0X23; + centralConnList[connItem].charHd2 = 0X26; + centralConnList[connItem].charHd3 = 0x29; + centralConnList[connItem].charHd4 = 0x2C; + centralConnList[connItem].procedureInProgress = FALSE; +#if 0 if (centralConnList[connItem].discState == BLE_DISC_STATE_SVC) { // Service found, store handles @@ -1020,17 +974,20 @@ static void centralGATTDiscoveryEvent(uint8_t connItem, gattMsgEvent_t *pMsg) (pMsg->method == ATT_ERROR_RSP)) { // Discover characteristic - centralConnList[connItem].discState = BLE_DISC_STATE_CHAR; - uint8_t ret = GATT_DiscAllChars(centralConnList[connItem].connHandle, 0x01, 0xFFFF, centralTaskId); - logDebug("GATT_DiscAllChars:%02x\r\n", ret); + // centralConnList[connItem].discState = BLE_DISC_STATE_CHAR; + // uint8_t ret = GATT_DiscAllChars(centralConnList[connItem].connHandle, 0x01, 0xFFFF, centralTaskId); + // logDebug("GATT_DiscAllChars:%02x\r\n", ret); } } else if (centralConnList[connItem].discState == BLE_DISC_STATE_CHAR) { + // Characteristic found, store handle if (pMsg->method == ATT_READ_BY_TYPE_RSP && pMsg->msg.readByTypeRsp.numPairs > 0) { +#if 0 + for (unsigned char i = 0; i < pMsg->msg.readByTypeRsp.numPairs; i++) { // characteristic properties @@ -1087,7 +1044,6 @@ static void centralGATTDiscoveryEvent(uint8_t connItem, gattMsgEvent_t *pMsg) { if (char_properties & (GATT_PROP_NOTIFY)) { - centralConnList[connItem].discState = BLE_DISC_STATE_IDLE; centralConnList[connItem].charHd4 = char_value_handle + 1; centralConnList[connItem].procedureInProgress = FALSE; logDebug("char4 Write handle\t:%04x\r\n", char_value_handle); @@ -1095,18 +1051,22 @@ static void centralGATTDiscoveryEvent(uint8_t connItem, gattMsgEvent_t *pMsg) } } } - } - } - // 连接1的枚举 - // else if (connItem == CONNECT1_ITEM) - // { - // } - // 连接2的枚举 - // else if(connItem == CONNECT2_ITEM) - // { - // } +#endif + } + } +#endif } + +// 连接1的枚举 +// else if (connItem == CONNECT1_ITEM) +// { + +// } +// 连接2的枚举 +// else if(connItem == CONNECT2_ITEM) +// { +// } } /********************************************************************* * @fn centralAddDeviceInfo @@ -1182,8 +1142,10 @@ int BSP_Master_Send(centralConnItem_t *centralConnList, uint8_t id, uint8_t *Dat if (centralConnList[id].state == BLE_STATE_CONNECTED) // 检查连接状态是否为连接状态 { + logDebug("BLE_STATE_CONNECTED"); if (centralConnList[id].procedureInProgress == FALSE) { + logDebug("FALSE"); req.cmd = FALSE; req.sig = FALSE; req.handle = centralConnList[id].charHd3; @@ -1196,29 +1158,31 @@ int BSP_Master_Send(centralConnItem_t *centralConnList, uint8_t id, uint8_t *Dat if (res == SUCCESS) { logDebug("\n Master Write ok"); - centralConnList[id].procedureInProgress = FALSE; - ret = 0; + centralConnList[id].procedureInProgress = TRUE; + ret = 0; } else { - logDebug("\n Master Write faild= %x", res); + logError("\n Master Write faild= %x", res); GATT_bm_free((gattMsg_t *)&req, ATT_WRITE_REQ); ret = 1; } } else { - logDebug("\n alloc Faild"); + logError("\n alloc Faild"); ret = 2; } } else { + logError("procedureInProgress"); ret = 3; } } else { + logError("no BLE_STATE_CONNECTED"); ret = 4; } return ret; @@ -1274,33 +1238,29 @@ int BSP_Master_Receive_Data(uint8_t task_id, uint8_t *data, uint16_t len) return -5; } - logDebug("BT 数据帧校验通过"); + // logDebug("BT 数据帧校验通过"); // //有效数据长度 size_t data_len = (datalength + 5); - ret = data_len; + ret = data_len; if (data[index + 1] == kCmdCloseVavle) // 0x02 代表了其是控制阀门响应 { - logDebug("BT 控制阀门响应包"); - if (data[index + datalength + 2] == 1)//响应数据位 + // logDebug("BT 控制阀门响应包"); + if (data[index + datalength + 2] == 1) // 响应数据位 { - logInfo("BT 控制阀门成功"); + logInfo("关闭阀门成功"); } else { logError("BT 控制阀门失败"); } - logHexDumpAll(&data[index], len); } else if (data[index + 1] == kValveCmdRep) // 这个是代表了其是心跳数据包 { - logDebug("BT 心跳数据包"); - logHexDumpAll(&data[index], len); - valve_list.valve_num = task_id + 1; - valve_list.valve_data[task_id].valve_id = data[index + 4]; - // tmos_memcpy(valve_list.valve_data[task_id].valve_mac, &data[index + 5], 6); //将数据提取到结构体中 + logDebug("BT 心跳数据包:"); + logHexDumpAll(data, data_len); } - //到这一步说明数据没问题,将接收到的数据通过中心任务发送出去 + // 到这一步说明数据没问题,将接收到的数据通过中心任务发送出去 uint8_t *p_data; p_data = tmos_msg_allocate(data_len); if (p_data) @@ -1309,27 +1269,91 @@ int BSP_Master_Receive_Data(uint8_t task_id, uint8_t *data, uint16_t len) tmos_msg_send(BtRxTaskId, p_data); tmos_start_task(BtRxTaskId, SYS_EVENT_MSG, 0); } - + return ret; } - void Master_Connect(void) { - uint8_t cnt = Flash_Get_Valve_Num(); + uint8_t def_mac[6] = {0xFF}; + uint8_t cnt = Flash_Get_Valve_Num(); logDebug("cnt:%d\r\n", cnt); + if (cnt == 0) + { + GAPRole_CentralEstablishLink(DEFAULT_LINK_HIGH_DUTY_CYCLE, + DEFAULT_LINK_WHITE_LIST, + ADDRTYPE_PUBLIC, + def_mac); + tmos_start_task(centralTaskId, ESTABLISH_LINK_TIMEOUT_EVT, ESTABLISH_LINK_TIMEOUT); + return; + } for (uint8_t i = 0; i < cnt; i++) { - if (valve_list.valve_data[cnt].valve_id != 0) + if (valve_list.valve_data[i].valve_id != 0) { - logDebug("valve_id:%d\r\n", valve_list.valve_data[cnt].valve_id); - logHexDumpAll(valve_list.valve_data[cnt].valve_mac, 6); + logDebug("valve_id:%d\r\n", valve_list.valve_data[i].valve_id); + logHexDumpAll(valve_list.valve_data[i].valve_mac, 6); GAPRole_CentralEstablishLink(DEFAULT_LINK_HIGH_DUTY_CYCLE, - DEFAULT_LINK_WHITE_LIST, - ADDRTYPE_PUBLIC, - valve_list.valve_data[cnt].valve_mac); + DEFAULT_LINK_WHITE_LIST, + ADDRTYPE_PUBLIC, + valve_list.valve_data[i].valve_mac); tmos_start_task(centralTaskId, ESTABLISH_LINK_TIMEOUT_EVT, ESTABLISH_LINK_TIMEOUT); logDebug("Connecting...\r\n"); } } } + +void Master_DisConnect(void) +{ + GAPRole_TerminateLink(INVALID_CONNHANDLE); + logDebug("主动断开连接\r\n"); +} + +uint16_t Master_ProcessEvent(uint8_t task_id, uint16_t events) +{ + int8_t ret = 0; + uint8_t *pMsg; + uint8_t master_buf[64] = {0}; + if (events & MASTER_START_EVT) + { + if (centralConnList[0].state != BLE_STATE_CONNECTED) + { + if (Flash_Get_Valve_Num()) + { + tmos_start_task(task_id, MASTER_CONNECT_EVT, 2400); + } + } + return (events ^ MASTER_START_EVT); + } + else if(events & MASTER_DETECT_EVT) + { + if (centralConnList[0].state != BLE_STATE_CONNECTED) + { + + tmos_start_task(task_id, MASTER_CONNECT_EVT, 2400); + } + else + { + tmos_start_task(task_id, MASTER_DETECT_EVT, 2400); + } + + return (events ^ MASTER_DETECT_EVT); + } + + else if (events & MASTER_CONNECT_EVT) + { + if (centralConnList[0].state != BLE_STATE_CONNECTED) + { + Master_Connect(); + tmos_start_task(task_id, MASTER_DETECT_EVT, 2400); + } + return (events ^ MASTER_CONNECT_EVT); + } + else if (events & MASTER_DISCONN_EVT) + { + Master_DisConnect(); + return (events ^ MASTER_DISCONN_EVT); + } + return 0; +} + diff --git a/APP/multiCentral_main.c b/APP/multiCentral_main.c index 0ac5075..1b5dfea 100644 --- a/APP/multiCentral_main.c +++ b/APP/multiCentral_main.c @@ -2,7 +2,7 @@ * @Author: mbw * @Date: 2024-12-03 11:13:13 * @LastEditors: mbw && 1600520629@qq.com - * @LastEditTime: 2024-12-13 18:31:17 + * @LastEditTime: 2024-12-15 17:16:45 * @FilePath: \ble_-tyq_-bjq_-ch584-m\APP\multiCentral_main.c * @Description: * @@ -25,13 +25,13 @@ #include "HAL.h" #include "multiCentral.h" #include "bsp_uart.h" -#include "log.h" +#include "bsp_iwdg.h" #include "bsp_flash.h" #include "bsp_valve.h" #undef LOG_ENABLE #define LOG_ENABLE 1 - +#include "log.h" /********************************************************************* * GLOBAL TYPEDEFS */ @@ -80,10 +80,6 @@ int main(void) GPIOA_ModeCfg(GPIO_Pin_All, GPIO_ModeIN_PU); GPIOB_ModeCfg(GPIO_Pin_All, GPIO_ModeIN_PU); #endif - CH58x_BLEInit(); - HAL_Init(); - GAPRole_CentralInit(); - Central_Init(); #if DEBUG == Debug_UART0 GPIOA_SetBits(GPIO_Pin_14); GPIOPinRemap(ENABLE, RB_PIN_UART0); @@ -99,9 +95,16 @@ int main(void) BSP_UART3_Init(); logDebug("test log debug\n"); #endif + + CH58x_BLEInit(); + HAL_Init(); + GAPRole_CentralInit(); + Central_Init(); + BSP_FLASH_Init(); BSP_Valve_Init(); BSP_UART1_Init(); // BT UART + // IWDG_Init(1000); Main_Circulation(); } diff --git a/HAL/MCU.c b/HAL/MCU.c index 09a949d..681b05d 100644 --- a/HAL/MCU.c +++ b/HAL/MCU.c @@ -14,6 +14,12 @@ /* ͷ�ļ����� */ #include "HAL.h" + +#undef LOG_ENABLE +#define LOG_ENABLE 1 +#include "log.h" + + tmosTaskID halTaskID; uint32_t g_LLE_IRQLibHandlerLocation; /******************************************************************************* @@ -133,7 +139,7 @@ void CH58x_BLEInit(void) for(i = 0; i < 6; i++) { cfg.MacAddr[i] = MacAddr[i]; - PRINT("%02x ", cfg.MacAddr[i]); + logDebug("%02x ", cfg.MacAddr[i]); } } diff --git a/bsp/inc/bsp_iwdg.h b/bsp/inc/bsp_iwdg.h new file mode 100644 index 0000000..30d3790 --- /dev/null +++ b/bsp/inc/bsp_iwdg.h @@ -0,0 +1,36 @@ +/*** + * @Author: mbw + * @Date: 2024-12-15 16:29:58 + * @LastEditors: mbw && 1600520629@qq.com + * @LastEditTime: 2024-12-15 16:40:26 + * @FilePath: \ble_-tyq_-bjq_-ch584-m\bsp\inc\bsp_iwdg.h + * @Description: + * @ + * @Copyright (c) 2024 by ${git_name_email}, All Rights Reserved. + */ +#ifndef __BSP_IWDG_H__ +#define __BSP_IWDG_H__ + +#include "CONFIG.h" + +#define RB_RLR 0x0FFF // RW, watch-dog counter reload (write protect) +#define RB_PR 0x7000 // PR, prescale (write protect) +#define RB_PVU 0x8000 // RO, register update flag (write protect) +#define RB_COUNT 0xFF0000 // RO, watch-dog down counter +#define RB_STOP_EN 0x20000000 // RW, watch-dog stop enable (write protect) +#define RB_WR_PROTECT 0x40000000 // RO, write protect +#define RB_IWDG_EN 0x80000000 // RO, watch-dog enable + +void IWDG_Init(uint16_t ms); + +// 需要定时调用喂狗 +// 在看门狗键寄存器 (R32_IWDG_KR) 中,软件要以一定的间隔写入 0xAAAA,重装载计数值,这就是喂狗的操作。 +// 否则,当计数器为 0 时,看门狗会产生复位。 +#define FEED_IWDG() \ + { \ + R32_IWDG_KR = 0xAAAA; \ + } + +void ShowRestartReason(void); + +#endif // !__BSP_IWDG_H__ diff --git a/bsp/inc/bsp_master.h b/bsp/inc/bsp_master.h deleted file mode 100644 index 9319740..0000000 --- a/bsp/inc/bsp_master.h +++ /dev/null @@ -1,19 +0,0 @@ -#ifndef __BSP_MASTER_H__ -#define __BSP_MASTER_H__ - -#include "CH58x_common.h" -#include "CH58xBLE_LIB.h" - -// 0xAA CMD/DATA/ DATA_LEN (DATA) checksum 0x55 - -typedef struct __attribute__((packed)) -{ - uint8_t header; - uint8_t cmd; // CMD/DATA - uint8_t len; // DATA_LEN - uint8_t *pData; - uint8_t checksum; - uint8_t tail; -} TsFrameData; - -#endif // ! __BSP_MASTER_H__ diff --git a/bsp/inc/bsp_uart.h b/bsp/inc/bsp_uart.h index fe7ca0c..dada383 100644 --- a/bsp/inc/bsp_uart.h +++ b/bsp/inc/bsp_uart.h @@ -2,7 +2,7 @@ * @Author: mbw * @Date: 2024-12-06 16:52:29 * @LastEditors: mbw && 1600520629@qq.com - * @LastEditTime: 2024-12-09 11:15:13 + * @LastEditTime: 2024-12-14 14:51:37 * @FilePath: \ble_-tyq_-bjq_-ch584-m\bsp\inc\bsp_uart.h * @Description: * @ @@ -25,7 +25,6 @@ #define BT_UART_TX_PIN GPIO_Pin_9 //PA9 #define BT_UART_RX_PIN GPIO_Pin_8 //PA8 - typedef struct __attribute__((packed)) { uint8_t cmd; diff --git a/bsp/inc/bsp_valve.h b/bsp/inc/bsp_valve.h index ad44c8c..16f0402 100644 --- a/bsp/inc/bsp_valve.h +++ b/bsp/inc/bsp_valve.h @@ -61,19 +61,13 @@ struct __attribute__((packed)) valve_data { uint8_t valve_id; uint8_t valve_mac[6]; - TeVavleType type; // 阀门类型 - - uint8_t bat; // 1B 电池电压 30=3V,18=1.8V - int8_t temp; // 1B 阀门温度 有符号整数 25 ℃ - uint8_t hum; // 1B 阀门湿度 %RH - - // uint8_t status; // 1B 阀门工作状态 超欠压、过流 - // uint8_t connct_status; // 1B 阀门连接状态 (电磁阀BLE控制盒) 0=未连接 1=已连接 - // uint8_t switch_status; // 1B 阀门开关状态 0=未知 1=关闭 2=关闭过,未按按键恢复 3=关闭过,按下了恢复键 4=打开 - - // uint32_t in_pressure; // 4B 阀门入口压力 Pa - // uint32_t out_pressure; // 4B 阀门出口压力 Pa - // uint32_t atm_pressure; // 4B 阀门大气压力 Pa + uint8_t valve_connct_status; + uint8_t valve_switch_status; + uint8_t valve_temp; + uint32_t valve_in_pressure; + uint32_t valve_out_pressure; + uint32_t valve_atm_pressure; + uint8_t valve_type; }; typedef struct valve_data_list @@ -91,8 +85,6 @@ int BSP_Bt_Remove_Valve(uint8_t *data, uint8_t len); int BSP_Bt_Replace_Valve(uint8_t *data, uint8_t len); void BSP_Bt_Valve_Updata(void); -int BSP_Bt_Valve_Ctr_Resp(uint8_t id, uint8_t *mac_addr, WireLessState status); - int BSP_Bt_Valve_Resp(uint8_t cmd, uint8_t id, uint8_t *mac_addr, uint8_t state); #endif // ! __BSP_VALVE_H__ diff --git a/bsp/src/bsp_flash.c b/bsp/src/bsp_flash.c index fd67883..2895748 100644 --- a/bsp/src/bsp_flash.c +++ b/bsp/src/bsp_flash.c @@ -2,7 +2,7 @@ * @Author: mbw * @Date: 2024-12-06 14:49:21 * @LastEditors: mbw && 1600520629@qq.com - * @LastEditTime: 2024-12-13 13:57:30 + * @LastEditTime: 2024-12-15 15:05:39 * @FilePath: \ble_-tyq_-bjq_-ch584-m\bsp\src\bsp_flash.c * @Description: 主要用于对一些MAC地址等关键信息进行保存和读取操作 * @@ -13,6 +13,9 @@ #include "string.h" #include "bsp_valve.h" +#undef LOG_ENABLE +#define LOG_ENABLE 1 +# include "log.h" void Flash_ErasePage_ReadConfigInfo(uint8_t *page_buf) { @@ -49,16 +52,14 @@ int Flash_Get_Mac_Addr(uint8_t *mac_addr, uint8_t number) { __attribute__((aligned(4))) uint8_t data[FLASH_MAC_INFO_LEN + 2]; // 读写buf需要4字节对齐 - // char mac[16] = {0}; EEPROM_READ((FLASH_MAC_INFO_START_ADDR + number * FLASH_MAC_INFO_LEN), data, FLASH_MAC_INFO_LEN); - if (data == NULL) + if (tmos_isbufset(data, 0xFF, FLASH_MAC_INFO_LEN)) { - // PRINTF("Flash_Get_Mac_Addr failed"); + logDebug("MAC地址为空,请先配网"); + tmos_memset(mac_addr, 0xFF, FLASH_MAC_INFO_LEN); return -1; } - // sprintf(mac, "%02x:%02x:%02x:%02x:%02x:%02x", - // data[5], data[4], data[3], data[2], data[1], data[0]); - // PRINTF("mac_addr:%s", mac); + tmos_memcpy(mac_addr, data, FLASH_MAC_INFO_LEN); return 0; diff --git a/bsp/src/bsp_iwdg.c b/bsp/src/bsp_iwdg.c new file mode 100644 index 0000000..485bcc7 --- /dev/null +++ b/bsp/src/bsp_iwdg.c @@ -0,0 +1,130 @@ +/* + * @Author : stark1898y 1658608470@qq.com + * @Date : 2024-12-15 16:13:41 + * @LastEditors: mbw && 1600520629@qq.com + * @LastEditTime: 2024-12-16 10:50:56 + * @FilePath: \ble_-tyq_-bjq_-ch584-m\bsp\src\bsp_iwdg.c + * @Description : + * + * Copyright (c) 2024 by yzy, All Rights Reserved. + */ +#include "bsp_iwdg.h" + +#include "bsp_uart.h" +#include "log.h" + +// https://www.cnblogs.com/debugdabiaoge/p/17580033.html +// https://www.cnblogs.com/risc5-ble/p/17853714.html + +#undef LOG_ENABLE +#define LOG_ENABLE 1 + +#undef LOG_TAG +#define LOG_TAG "idwg" + +uint8_t IWDGTaskId; + +#define IWIG_FEED_EVENT (0x01 << 0) +uint16_t IWDG_ProcessEvent(uint8_t task_id, uint16_t events) +{ + if (events & IWIG_FEED_EVENT) + { + FEED_IWDG(); + tmos_start_task(task_id, IWIG_FEED_EVENT, 20000); + return (events ^ IWIG_FEED_EVENT); + } + return 0; +} + +// 32k rc +// div 0:4 | 1:8 | 2:16 | 3:32 | +// 4:64 | 5:128 | 6:256 | 7:512(32K分频512,时钟62.5Hz) | +// reload max 4095 + +// 独立看门狗(IWDG)由专用的内部低速时钟(LSI)驱动,能够在低功耗模式下正常工作。 +void IWDG_Init(uint16_t ms) +{ + uint16_t div = 512; + float tick_ms = 1000 / (32000 / 512); + + uint16_t reload = (ms / tick_ms) + 1; + + // // 解除IWDG保护 + // R32_IWDG_KR = 0x5555; + + // R32_IWDG_CFG = (RB_PR & (div << 12)) | (RB_STOP_EN) | (reload & RB_RLR); + // // 开启IWDG保护 + // R32_IWDG_KR = 0xCCCC; + + // logDebug("R32_IWDG_CFG = %X", R32_IWDG_CFG); + + R32_IWDG_KR = 0x5555; // 解除IWDG保护 + R32_IWDG_CFG |= (7 << 12); // 32K分频512,时钟62.5Hz + R32_IWDG_CFG &= 0xFFFFF000; + R32_IWDG_CFG |= 0x10; // 看门狗时间约256ms(0x10/(32K/512)) + R32_IWDG_KR = 0xCCCC; + PRINT("R32_IWDG_CFG = %x\r\n", R32_IWDG_CFG); + + IWDGTaskId = TMOS_ProcessEventRegister(IWDG_ProcessEvent); + tmos_set_event(IWDGTaskId, IWIG_FEED_EVENT); +} + +// #define RB_RESET_FLAG 0x07 // RO: recent reset flag +// #define RST_FLAG_SW 0x00 +// #define RST_FLAG_RPOR 0x01 +// #define RST_FLAG_WTR 0x02 +// #define RST_FLAG_MR 0x03 +// //#define RST_FLAG_GPWSM 0x04 // RO, power on reset flag during sleep/shutdown: 0=no power on reset during sleep/shutdown, 1=power on reset occurred during sleep/shutdown +// #define RST_FLAG_GPWSM 0x05 +// // RB_RESET_FLAG: recent reset flag +// // 000 - SR, software reset, by RB_SOFTWARE_RESET=1 @RB_WDOG_RST_EN=0 +// // 001 - RPOR, real power on reset +// // 010 - WTR, watch-dog timer-out reset +// // 011 - MR, external manual reset by RST pin input low +// // 101 - GRWSM, global reset by waking under shutdown mode +// 1?? - LRW, power on reset occurred during sleep + +// 打印复位状态寄存器,显示复位原因 +// 最近一次复位状态: +// 000:软件复位 SR(RB_WDOG_RST_EN=0时软件复位可产生此状态,否则可复位但不产生此状态); +// 001:上电复位 RPOR; +// 010:看门狗超时复位 WTR; +// 011:外部手动复位 MR; +// 101:从下电模式唤醒时的复位 GRWSM; +// 100/110/111:唤醒复位 LRW,且此前的上一次复位分别是 SR/WTR/MR。 +void ShowRestartReason(void) +{ + uint8_t reason = R8_RESET_STATUS & 0x07; + logDebug("R8_RESET_STATUS = %02x", reason); + switch (reason) + { + case RST_FLAG_SW: + logDebug("RST_FLAG_SW"); + break; + case RST_FLAG_RPOR: + logDebug("RST_FLAG_RPOR"); + break; + case RST_FLAG_WTR: + logDebug("RST_FLAG_WTR"); + break; + case RST_FLAG_MR: + logDebug("RST_FLAG_MR"); + break; + + case RST_FLAG_GPWSM: + logDebug("RST_FLAG_GPWSM"); + break; + + case 0x04: + logDebug("LRW, last SR"); + break; + case 0x06: + logDebug("LRW, last WTR"); + break; + case 0x07: + logDebug("LRW, last MR"); + + default: + break; + } +} diff --git a/bsp/src/bsp_master.c b/bsp/src/bsp_master.c deleted file mode 100644 index ef548f9..0000000 --- a/bsp/src/bsp_master.c +++ /dev/null @@ -1,23 +0,0 @@ -/* - * @Author: mbw - * @Date: 2024-12-11 13:52:38 - * @LastEditors: mbw && 1600520629@qq.com - * @LastEditTime: 2024-12-12 09:11:54 - * @FilePath: \ble_-tyq_-bjq_-ch584-m\bsp\src\bsp_Master.c - * @Description: - * - * Copyright (c) 2024 by ${git_name_email}, All Rights Reserved. - */ -#include "bsp_master.h" -#include "bsp_uart.h" -#include "log.h" -#include "multiCentral.h" -#include "bsp_valve.h" - -#undef LOG_ENABLE -#define LOG_ENABLE 1 - -void BSP_Bt_Init(void) -{ -} - diff --git a/bsp/src/bsp_tim.c b/bsp/src/bsp_tim.c index ba2db63..d08b2e2 100644 --- a/bsp/src/bsp_tim.c +++ b/bsp/src/bsp_tim.c @@ -1,28 +1,40 @@ +/* + * @Author: mbw + * @Date: 2024-12-07 15:13:24 + * @LastEditors: mbw && 1600520629@qq.com + * @LastEditTime: 2024-12-16 14:54:45 + * @FilePath: \ble_-tyq_-bjq_-ch584-m\bsp\src\bsp_tim.c + * @Description: + * + * Copyright (c) 2024 by ${git_name_email}, All Rights Reserved. + */ #include "bsp_tim.h" +#include "HAL.h" -// tick_1ms_cntSysTick_Handler()1ms +1 +// tick_1ms_cnt��SysTick_Handler()��1ms +1 volatile uint32_t tick_1ms_cnt = 0; /** - * @description: SysTick1msΪ + * @description: ��SysTick��1ms��Ϊ���� * @return {uint32_t} */ uint32_t BSP_Get_Tick(void) { /* Platform implementation */ - return tick_1ms_cnt; + // return tick_1ms_cnt; + return (TMOS_GetSystemClock() / 1.6); } -// SysTickжϺ +// SysTick�жϺ��� __INTERRUPT __HIGH_CODE void SysTick_Handler() { static uint8_t cnt_ms = 0; - SysTick->SR = 0; // жϱ־ + SysTick->SR = 0; // ����жϱ�־ tick_1ms_cnt++; cnt_ms++; diff --git a/bsp/src/bsp_uart.c b/bsp/src/bsp_uart.c index ad909dd..07ea0e1 100644 --- a/bsp/src/bsp_uart.c +++ b/bsp/src/bsp_uart.c @@ -2,7 +2,7 @@ * @Author: mbw * @Date: 2024-12-06 16:52:30 * @LastEditors: mbw && 1600520629@qq.com - * @LastEditTime: 2024-12-13 18:26:38 + * @LastEditTime: 2024-12-16 14:56:26 * @FilePath: \ble_-tyq_-bjq_-ch584-m\bsp\src\bsp_uart.c * @Description: * @@ -42,7 +42,6 @@ uint8_t uart3_rx_buf[UART3_RX_BUFFER_LENGTH] = {0}; uint8_t BtRxTaskId; BTFrameData bt_frame = {0}; - /** * @description: 从帧起始符开始到校验码之前所有字节的和的模256,即各字节不计超过255的溢出值的二进制算术和。 * @param {uint8_t} *data @@ -109,7 +108,7 @@ void UART3_FifoInit(void) lwrb_init(&uart3_rx_t, uart3_rx_buf, sizeof(uart3_rx_buf)); } -/*bt接收数据处理*/ +/*接收到来自报警器的数据处理*/ int BSP_Bt_Process(uint8_t *data, uint16_t len) { int ret = 0; @@ -143,11 +142,10 @@ int BSP_Bt_Process(uint8_t *data, uint16_t len) return 3; // } - uint8_t rx_sum = data[index + 2 + datalength]; // 读取校验码 - uint8_t calculated_sum = _CheckSum(&data[0], datalength + 2); // 计算校验码 + uint8_t rx_sum = data[index + 2 + datalength]; // 读取校验码 + uint8_t calculated_sum = _CheckSum(&data[index], datalength + 2); // 计算校验码 if (rx_sum != calculated_sum) { - logError("BT 数据帧校验码错误 rx_sum = %02X, calculated_sum = %02X", rx_sum, calculated_sum); logHexDumpAll(data, len); return 4; @@ -160,47 +158,48 @@ int BSP_Bt_Process(uint8_t *data, uint16_t len) return 5; } // 当程序走到这里时,就说明接收到了正确的数据帧,开始解析命令 + /*AA + 数据长度 + CMD + ID + 数据(mac) + 校验码 + 结束码*/ tmos_memcpy(data_buf, &data[index + 3], datalength); switch (data[index + 2]) { case kValveCmdCtr: - ret = BSP_Bt_Valve_Ctr(&data_buf[0], datalength); logDebug("recv cmd: 0x01, 执行的动作是关闭阀门"); + ret = BSP_Bt_Valve_Ctr(&data_buf[0], datalength); break; case kValveCmdReg: - ret = BSP_Bt_Register_Valve(&data_buf[0], datalength); logDebug("recv cmd: 0x02, 执行的动作是注册阀门"); + ret = BSP_Bt_Register_Valve(&data_buf[0], datalength); if (ret == 0) { - BSP_Bt_Valve_Resp(kValveCmdReg, CONNECT0_ITEM, valve_list.valve_data[CONNECT0_ITEM].valve_mac, TRUE); + BSP_Bt_Valve_Resp(kValveCmdReg, valve_list.valve_data[CONNECT0_ITEM].valve_id, valve_list.valve_data[CONNECT0_ITEM].valve_mac, TRUE); } else { - BSP_Bt_Valve_Resp(kValveCmdReg, CONNECT0_ITEM, valve_list.valve_data[CONNECT0_ITEM].valve_mac, FALSE); + BSP_Bt_Valve_Resp(kValveCmdReg, valve_list.valve_data[CONNECT0_ITEM].valve_id, valve_list.valve_data[CONNECT0_ITEM].valve_mac, FALSE); } break; case kValveCmdRem: - ret = BSP_Bt_Remove_Valve(&data_buf[0], datalength); logDebug("recv cmd: 0x03, 执行的动作是移除阀门"); + ret = BSP_Bt_Remove_Valve(&data_buf[0], datalength); if (ret == 0) { - BSP_Bt_Valve_Resp(kValveCmdRem, CONNECT0_ITEM, valve_list.valve_data[CONNECT0_ITEM].valve_mac, TRUE); + BSP_Bt_Valve_Resp(kValveCmdRem, valve_list.valve_data[CONNECT0_ITEM].valve_id, valve_list.valve_data[CONNECT0_ITEM].valve_mac, TRUE); } else { - BSP_Bt_Valve_Resp(kValveCmdRem, CONNECT0_ITEM, valve_list.valve_data[CONNECT0_ITEM].valve_mac, FALSE); + BSP_Bt_Valve_Resp(kValveCmdRem, valve_list.valve_data[CONNECT0_ITEM].valve_id, valve_list.valve_data[CONNECT0_ITEM].valve_mac, FALSE); } break; case kValveCmdRep: - ret = BSP_Bt_Replace_Valve(&data_buf[0], datalength); logDebug("recv cmd: 0x04, 执行的动作是更换阀门"); + ret = BSP_Bt_Replace_Valve(&data_buf[0], datalength); if (ret == 0) { - BSP_Bt_Valve_Resp(kValveCmdRep, CONNECT0_ITEM, valve_list.valve_data[CONNECT0_ITEM].valve_mac, TRUE); + BSP_Bt_Valve_Resp(kValveCmdRep, valve_list.valve_data[CONNECT0_ITEM].valve_id, valve_list.valve_data[CONNECT0_ITEM].valve_mac, TRUE); } else { - BSP_Bt_Valve_Resp(kValveCmdRep, CONNECT0_ITEM, valve_list.valve_data[CONNECT0_ITEM].valve_mac, FALSE); + BSP_Bt_Valve_Resp(kValveCmdRep, valve_list.valve_data[CONNECT0_ITEM].valve_id, valve_list.valve_data[CONNECT0_ITEM].valve_mac, FALSE); } break; default: @@ -228,6 +227,7 @@ uint8_t BT_GenerateRawFrame(BTFrameData *pRawData, const uint8_t *p_src, uint8_t pRawData->buf[pRawData->len - 2] = _CheckSum(&pRawData->buf[0], pRawData->len - 2); pRawData->buf[pRawData->len - 1] = 0X55; + logInfo("BT_GenerateRawFrame"); logHexDumpAll(&pRawData->buf[0], pRawData->len); return 0; @@ -294,7 +294,9 @@ uint16_t BSP_Send_Process(uint8_t *pdata) case kCmdOpenVavle: break; case kCmdData: - BSP_Bt_Valve_Resp(kValveEventStatus, valve_list.valve_data[0].valve_id, valve_list.valve_data[0].valve_mac, master_rx_buf[3]); + valve_list.valve_data[0].valve_connct_status = 1; + tmos_memcpy(&valve_list.valve_data[0].valve_switch_status, &master_rx_buf[3], master_rx_buf[2]); + BSP_Bt_Valve_Resp(kValveEventStatus, valve_list.valve_data[0].valve_id, valve_list.valve_data[0].valve_mac, 0); break; default: logError("不支持的命令: %d", master_rx_buf[1]); @@ -316,13 +318,15 @@ uint16_t BT_ProcessEvent(uint8_t task_id, uint16_t events) tmos_msg_deallocate(pMsg); BSP_Send_Process(master_buf); } + return (events ^ SYS_EVENT_MSG); } else if (events & BT_START_EVT) { lwrb_reset(&uart1_rx_t); lwrb_reset(&uart1_tx_t); + tmos_start_task(task_id, BT_INFO_UPDATA_EVT, 0); tmos_start_task(task_id, BT_REC_EVT, 800); - tmos_start_task(task_id, BT_INFO_UPDATA_EVT, 1600); + return (events ^ BT_START_EVT); } else if (events & BT_REC_EVT) @@ -359,8 +363,8 @@ void BSP_UART1_Init(void) { /* 配置串口1:先配置IO口模式,再配置串口 */ GPIOB_SetBits(BT_UART_TX_PIN); - GPIOB_ModeCfg(BT_UART_RX_PIN, GPIO_ModeIN_PU); // RXD-配置上拉输入 - GPIOB_ModeCfg(BT_UART_TX_PIN, GPIO_ModeOut_PP_5mA); // TXD-配置推挽输出,注意先让IO口输出高电平 + GPIOA_ModeCfg(BT_UART_RX_PIN, GPIO_ModeIN_PU); // RXD-配置上拉输入 + GPIOA_ModeCfg(BT_UART_TX_PIN, GPIO_ModeOut_PP_5mA); // TXD-配置推挽输出,注意先让IO口输出高电平 UART1_DefInit(); UART1_ByteTrigCfg(UART_7BYTE_TRIG); // 中断方式接收数据 @@ -406,7 +410,7 @@ void UART1_IRQHandler(void) { case UART_II_LINE_STAT: // 线路状态错误 { - UART1_GetLinSTA(); + UART1_GetLinSTA(); break; } case UART_II_RECV_RDY: diff --git a/bsp/src/bsp_valve.c b/bsp/src/bsp_valve.c index 298b47d..f74a7a8 100644 --- a/bsp/src/bsp_valve.c +++ b/bsp/src/bsp_valve.c @@ -2,7 +2,7 @@ * @Author: mbw * @Date: 2024-12-09 11:40:10 * @LastEditors: mbw && 1600520629@qq.com - * @LastEditTime: 2024-12-13 15:39:05 + * @LastEditTime: 2024-12-16 13:15:11 * @FilePath: \ble_-tyq_-bjq_-ch584-m\bsp\src\bsp_valve.c * @Description: * @@ -12,9 +12,9 @@ #include "bsp_flash.h" #include "CH58xBLE_LIB.h" #include "bsp_uart.h" -#include "bsp_master.h" #include "multiCentral.h" + /* 接收的蓝牙从机info: 接收数据帧格式: 帧头 + 命令 + 数据长度 + 心跳数据包 + 校验码 + 帧尾 @@ -29,6 +29,7 @@ valve_data_list_t valve_list = {0}; BTFrameData valve_frame_data = {0}; + uint8_t Valve_GenerateRawFrame(BTFrameData *pRawData, const uint8_t cmd, const uint8_t *p_src, uint8_t src_len) { pRawData->len = src_len + 5; @@ -44,7 +45,9 @@ uint8_t Valve_GenerateRawFrame(BTFrameData *pRawData, const uint8_t cmd, const u } pRawData->buf[pRawData->len - 2] = _CheckSum(&pRawData->buf[0], pRawData->len - 2); pRawData->buf[pRawData->len - 1] = 0X55; + logInfo("向从机发送的数据:"); logHexDumpAll(pRawData->buf, pRawData->len); + return 0; } @@ -99,9 +102,8 @@ int BSP_Bt_Valve_Ctr(uint8_t *data, uint8_t len) /*注册阀门信息*/ int BSP_Bt_Register_Valve(uint8_t *data, uint8_t len) { - - size_t i = 0; uint8_t mac_addr[FLASH_MAC_INFO_LEN] = {0}; + if ((data[0] >= 1) && (data[0] <= 8)) { Flash_Get_Mac_Addr(mac_addr, data[0] - 1); @@ -112,24 +114,35 @@ int BSP_Bt_Register_Valve(uint8_t *data, uint8_t len) return 1; } - for (; i < FLASH_MAC_INFO_LEN; i++) + logDebug("注册阀门信息:"); + if (tmos_memcmp(&data[1], mac_addr, FLASH_MAC_INFO_LEN) == TRUE) { - if (mac_addr[i] != 0xFF) - break; - } - if (i == FLASH_MAC_INFO_LEN) // 说明此处未写入数据,那就在此处写入注册MAC地址 - { - if (Flash_Set_Mac_Addr(&data[1], data[0] - 1) != 0) - { - logError("register valve error"); - return 2; - } - tmos_start_task(BtRxTaskId, BT_INFO_UPDATA_EVT, 0); + logError("已经注册过了"); + return 2; // 说明已经注册过了 } else { - logError("valve info has been registered"); // 这个ID号已经注册了 - return 3; + if (tmos_isbufset(&mac_addr[0], 0xFF, 6) == TRUE) // 说明没有数据,那就全部写入 + { + logDebug("没有数据,全部写入:"); + logDebug("写入MAC 地址: %02X %02X %02X %02X %02X %02X", data[1], data[2], data[3], data[4], data[5], data[6]); + if (Flash_Set_Mac_Addr(&data[1], data[0] - 1) != 0) + { + logError("阀门注册写入flash 错误"); + return 3; + } + else + { + BSP_Bt_Valve_Updata(); // 更新阀门信息 + + + } + + } + else + { + logDebug("有数据 请检查"); + } } return 0; @@ -138,9 +151,9 @@ int BSP_Bt_Register_Valve(uint8_t *data, uint8_t len) /*移除阀门信息*/ int BSP_Bt_Remove_Valve(uint8_t *data, uint8_t len) { - size_t i = 0; - uint8_t mac_addr[FLASH_MAC_INFO_LEN] = {0}; - if ((data[0] >= 1) && (data[0] <= 8)) + size_t i = 0; + uint8_t mac_addr[FLASH_MAC_INFO_LEN + 2] = {0}; + if ((data[0] >= 1) && (data[0] <= 8))// 判断是否是正确的ID { Flash_Get_Mac_Addr(mac_addr, data[0] - 1); } @@ -149,26 +162,23 @@ int BSP_Bt_Remove_Valve(uint8_t *data, uint8_t len) logError("valve id error"); return -1; } - for (; i < FLASH_MAC_INFO_LEN; i++) + if (tmos_memcmp(&data[1], mac_addr, FLASH_MAC_INFO_LEN) != TRUE)// 判断是否是相同的MAC地址 { - if (mac_addr[i] != data[i + 1]) - break; + logError("mac addr error"); + return -2; } - if (i == FLASH_MAC_INFO_LEN) // 说明MAC地址没问题,那么就将其擦除 + else { tmos_memset(mac_addr, 0xFF, FLASH_MAC_INFO_LEN); - if (Flash_Set_Mac_Addr(mac_addr, data[0] - 1) != 0) + if (Flash_Set_Mac_Addr(mac_addr, data[0] - 1) != 0) // 清空掉对应位置MAC数据 { logError("移除阀门信息失败"); return -2; } - tmos_start_task(BtRxTaskId, BT_INFO_UPDATA_EVT, 10); - } - else - { - logError("valve mac addr error"); // 这个ID号已经注册了, - return -3; + BSP_Bt_Valve_Updata(); + Master_DisConnect(); } + return 0; } @@ -177,8 +187,10 @@ int BSP_Bt_Replace_Valve(uint8_t *data, uint8_t len) { size_t i = 0; uint8_t mac_addr[FLASH_MAC_INFO_LEN] = {0}; - if ((len == 0) || (len < 12)) + + if ((len == 0) || (len < 13))//新旧MAC地址长度加id 6 + 6 + 1 = 13至少要大于12 { + logError("data len error"); return -1; } if ((data[0] >= 1) && (data[0] <= 8)) @@ -190,25 +202,21 @@ int BSP_Bt_Replace_Valve(uint8_t *data, uint8_t len) logError("valve id error"); return -2; } - for (; i < FLASH_MAC_INFO_LEN; i++) + if (tmos_memcmp(&data[1], mac_addr, FLASH_MAC_INFO_LEN) == TRUE) { - if (mac_addr[i] != data[i + 1]) - break; + logError("已经注册过了"); // 不需要重复写入 + return 2; // 说明已经注册过了 } - if (i == FLASH_MAC_INFO_LEN) // 说明MAC地址没问题 + else { - tmos_memset(mac_addr, 0xFF, FLASH_MAC_INFO_LEN); - if (Flash_Set_Mac_Addr(mac_addr, data[0] - 1) != 0) + if (Flash_Set_Mac_Addr(&data[1], data[0] - 1) != 0) { - logError("擦除阀门信息失败"); - return -3; + logError("阀门注册写入flash 错误"); + return 3; } - if (Flash_Set_Mac_Addr(&data[7], data[0] - 1) != 0) - { - logError("更换阀门信息失败"); - return -4; - } - tmos_start_task(BtRxTaskId, BT_INFO_UPDATA_EVT, 10); + BSP_Bt_Valve_Updata(); // 更新阀门信息 + + } return 0; } @@ -218,53 +226,64 @@ void BSP_Bt_Valve_Updata(void) { uint8_t cnt = 0; uint8_t mac[6] = {0}; + uint8_t num = Flash_Get_Valve_Num(); logInfo("BSP_Bt_Valve_Updata num: %d ", num); + tmos_memset(&valve_list, 0, sizeof(valve_data_list_t)); + for (int i = 0; i < MAX_VALVE_NUM; i++) // 这个循环是为了将数据拷贝到valve_list中, 并且保证id号和flash对应起来 { - if (Flash_Get_Mac_Addr(mac, i) == 0) + if (Flash_Get_Mac_Addr(mac, i) == 0) // 说明有MAC数据 { - if (tmos_isbufset(mac, 0xFF, 6) == FALSE) // 不是默认值 - { - tmos_memcpy(valve_list.valve_data[cnt].valve_mac, mac, 6); // 这样做的目的就是读取方便,只需要根据flash中读取到的数量进行读取前N个值 - valve_list.valve_data[cnt].valve_id = i + 1; - logDebug("updata valve_id: %d, valve_mac: %02X %02X %02X %02X %02X %02X", - valve_list.valve_data[cnt].valve_id, - valve_list.valve_data[cnt].valve_mac[0], - valve_list.valve_data[cnt].valve_mac[1], - valve_list.valve_data[cnt].valve_mac[2], - valve_list.valve_data[cnt].valve_mac[3], - valve_list.valve_data[cnt].valve_mac[4], - valve_list.valve_data[cnt].valve_mac[5]); - cnt++; - valve_list.valve_num = cnt; - } - else - { - tmos_memset(&valve_list.valve_data[i], 0, sizeof(struct valve_data)); - } + tmos_memcpy(valve_list.valve_data[cnt].valve_mac, mac, 6); // 这样做的目的就是读取方便,只需要根据flash中读取到的数量进行读取前N个值 + valve_list.valve_data[cnt].valve_id = i + 1; + logDebug("updata valve_id: %d, valve_mac: %02X %02X %02X %02X %02X %02X", + valve_list.valve_data[cnt].valve_id, + valve_list.valve_data[cnt].valve_mac[0], + valve_list.valve_data[cnt].valve_mac[1], + valve_list.valve_data[cnt].valve_mac[2], + valve_list.valve_data[cnt].valve_mac[3], + valve_list.valve_data[cnt].valve_mac[4], + valve_list.valve_data[cnt].valve_mac[5]); + cnt++; + valve_list.valve_num = cnt; + break; } else { logError("BSP_Bt_Valve_Updata: flash read error"); + break; } } Flash_Set_Valve_Num(valve_list.valve_num); + } int BSP_Bt_Valve_Resp(uint8_t cmd, uint8_t id, uint8_t *mac_addr, uint8_t state) { - uint8_t ret = 0; - - BtData_t *ptr = (BtData_t *)tmos_msg_allocate(sizeof(BtData_t) + 8); - ptr->cmd = kValveCmdRem; - ptr->buf[0] = id; - tmos_memcpy(&ptr->buf[1], mac_addr, 6); - ptr->buf[7] = state; - BT_GenerateRawFrame(&valve_frame_data, (uint8_t *)ptr, 8); + uint8_t ret = 0; + BtData_t *ptr = (BtData_t *)tmos_msg_allocate(sizeof(struct valve_data)); + ptr->cmd = cmd; + switch (cmd) + { + case kValveCmdCtr: + case kValveCmdReg: + case kValveCmdRem: + case kValveCmdRep: + ptr->buf[0] = id; + tmos_memcpy(&ptr->buf[1], mac_addr, 6); + ptr->buf[7] = state; + BT_GenerateRawFrame(&valve_frame_data, (uint8_t *)ptr, 9); + break; + case kValveEventStatus: + tmos_memcpy(&ptr->buf[0], &valve_list.valve_data[id - 1], sizeof(struct valve_data)); + BT_GenerateRawFrame(&valve_frame_data, (uint8_t *)ptr, sizeof(struct valve_data)); + break; + default: + break; + } tmos_msg_deallocate((uint8_t *)ptr); - ret = BSP_Uart1_Send_Data((uint8_t *)&valve_frame_data.buf[0], valve_frame_data.len); tmos_start_task(BtRxTaskId, BT_SEND_EVT, 50); if (ret == valve_frame_data.len) @@ -274,47 +293,9 @@ int BSP_Bt_Valve_Resp(uint8_t cmd, uint8_t id, uint8_t *mac_addr, uint8_t state) return -1; } - + void BSP_Valve_Init(void) { - uint8_t cnt = 0; - uint8_t mac[6] = {0}; - uint8_t num = Flash_Get_Valve_Num(); - logInfo("num: %d", num); - - logInfo("BSP_Valve_Init"); - valve_list.valve_num = num; - for (int i = 0; i < MAX_VALVE_NUM; i++) // 这个循环是为了将数据拷贝到valve_list中, 并且保证id号和flash对应起来 - { - if (num > 0) - { - if (Flash_Get_Mac_Addr(mac, i) == 0) - { - if (tmos_isbufset(mac, 0xFF, 6) == FALSE) // 不是默认值 - { - tmos_memcpy(valve_list.valve_data[cnt].valve_mac, mac, 6); // 这样做的目的就是读取方便,只需要根据flash中读取到的数量进行读取前N个值 - valve_list.valve_data[cnt].valve_id = i + 1; - logDebug("updata valve_id: %d, valve_mac: %02X %02X %02X %02X %02X %02X", - valve_list.valve_data[cnt].valve_id, - valve_list.valve_data[cnt].valve_mac[0], - valve_list.valve_data[cnt].valve_mac[1], - valve_list.valve_data[cnt].valve_mac[2], - valve_list.valve_data[cnt].valve_mac[3], - valve_list.valve_data[cnt].valve_mac[4], - valve_list.valve_data[cnt].valve_mac[5]); - cnt++; - valve_list.valve_num = cnt; - } - else - { - tmos_memset(&valve_list.valve_data[i], 0, sizeof(struct valve_data)); - } - } - else - { - logError("BSP_Bt_Valve_Updata: flash read error"); - } - } - } - logInfo("BSP_Valve_Init end"); + logDebug("BSP_Valve_Init"); + BSP_Bt_Valve_Updata(); }