From 6ec37f1274fce1157dcdee4df60f72863df649a0 Mon Sep 17 00:00:00 2001 From: stark1898y <1658608470@qq.com> Date: Sun, 15 Dec 2024 14:30:06 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9A=82=E5=AD=98=EF=BC=8C=E5=B9=BF=E6=92=AD?= =?UTF-8?q?=E6=89=AB=E4=B8=8D=E5=88=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .cproject | 6 +- .project | 6 +- .settings/language.settings.xml | 2 +- .settings/org.eclipse.core.resources.prefs | 2 + APP/peripheral.c | 79 +++++++++++---------- APP/peripheral_main.c | 30 +++++--- BSP/inc/bsp_iwdg.h | 10 ++- BSP/inc/bsp_valve.h | 11 ++- BSP/src/bsp_iwdg.c | 82 +++++++++++++++++++++- BSP/src/bsp_valve.c | 60 ++++++++++++++++ 10 files changed, 226 insertions(+), 62 deletions(-) diff --git a/.cproject b/.cproject index 8c45b1d..78da63f 100644 --- a/.cproject +++ b/.cproject @@ -14,7 +14,7 @@ - + - + diff --git a/.project b/.project index d7d4c38..b2e792e 100644 --- a/.project +++ b/.project @@ -1,7 +1,7 @@ - + BLE_TYQ_CH592F - + @@ -26,7 +26,7 @@ 1602468250279 - + 22 org.eclipse.ui.ide.multiFilter diff --git a/.settings/language.settings.xml b/.settings/language.settings.xml index 31cb7a0..a1fa25e 100644 --- a/.settings/language.settings.xml +++ b/.settings/language.settings.xml @@ -5,7 +5,7 @@ - + diff --git a/.settings/org.eclipse.core.resources.prefs b/.settings/org.eclipse.core.resources.prefs index 73f0533..691bc15 100644 --- a/.settings/org.eclipse.core.resources.prefs +++ b/.settings/org.eclipse.core.resources.prefs @@ -1,7 +1,9 @@ eclipse.preferences.version=1 encoding//APP/peripheral.c=UTF-8 encoding//APP/peripheral_main.c=UTF-8 +encoding//BSP/inc/bsp_iwdg.h=UTF-8 encoding//BSP/inc/bsp_valve.h=UTF-8 +encoding//BSP/src/bsp_iwdg.c=UTF-8 encoding//BSP/src/bsp_key.c=UTF-8 encoding//BSP/src/bsp_valve.c=UTF-8 encoding//common/letter-shell/extensions/log/log.h=UTF-8 diff --git a/APP/peripheral.c b/APP/peripheral.c index 56e20f1..4fb000f 100644 --- a/APP/peripheral.c +++ b/APP/peripheral.c @@ -43,16 +43,16 @@ */ // How often to perform periodic event -#define SBP_PERIODIC_EVT_PERIOD 1600 +#define SBP_PERIODIC_EVT_PERIOD (160 * 10) // (160 = 100ms) // How often to perform read rssi event -#define SBP_READ_RSSI_EVT_PERIOD 3200 +#define SBP_READ_RSSI_EVT_PERIOD (1600 * 3) // (160 = 100ms) // Parameter update delay -#define SBP_PARAM_UPDATE_DELAY 6400 +#define SBP_PARAM_UPDATE_DELAY (1600 * 4) // PHY update delay -#define SBP_PHY_UPDATE_DELAY 2400 +#define SBP_PHY_UPDATE_DELAY (1600 * 2) // What is the advertising interval when device is discoverable (units of 625us, 80=50ms) #define DEFAULT_ADVERTISING_INTERVAL (160 * 1) @@ -62,7 +62,7 @@ #define DEFAULT_DISCOVERABLE_MODE GAP_ADTYPE_FLAGS_GENERAL // Minimum connection interval (units of 1.25ms, 6=7.5ms) -#define DEFAULT_DESIRED_MIN_CONN_INTERVAL (80 * 5) +#define DEFAULT_DESIRED_MIN_CONN_INTERVAL (80 * 5) // (80 = 100ms) // Maximum connection interval (units of 1.25ms, 100=125ms) #define DEFAULT_DESIRED_MAX_CONN_INTERVAL (80 * 10) @@ -102,23 +102,7 @@ static uint8_t scanRspData[] = { // complete name 0x12, // length of this data GAP_ADTYPE_LOCAL_NAME_COMPLETE, - 'S', - 'i', - 'm', - 'p', - 'l', - 'e', - ' ', - 'P', - 'e', - 'r', - 'i', - 'p', - 'h', - 'e', - 'r', - 'a', - 'l', + 's', 'i', 'm', 'p', 'l', 'e', ' ', 'P', 'e', 'r', 'i', 'p', 'h', 'e', 'r', 'a', 'l', // connection interval range 0x05, // length of this data GAP_ADTYPE_SLAVE_CONN_INTERVAL_RANGE, @@ -300,6 +284,7 @@ void Peripheral_Init() GAPRole_SetParameter(GAPROLE_ADVERT_ENABLED, sizeof(uint8_t), &initial_advertising_enable); GAPRole_SetParameter(GAPROLE_SCAN_RSP_DATA, sizeof(scanRspData), scanRspData); GAPRole_SetParameter(GAPROLE_ADVERT_DATA, sizeof(advertData), advertData); + GAPRole_SetParameter(GAPROLE_MIN_CONN_INTERVAL, sizeof(uint16_t), &desired_min_interval); GAPRole_SetParameter(GAPROLE_MAX_CONN_INTERVAL, sizeof(uint16_t), &desired_max_interval); } @@ -558,7 +543,7 @@ static void Peripheral_LinkEstablished(gapRoleEvent_t *pEvent) if(peripheralConnList.connHandle != GAP_CONNHANDLE_INIT) { GAPRole_TerminateLink(pEvent->linkCmpl.connectionHandle); - logDebug("Connection max...\n"); + logDebug("Connection max..."); } else { @@ -604,13 +589,18 @@ static void Peripheral_LinkTerminated(gapRoleEvent_t *pEvent) // Restart advertising { + // 三个广播通道全部打开 + // uint8_t init_adv_channel_map = GAP_ADVCHAN_ALL ; + // GAPRole_SetParameter( GAPROLE_ADV_CHANNEL_MAP, sizeof( uint8_t ), &init_adv_channel_map); + + // 开启广播 uint8_t advertising_enable = TRUE; GAPRole_SetParameter(GAPROLE_ADVERT_ENABLED, sizeof(uint8_t), &advertising_enable); } } else { - logDebug("ERR..\n"); + logError("ERR.."); } } @@ -655,7 +645,7 @@ static void peripheralParamUpdateCB(uint16_t connHandle, uint16_t connInterval, } else { - logDebug("ERR..\n"); + logError("ERR.."); } } @@ -673,7 +663,7 @@ static void peripheralStateNotificationCB(gapRole_States_t newState, gapRoleEven switch(newState & GAPROLE_STATE_ADV_MASK) { case GAPROLE_STARTED: - logDebug("Initialized..\n"); + logDebug("Initialized.."); break; case GAPROLE_ADVERTISING: @@ -681,11 +671,11 @@ static void peripheralStateNotificationCB(gapRole_States_t newState, gapRoleEven { Peripheral_LinkTerminated(pEvent); logDebug("Disconnected.. Reason:%x\n", pEvent->linkTerminate.reason); - logDebug("Advertising..\n"); + logDebug("Advertising.."); } else if(pEvent->gap.opcode == GAP_MAKE_DISCOVERABLE_DONE_EVENT) { - logDebug("Advertising..\n"); + logDebug("Advertising.."); } break; @@ -693,21 +683,21 @@ static void peripheralStateNotificationCB(gapRole_States_t newState, gapRoleEven if(pEvent->gap.opcode == GAP_LINK_ESTABLISHED_EVENT) { Peripheral_LinkEstablished(pEvent); - logDebug("Connected..\n"); + logDebug("Connected.."); } break; case GAPROLE_CONNECTED_ADV: if(pEvent->gap.opcode == GAP_MAKE_DISCOVERABLE_DONE_EVENT) { - logDebug("Connected Advertising..\n"); + logDebug("Connected Advertising.."); } break; case GAPROLE_WAITING: if(pEvent->gap.opcode == GAP_END_DISCOVERABLE_DONE_EVENT) { - logDebug("Waiting for advertising..\n"); + logDebug("Waiting for advertising.."); } else if(pEvent->gap.opcode == GAP_LINK_TERMINATED_EVENT) { @@ -718,11 +708,11 @@ static void peripheralStateNotificationCB(gapRole_States_t newState, gapRoleEven { if(pEvent->gap.hdr.status != SUCCESS) { - logDebug("Waiting for advertising..\n"); + logDebug("Waiting for advertising.."); } else { - logDebug("Error..\n"); + logDebug("Error.."); } } else @@ -732,7 +722,7 @@ static void peripheralStateNotificationCB(gapRole_States_t newState, gapRoleEven break; case GAPROLE_ERROR: - logDebug("Error..\n"); + logDebug("Error.."); break; default: @@ -865,6 +855,7 @@ static void peripheralChar4Notify(uint8_t *pValue, uint16_t len) */ static void simpleProfileChangeCB(uint8_t paramID, uint8_t *pValue, uint16_t len) { + // tmos_event_hdr_t *test_message; TsRawFrameData RawData; switch(paramID) { @@ -872,14 +863,17 @@ static void simpleProfileChangeCB(uint8_t paramID, uint8_t *pValue, uint16_t len { uint8_t newValue[SIMPLEPROFILE_CHAR1_LEN]; tmos_memcpy(newValue, pValue, len); - logDebug("profile ChangeCB CHAR1.. Start\n"); + logDebug("profile ChangeCB CHAR1.. Start"); for (uint8_t i = 0; i < len; i++) { logDebug("%02x ", newValue[i]); BSP_UART1_TxLoop(); } - logDebug("\n profile ChangeCB CHAR1.. End\n"); + logDebug("\n profile ChangeCB CHAR1.. End"); + + // test_message =(tmos_event_hdr_t*) tmos_msg_allocate(sizeof(tmos_event_hdr_t)); BSP_UART1_TxLoop(); + break; } @@ -944,5 +938,14 @@ static void simpleProfileChangeCB(uint8_t paramID, uint8_t *pValue, uint16_t len } } -/********************************************************************* -*********************************************************************/ + +// TODO:应用加入广播数据更新部分状态数据 +// 动态更新广播数据 +// taskID: 请求更改广播任务的 ID +// adType:TRUE 更改广播数据,FALSE 更改扫描回复数据 +// datalen:数据长度 +// *pAdvertData:数据指针 +void Peripheral_UpdateAdvertData(uint8_t adType, uint8_t dataLen, uint8_t *pAdvertData) +{ + GAP_UpdateAdvertisingData(Peripheral_TaskID, adType, dataLen, pAdvertData); +} diff --git a/APP/peripheral_main.c b/APP/peripheral_main.c index 8676dff..a4375c3 100644 --- a/APP/peripheral_main.c +++ b/APP/peripheral_main.c @@ -28,6 +28,8 @@ #include "bsp_i2c.h" +#include "bsp_iwdg.h" + #undef LOG_ENABLE #define LOG_ENABLE 1 @@ -146,20 +148,21 @@ void Main_Circulation() } } -/********************************************************************* - * @fn BLE_AdvertiseEventCB - * - * @brief Callback from advertise over - * - * @param None - * - * @return none - */ +// https://www.cnblogs.com/gscw/p/18530905 +// 在连接间隔和广播间隔到来时,会进入该回调,可以在回调函数加上其他执行逻辑代码,如喂狗等。 void BLE_AdvertiseEventCB(uint32_t timeUs) { + // FEED_IWDG(); logDebug("BLE_AdvertiseEventCB"); } +void BLE_ConnectEventCB(uint32_t timeUs) +{ + // FEED_IWDG(); + logDebug("BLE_ConnectEventCB"); +} + + /********************************************************************* * @fn main * @@ -172,6 +175,7 @@ int main(void) #if (defined(DCDC_ENABLE)) && (DCDC_ENABLE == TRUE) PWR_DCDCCfg(ENABLE); #endif + // 设置主频为60MHz SetSysClock(CLK_SOURCE_PLL_60MHz); #if (defined(HAL_SLEEP)) && (HAL_SLEEP == TRUE) @@ -189,6 +193,7 @@ int main(void) // logDebug("Start @ChipID=%02X\n", R8_CHIP_ID); logDebug("Start @ChipID=%02X\n", R8_CHIP_ID); logError("中文测试 %2.2f", 123.456); + ShowRestartReason(); #endif DelayMs(1000 * 3); @@ -208,8 +213,9 @@ int main(void) HAL_Init(); GAPRole_PeripheralInit(); Peripheral_Init(); - - LL_AdvertiseEventRegister(BLE_AdvertiseEventCB); + // 在连接间隔和广播间隔到来时,会进入回调中喂狗 + // LL_AdvertiseEventRegister(BLE_AdvertiseEventCB); + // LL_ConnectEventRegister(BLE_ConnectEventCB); DelayMs(100); GXHTC3C_Init(); @@ -221,6 +227,8 @@ int main(void) // BSP_KEY_Init(); BSP_KEY_Init(app_task_handler); + // IWDG_Init(1500); + Main_Circulation(); } diff --git a/BSP/inc/bsp_iwdg.h b/BSP/inc/bsp_iwdg.h index 24675bc..f7bcf33 100644 --- a/BSP/inc/bsp_iwdg.h +++ b/BSP/inc/bsp_iwdg.h @@ -2,7 +2,7 @@ * @Author : stark1898y 1658608470@qq.com * @Date : 2024-12-14 10:51:01 * @LastEditors : stark1898y 1658608470@qq.com - * @LastEditTime : 2024-12-14 10:51:10 + * @LastEditTime : 2024-12-15 11:16:24 * @FilePath : \BLE_TYQ_CH592F\BSP\inc\bsp_iwdg.h * @Description : * @@ -21,8 +21,14 @@ #define RB_WR_PROTECT 0x40000000 // RO, write protect #define RB_IWDG_EN 0x80000000 // RO, watch-dog enable -#define ch59x_iwdg_feed() (R32_IWDG_KR = 0xaaaa) +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_valve.h b/BSP/inc/bsp_valve.h index 3e51255..76ed40d 100644 --- a/BSP/inc/bsp_valve.h +++ b/BSP/inc/bsp_valve.h @@ -2,7 +2,7 @@ * @Author : stark1898y 1658608470@qq.com * @Date : 2024-12-12 15:55:38 * @LastEditors : stark1898y 1658608470@qq.com - * @LastEditTime : 2024-12-14 18:08:58 + * @LastEditTime : 2024-12-15 10:40:07 * @FilePath : \BLE_TYQ_CH592F\BSP\inc\bsp_valve.h * @Description : * @@ -13,6 +13,15 @@ #include "CONFIG.h" +#define VAVLE_RX_DATA_EVT (0x0001 << 0) +#define VAVLE_TX_DATA_EVT (0x0001 << 1) + +#define VAVLE_CLOSE_START_EVT (0x0001 << 2) // 关阀,开始充电 +#define VAVLE_CLOSE_END_EVT (0x0001 << 2) // 关阀,开始充电 + +#define CHARGE_TIME_MS 1000 + + #define FRAME_HEADER 0xAA #define FRAME_TAIL 0x55 diff --git a/BSP/src/bsp_iwdg.c b/BSP/src/bsp_iwdg.c index 4b84cdc..bc47114 100644 --- a/BSP/src/bsp_iwdg.c +++ b/BSP/src/bsp_iwdg.c @@ -3,6 +3,9 @@ #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 @@ -11,13 +14,86 @@ // 32k rc // div 0:4 | 1:8 | 2:16 | 3:32 | -// 4:64 | 5:128 | 6:256 | 7:512 | +// 4:64 | 5:128 | 6:256 | 7:512(32K分频512,时钟62.5Hz) | // reload max 4095 -void ch59x_iwdg_init(uint8_t div, uint16_t reload) +// 独立看门狗(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); - R32_IWDG_KR = 0xcccc; // enable + // 开启IWDG保护 + R32_IWDG_KR = 0xCCCC; + + logDebug("R32_IWDG_CFG = %X", R32_IWDG_CFG); } +// #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_valve.c b/BSP/src/bsp_valve.c index 79e6335..3cbf3e7 100644 --- a/BSP/src/bsp_valve.c +++ b/BSP/src/bsp_valve.c @@ -23,6 +23,8 @@ #undef LOG_TAG #define LOG_TAG "BSP_VALVE" +//存储 当前task id 的全局变量 +tmosTaskID vavle_task_id = INVALID_TASK_ID; /** @@ -250,8 +252,66 @@ void BSP_CloseValve(void) DelayMs(100); } +static void VAVLE_Task_ProcessTmosMsg(tmos_event_hdr_t *pMsg) +{ + switch (pMsg->event) + { + default: + logDebug("pMsg->event %04x", pMsg->event); + break; + } +} + +//task的event处理回调函数,需要在注册task时候,传进去 +static uint16_t VAVLE_Task_ProcessEvent( uint8_t task_id, uint16_t events ) +{ + if (events & SYS_EVENT_MSG) + { + uint8_t *pMsg; + if ((pMsg = tmos_msg_receive(vavle_task_id)) != NULL) + { + VAVLE_Task_ProcessTmosMsg((tmos_event_hdr_t *)pMsg); + // Release the TMOS message + tmos_msg_deallocate(pMsg); + } + // return unprocessed events + 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"); + + //开始一个定时event,1s后产生,当前语句只会产生一次event + //可以在event产生后去开启event,可以是别的task的,也可以是当前task的event + tmos_start_task(vavle_task_id, VAVLE_CLOSE_END_EVT, MS1_TO_SYSTEM_TIME(CHARGE_TIME_MS)); + + return (events ^ VAVLE_CLOSE_START_EVT); + } + + + + // Discard unknown events + return 0; +} + void BSP_VAVLE_Init(void) { + vavle_task_id = TMOS_ProcessEventRegister(VAVLE_Task_ProcessEvent); + + // //立即开始一个event + // tmos_set_event(vavle_task_id, VAVLE_RX_DATA_EVT); logInfo("BSP_Valve_Init"); }