From 5c469b4378b6ebd60e49bf09362fc19f4b53050d Mon Sep 17 00:00:00 2001 From: stark1898y <1658608470@qq.com> Date: Mon, 24 Feb 2025 17:45:28 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9A=82=E5=AD=98=EF=BC=8C=E9=A2=91=E7=8E=87?= =?UTF-8?q?=E6=A3=80=E6=B5=8B=E5=8F=AF=E4=BB=A5=EF=BC=8C=E6=8C=89=E9=94=AE?= =?UTF-8?q?=E4=B8=8D=E5=AF=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .vscode/settings.json | 3 +- APP/peripheral.c | 8 +- APP/peripheral_main.c | 135 +++++++++++++++++++---- BSP/inc/bsp_valve.h | 23 +++- BSP/src/bsp_adc.c | 7 ++ BSP/src/bsp_beep_led_emv.c | 2 +- BSP/src/bsp_key.c | 10 +- BSP/src/bsp_valve.c | 220 +++++++++++++++++++++++++++++++++++-- 8 files changed, 366 insertions(+), 42 deletions(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index e9d77c0..3501524 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -19,6 +19,7 @@ "bsp_valve.h": "c", "log.h": "c", "hal.h": "c", - "bsp_iwdg.h": "c" + "bsp_iwdg.h": "c", + "bsp_valve_dect.h": "c" } } diff --git a/APP/peripheral.c b/APP/peripheral.c index 4c9a9f9..b533f1c 100644 --- a/APP/peripheral.c +++ b/APP/peripheral.c @@ -723,21 +723,21 @@ static void peripheralStateNotificationCB(gapRole_States_t newState, gapRoleEven */ static void performPeriodicTask(void) { - gValveData.bat = BSP_ReadVbat(); +#if 0 BSP_BlockSleep(); BSP_RequestBoost(); // DelayMs(1); ShowLed(); - DelayMs(5); + DelayMs(2); LED_ALL_OFF_DEINIT; // BEEP_OFF_DEINIT; BSP_NoNeedBoost(); BSP_RequestSleep(); - +#endif // ѹ;͹ط if (gValveData.bat <= LOW_VABAT_CLOSE_VALUE) { @@ -760,7 +760,7 @@ static void performPeriodicTask(void) logError("Read TempHumi Err"); return; } - #if 0 + #if 1 logDebug("switch_status:%d Temp:%d Bat:%d Humi:%d%% RSSI: %d" , gValveData.switch_status, gValveData.temp, gValveData.bat, gValveData.humi, gValveData.rssi); diff --git a/APP/peripheral_main.c b/APP/peripheral_main.c index c2ba55f..71c63e6 100644 --- a/APP/peripheral_main.c +++ b/APP/peripheral_main.c @@ -46,38 +46,42 @@ void app_task_handler(TeAppEvtType app_evt_type) BSP_BlockSleep(); BSP_RequestBoost(); + // DelayMs(15); + switch (app_evt_type) { case kKeyShort: logDebug("button short press"); key_press_cnt++; logDebug("key_press_cnt = %d", key_press_cnt); - if (key_press_cnt == 1) + + if (valve_switch_dect_flag) { + valve_switch_dect_flag = 0; + logDebug("LED显示状态"); // tmos_set_event(led_task_id, LED_SHOW_START_EVT); BSP_BlockSleep(); BSP_RequestBoost(); DelayMs(1); ShowLed(); - // tmos_stop_task(led_task_id, LED_SHOW_ONCE_EVT); - // tmos_start_task(led_task_id, LED_SHOW_ONCE_EVT, 1000); } - else if (key_press_cnt == 2) + if (key_press_cnt >= 2) { - if (gValveData.switch_status == kClosed) - { - logDebug("kClosed-->kOpened"); - // tmos_set_event(led_task_id, LED_SHOW_START_EVT); - gValveData.switch_status = kOpened; - BSP_BlockSleep(); - BSP_RequestBoost(); - DelayMs(1); - ShowLed(); - // tmos_stop_task(led_task_id, LED_SHOW_ONCE_EVT); - // tmos_start_task(led_task_id, LED_SHOW_ONCE_EVT, 1000); - } - else if (gValveData.switch_status != kClosed) + // if (gValveData.switch_status == kClosed) + // { + // logDebug("kClosed-->kOpened"); + // // tmos_set_event(led_task_id, LED_SHOW_START_EVT); + // gValveData.switch_status = kOpened; + // BSP_BlockSleep(); + // BSP_RequestBoost(); + // DelayMs(1); + // ShowLed(); + // // tmos_stop_task(led_task_id, LED_SHOW_ONCE_EVT); + // // tmos_start_task(led_task_id, LED_SHOW_ONCE_EVT, 1000); + // } + // else + if (gValveData.switch_status != kClosed) { logDebug("kOpened-->kClosed"); gValveData.switch_status = kClosed; @@ -194,7 +198,6 @@ int main(void) BSP_BEEP_LED_EMV_Init(); - logDebug("Start @ChipID=%02X\n", R8_CHIP_ID); logError("中文测试 %2.2f", 123.456); @@ -210,19 +213,107 @@ int main(void) BSP_KEY_Init(app_task_handler); + DelayMs(10); BSP_ADC_Init(); - BSP_VAVLE_Init(); - - BSP_BlockSleep(); BSP_RequestBoost(); +#if 0 DelayMs(1); + EMV_CHARGE_EN; + logDebug("EMV_CHARGE_EN"); + DelayMs(1500); + + BOOST_EN; + // 关阀动作,一定要先关充电的,防止其他12V用电 + EMV_CHARGE_OFF_DEINIT; + BEEP_ON; + logDebug("EMV_CHARGE_OFF_DEINIT"); + EMV_ON; + logDebug("EMV_ON"); + DelayMs(100); + + BEEP_OFF_DEINIT; + EMV_CHARGE_OFF_DEINIT; + EMV_OFF_DEINIT; + LED_ALL_OFF_DEINIT; + + DelayMs(100); + + BSP_VAVLE_Init(); + VavleDect_Start(); + DelayMs(10); + valve_switch_off_freq = VavleDect_GetFreq(); + logDebug("valve_switch_off_freq = %06d Hz", valve_switch_off_freq); + + while (1) + { + LED_ALL_OFF_DEINIT; + DelayMs(500); + LED_R_ON; + DelayMs(500); + if (IS_KEY_Vaild()) + { + DelayMs(20); + if (IS_KEY_Vaild()) + { + break; + } + } + } + + DelayMs(100); + + BSP_VAVLE_Init(); + VavleDect_Start(); + DelayMs(10); + valve_switch_on_freq = VavleDect_GetFreq(); + logDebug("valve_switch_on_freq = %06d Hz", valve_switch_on_freq); + valve_switch_freq = valve_switch_on_freq; + VavleDect_Switch(); +#endif + BSP_VAVLE_Init(); + ShowLed(); BEEP_ON; DelayMs(1000 * 1); + // tmos_set_event(Peripheral_TaskID, SBP_REPLY_CMD_EVT); +#if 0 + // GPIOA_ModeCfg(GPIO_Pin_2, GPIO_ModeIN_Floating); + + // TMR3功能引脚映射选择位: + // 1:TMR3_/PWM3_/CAP3_映射到PA[2]; + R16_PIN_ALTERNATE |= (1 << 3); + logDebug("TMR3_CapInit 0"); + + TMR3_CapInit(FallEdge_To_FallEdge); + // (1 / 62.4MHz) * 2的26次方 = 0.01602564102564102564102564102564 us * 67108864 约等于 1.0754625641025641025641025641025 S + // TMR3_CAPTimeoutCfg(FREQ_SYS ); // 设置捕捉超时时间 + TMR3_CAPTimeoutCfg(GetSysClock() / 100); // 设置捕捉超时时间 10ms + + // TMR3_CAPTimeoutCfg(0x3FFFFFF); // 设置捕捉超时时间 + TMR3_DMACfg(ENABLE, (uint16_t)(uint32_t)&CapBuf[0], (uint16_t)(uint32_t)&CapBuf[20], Mode_Single); + TMR3_ITCfg(ENABLE, TMR0_3_IT_DMA_END); // 开启DMA完成中断 + PFIC_EnableIRQ(TMR3_IRQn); + + logDebug("TMR3_CapInit"); + while(capFlag == 0); + capFlag = 0; + for(uint8_t i = 0; i < 20; i++) + { + logDebug("%08ld ", CapBuf[i] & 0x1ffffff); // 26bit, 最高位表示 高电平还是低电平 + uint16_t t = ((CapBuf[i] & 0x1ffffff) * 1.0f) / FREQ_SYS * 1000000; + uint16_t f = 1000000 / t; + logDebug("T = %04d us, f = %04d Hz", t, f); + BSP_UART1_TxLoop(); + } + + // DelayMs(1000 * 30); + +#endif + LED_ALL_OFF_DEINIT; BEEP_OFF_DEINIT; @@ -243,4 +334,6 @@ int main(void) Main_Circulation(); } + + /******************************** endfile @ main ******************************/ diff --git a/BSP/inc/bsp_valve.h b/BSP/inc/bsp_valve.h index 6ba63c9..26ddce5 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-17 15:51:09 + * @LastEditTime : 2025-02-24 16:39:07 * @FilePath : \BLE_TYQ_CH584M\BSP\inc\bsp_valve.h * @Description : * @@ -23,9 +23,15 @@ extern tmosTaskID vavle_task_id; #define VAVLE_CLOSE_ACTION_EVT (0x0001 << 3) // 关阀,动作 #define VAVLE_CLOSE_END_EVT (0x0001 << 4) // 关阀结束 -#define VAVLE_LOW_VBAT_ALARM_EVT (0x0001 << 5) // 低电压提醒 +#define VAVLE_DECT_SWITCH_START_EVT (0x0001 << 5) // 检测电磁铁 +#define VAVLE_DECT_SWITCH_END_EVT (0x0001 << 6) // 检测电磁铁 + +#define VAVLE_LOW_VBAT_ALARM_EVT (0x0001 << 7) // 低电压提醒 + +#define VAVLE_LOOP_DECT_EVT (0x0001 << 8) // 循环检测 + +#define VAVLE_DECT_SWITCH_CALIB_EVT (0x0001 << 9) // 标定电磁铁 -#define VAVLE_DECT_EVT (0x0001 << 6) // 循环检测 #define VALVE_LOW_VBAT_ALARM_PERIOD_MS (1600 * 60 * 10) @@ -84,8 +90,15 @@ typedef enum kUnknown = 0, kClosed, kOpened, + kDisconnect, } TeValveSwitchStatus; +extern uint16_t valve_switch_on_freq; +extern uint16_t valve_switch_off_freq; +extern uint16_t valve_switch_freq; + +extern volatile uint8_t valve_switch_dect_flag; + typedef struct __attribute__((packed)) { // uint8_t status; // 1B 阀门工作状态 超欠压、过流 @@ -105,6 +118,10 @@ extern TsValveData gValveData; uint8_t CheckSum(const uint8_t *data, size_t len); +void VavleDect_Switch(void); +uint16_t VavleDect_GetFreq(void); +void VavleDect_Start(void); + void BSP_VAVLE_Init(void); TsFrameData* BSP_VAVLE_GetFrameData(uint8_t *data, uint8_t len); diff --git a/BSP/src/bsp_adc.c b/BSP/src/bsp_adc.c index 44f7a7a..9219443 100644 --- a/BSP/src/bsp_adc.c +++ b/BSP/src/bsp_adc.c @@ -25,12 +25,16 @@ uint16_t min_number = 0; uint16_t max_number = 0; double voltage = 0; +// https://www.cnblogs.com/iot-fan/p/14304854.html uint8_t BSP_ReadVbat(void) { uint8_t i; // VBAT uint32_t CountBat = 0; ADC_InterBATSampInit(); + DelayUs(1); + ADC_ExcutSingleConver(); + DelayUs(1); for (i = 0; i < 20; i++) { adcBuff[i] = ADC_ExcutSingleConver(); // 连续采样20次 @@ -48,6 +52,9 @@ uint8_t BSP_ReadVbat(void) } logDebug("min_number = %d, max_number = %d", min_number, max_number); CountBat = (CountBat - min_number - max_number) / 18; // 删除最小与最大值 + // PGA=-12db + // CountBat = CountBat * 1050 / 512 - (3 * 1050); + CountBat = CountBat * 2.05078125 - 3150; uint8_t vbat = (uint8_t)(CountBat / 100); logDebug("AverageCountBat = %dmV, vbat = %d(100mV)", CountBat, vbat); diff --git a/BSP/src/bsp_beep_led_emv.c b/BSP/src/bsp_beep_led_emv.c index e1b55df..27ac425 100644 --- a/BSP/src/bsp_beep_led_emv.c +++ b/BSP/src/bsp_beep_led_emv.c @@ -31,7 +31,7 @@ void ShowLed() LED_ALL_OFF_DEINIT; LED_Y_ON; - BEEP_ON; + // BEEP_ON; logDebug("LED_Y_ON"); } else if (gValveData.switch_status == kUnknown || gValveData.switch_status == kClosed) diff --git a/BSP/src/bsp_key.c b/BSP/src/bsp_key.c index c6c3baa..3f50a61 100644 --- a/BSP/src/bsp_key.c +++ b/BSP/src/bsp_key.c @@ -4,6 +4,7 @@ #include "log.h" #include "SLEEP.h" +#include "bsp_valve.h" // https://www.cnblogs.com/iot-fan/p/14304943.html @@ -250,7 +251,10 @@ void BSP_KEY_Init(app_task_evt_handler_t handler) // 由外部上拉电阻了 // 设置为浮空输入模式 - GPIOB_ModeCfg(GPIO_Pin_16, GPIO_ModeIN_PU); + // MCU_LDECT + // GPIOA_ModeCfg(GPIO_Pin_2, GPIO_ModeIN_PU); + + GPIOB_ModeCfg(GPIO_Pin_16, GPIO_ModeIN_Floating); GPIOB_ModeCfg(GPIO_Pin_0, GPIO_ModeIN_Floating); // GPIOB_ModeCfg(GPIO_Pin_1, GPIO_ModeIN_Floating); @@ -269,9 +273,6 @@ void BSP_KEY_Init(app_task_evt_handler_t handler) tmos_start_task(key_task_id, KEY_SCAN_EVT, MS1_TO_SYSTEM_TIME(KEY_SACN_MS)); #endif - DelayMs(2); - logDebug("BSP_KEY_Init=%d", IS_KEY_Vaild()); - DelayMs(2); logDebug("BSP_KEY_Init=%d", IS_KEY_Vaild()); } @@ -292,6 +293,7 @@ void KEY_ProcessLoop(void) key_wakeup_flag = 0; tmos_set_event(key_task_id, KEY_SCAN_EVT); + tmos_set_event(vavle_task_id, VAVLE_DECT_SWITCH_START_EVT); logDebug("KEY_ProcessLoop"); } } diff --git a/BSP/src/bsp_valve.c b/BSP/src/bsp_valve.c index 5b548c0..48eb181 100644 --- a/BSP/src/bsp_valve.c +++ b/BSP/src/bsp_valve.c @@ -2,7 +2,7 @@ * @Author : stark1898y 1658608470@qq.com * @Date : 2024-12-15 15:01:15 * @LastEditors : stark1898y 1658608470@qq.com - * @LastEditTime : 2025-02-22 17:20:22 + * @LastEditTime : 2025-02-24 17:33:09 * @FilePath : \BLE_TYQ_CH584M\BSP\src\bsp_valve.c * @Description : * @@ -36,6 +36,23 @@ TsRawFrameData RelyData; // 存储 当前task id 的全局变量 tmosTaskID vavle_task_id = INVALID_TASK_ID; +#define ARRAY_SIZE(freq_arr) (sizeof(freq_arr) / sizeof((freq_arr)[0])) + +volatile uint8_t cap_flag = 0; +__attribute__((aligned(4))) uint32_t cap_buf[20]; + +#define CAP_BUF_LEN (20) + +#define CAP_FREQ_MIN (2000U) +#define CAP_FREQ_MAX (10000U) + +uint16_t valve_switch_on_freq = 6535; +uint16_t valve_switch_off_freq = 7508; + +uint16_t valve_switch_freq = 0; + +volatile uint8_t valve_switch_dect_flag = 0; + /** * @description: 从帧起始符开始到校验码之前所有字节的和的模256,即各字节不计超过255的溢出值的二进制算术和。 * @param {uint8_t} *data @@ -54,6 +71,98 @@ uint8_t CheckSum(const uint8_t *data, size_t len) return sum; } +void VavleDect_Start(void) +{ + BSP_BlockSleep(); + BSP_RequestBoost(); + DelayMs(1); + + tmos_memset(cap_buf, 0, sizeof(cap_buf)); + + // TMR3_CAPTimeoutCfg(0x3FFFFFF); // 设置捕捉超时时间 + TMR3_DMACfg(ENABLE, (uint16_t)(uint32_t)&cap_buf[0], (uint16_t)(uint32_t)&cap_buf[CAP_BUF_LEN], Mode_Single); + TMR3_ITCfg(ENABLE, TMR0_3_IT_DMA_END); // 开启DMA完成中断 + PFIC_EnableIRQ(TMR3_IRQn); + + logDebug("VavleDect_Start"); +} + +// 一个数组中,去掉最大最小值,计算平均值 +uint16_t VavleDect_CalFreq(uint16_t freq_arr[], uint8_t n) +{ + if (freq_arr == NULL || n <= 2) + { + logError("数组太小或为空,无法去除最大最小值"); + return 0; + } + + uint16_t min, max; + double average = 0; + + for (uint8_t i = 0; i < n; i++) + { + average += freq_arr[i]; + if (i == 0) + { + min = freq_arr[i]; + max = freq_arr[i]; + } + min = ((min > freq_arr[i]) ? freq_arr[i] : min); // 软件滤波 + max = ((max < freq_arr[i]) ? freq_arr[i] : max); + } + logDebug("min = %d, max = %d", min, max); + average = (average - min - max) / (CAP_BUF_LEN - 2); + + return (uint16_t)average; +} + +uint16_t VavleDect_GetFreq(void) +{ + uint16_t freq = 0; + if (cap_flag == 0) + { + TMR3_ITCfg(DISABLE, TMR0_3_IT_DMA_END); // 使用单次DMA功能+中断,注意完成后关闭此中断使能,否则会一直上报中断。 + TMR3_ClearITFlag(TMR0_3_IT_DMA_END); // 清除中断标志 + logError("cap err"); + return 0; + } + cap_flag = 0; + uint16_t t[CAP_BUF_LEN] = {0}; + uint16_t f[CAP_BUF_LEN] = {0}; + for (uint8_t i = 0; i < CAP_BUF_LEN; i++) + { + // logDebug("%08ld ", cap_buf[i] & 0x1ffffff); // 26bit, 最高位表示 高电平还是低电平 + t[i] = ((cap_buf[i] & 0x1ffffff) * 1.0f) / FREQ_SYS * 1000000; + f[i] = 1000000 / t[i]; + logDebug("T = %04d us, f = %04d Hz", t[i], f[i]); + BSP_UART1_TxLoop(); + } + freq = VavleDect_CalFreq(&f[0], CAP_BUF_LEN); + + return freq; +} + +void VavleDect_Switch(void) +{ + if (valve_switch_freq == 0) + { + gValveData.switch_status = kDisconnect; + logError("valve_switch_freq err"); + return; + } + if (valve_switch_freq >= (valve_switch_off_freq - 100)) + { + gValveData.switch_status = kOpened; + logDebug("valve_switch_on"); + } + else if (valve_switch_freq <= (valve_switch_on_freq + 100)) + { + gValveData.switch_status = kClosed; + logDebug("valve_switch_off"); + } +} + + #if 0 /** * @description: 从接收缓冲区中获取一帧有效数据 @@ -342,10 +451,20 @@ static uint16_t VAVLE_Task_ProcessEvent(uint8_t task_id, uint16_t events) BSP_BlockSleep(); BSP_RequestBoost(); - DelayMs(1); + DelayUs(200); // EMV_CHARGE + // EMV_CHARGE_EN; + // DelayUs(500); + // EMV_CHARGE_OFF_DEINIT; + // DelayUs(200); + + // DelayUs(500); + // EMV_CHARGE_OFF_DEINIT; + // DelayUs(200); + EMV_CHARGE_EN; + logDebug("EMV_CHARGE_EN"); // 开始一个定时event,1s后产生,当前语句只会产生一次event @@ -415,19 +534,69 @@ static uint16_t VAVLE_Task_ProcessEvent(uint8_t task_id, uint16_t events) logDebug("VAVLE_CLOSE_END_EVT"); return (events ^ VAVLE_CLOSE_END_EVT); } + // 开始测量电磁铁电感 + if (events & VAVLE_DECT_SWITCH_START_EVT) + { + valve_switch_dect_flag = 0; + logDebug("VAVLE_DECT_SWITCH_START_EVT"); + VavleDect_Start(); + tmos_start_task(vavle_task_id, VAVLE_DECT_SWITCH_END_EVT, MS1_TO_SYSTEM_TIME(10)); + return (events ^ VAVLE_DECT_SWITCH_START_EVT); + } + if (events & VAVLE_DECT_SWITCH_END_EVT) + { + logDebug("VAVLE_DECT_SWITCH_END_EVT"); + + valve_switch_freq = VavleDect_GetFreq(); + logDebug("valve_switch_freq = 04%d Hz", valve_switch_freq); + VavleDect_Switch(); + valve_switch_dect_flag = 1; + + // logDebug("LED显示状态"); + // // tmos_set_event(led_task_id, LED_SHOW_START_EVT); + // BSP_BlockSleep(); + // BSP_RequestBoost(); + // DelayMs(1); + // ShowLed(); + + return (events ^ VAVLE_DECT_SWITCH_END_EVT); + } + if (events & VAVLE_DECT_SWITCH_CALIB_EVT) + { + logDebug("VAVLE_DECT_SWITCH_CALIB_EVT"); + + return (events ^ VAVLE_DECT_SWITCH_CALIB_EVT); + } + if (events & VAVLE_LOW_VBAT_ALARM_EVT) { logDebug("VAVLE_LOW_VBAT_ALARM_EVT"); - tmos_set_event(vavle_task_id, VAVLE_CLOSE_START_EVT); + // BSP_BlockSleep(); + // BSP_RequestBoost(); + + // LED_ALL_OFF_DEINIT; + // LED_Y_ON; + + // BEEP_ON; + + // DelayMs(10); + + // LED_ALL_OFF_DEINIT; + // 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); } - if (events & VAVLE_DECT_EVT) + if (events & VAVLE_LOOP_DECT_EVT) { - logDebug("VAVLE_DECT_EVT"); + logDebug("VAVLE_LOOP_DECT_EVT"); gValveData.bat = BSP_ReadVbat(); @@ -441,9 +610,9 @@ static uint16_t VAVLE_Task_ProcessEvent(uint8_t task_id, uint16_t events) { tmos_set_event(vavle_task_id, VAVLE_LOW_VBAT_ALARM_EVT); } - tmos_start_task(vavle_task_id, VAVLE_DECT_EVT, MS1_TO_SYSTEM_TIME(VALVE_DECT_PERIOD_MS)); + tmos_start_task(vavle_task_id, VAVLE_LOOP_DECT_EVT, MS1_TO_SYSTEM_TIME(VALVE_DECT_PERIOD_MS)); - return (events ^ VAVLE_DECT_EVT); + return (events ^ VAVLE_LOOP_DECT_EVT); } // Discard unknown events @@ -468,7 +637,42 @@ void BSP_VAVLE_Init(void) // //立即开始一个event // tmos_set_event(vavle_task_id, VAVLE_RX_DATA_EVT); - tmos_start_task(vavle_task_id, VAVLE_DECT_EVT, MS1_TO_SYSTEM_TIME(VALVE_DECT_PERIOD_MS)); + // PA2 + /* 定时器3,CAP捕捉, */ + GPIOA_ResetBits(GPIO_Pin_2); + GPIOA_ModeCfg(GPIO_Pin_2, GPIO_ModeIN_PU); + + // TMR3功能引脚映射选择位: + // 1:TMR3_/PWM3_/CAP3_映射到PA[2]; + R16_PIN_ALTERNATE |= (1 << 3); + + TMR3_CapInit(FallEdge_To_FallEdge); + // (1 / 62.4MHz) * 2的26次方 = 0.01602564102564102564102564102564 us * 67108864 约等于 1.0754625641025641025641025641025 S + // TMR3_CAPTimeoutCfg(FREQ_SYS ); // 设置捕捉超时时间 + TMR3_CAPTimeoutCfg(GetSysClock() / 100); // 设置捕捉超时时间 10ms + + tmos_start_task(vavle_task_id, VAVLE_LOOP_DECT_EVT, MS1_TO_SYSTEM_TIME(VALVE_DECT_PERIOD_MS)); logInfo("BSP_Valve_Init"); } + + + +/********************************************************************* + * @fn TMR3_IRQHandler + * + * @brief TMR3中断函数 + * + * @return none + */ +__INTERRUPT +__HIGH_CODE +void TMR3_IRQHandler(void) // TMR3 定时中断 +{ + if (TMR3_GetITFlag(TMR0_3_IT_DMA_END)) + { + TMR3_ITCfg(DISABLE, TMR0_3_IT_DMA_END); // 使用单次DMA功能+中断,注意完成后关闭此中断使能,否则会一直上报中断。 + TMR3_ClearITFlag(TMR0_3_IT_DMA_END); // 清除中断标志 + cap_flag = 1; + } +}