暂存,频率检测可以,按键不对

This commit is contained in:
stark1898y 2025-02-24 17:45:28 +08:00
parent ff9c225b0d
commit 5c469b4378
8 changed files with 366 additions and 42 deletions

View File

@ -19,6 +19,7 @@
"bsp_valve.h": "c", "bsp_valve.h": "c",
"log.h": "c", "log.h": "c",
"hal.h": "c", "hal.h": "c",
"bsp_iwdg.h": "c" "bsp_iwdg.h": "c",
"bsp_valve_dect.h": "c"
} }
} }

View File

@ -723,21 +723,21 @@ static void peripheralStateNotificationCB(gapRole_States_t newState, gapRoleEven
*/ */
static void performPeriodicTask(void) static void performPeriodicTask(void)
{ {
gValveData.bat = BSP_ReadVbat(); gValveData.bat = BSP_ReadVbat();
#if 0
BSP_BlockSleep(); BSP_BlockSleep();
BSP_RequestBoost(); BSP_RequestBoost();
// DelayMs(1); // DelayMs(1);
ShowLed(); ShowLed();
DelayMs(5); DelayMs(2);
LED_ALL_OFF_DEINIT; LED_ALL_OFF_DEINIT;
// BEEP_OFF_DEINIT; // BEEP_OFF_DEINIT;
BSP_NoNeedBoost(); BSP_NoNeedBoost();
BSP_RequestSleep(); BSP_RequestSleep();
#endif
// µçѹ¹ýµÍ¾Í¹Ø·§ // µçѹ¹ýµÍ¾Í¹Ø·§
if (gValveData.bat <= LOW_VABAT_CLOSE_VALUE) if (gValveData.bat <= LOW_VABAT_CLOSE_VALUE)
{ {
@ -760,7 +760,7 @@ static void performPeriodicTask(void)
logError("Read TempHumi Err"); logError("Read TempHumi Err");
return; return;
} }
#if 0 #if 1
logDebug("switch_status:%d Temp:%d Bat:%d Humi:%d%% RSSI: %d" logDebug("switch_status:%d Temp:%d Bat:%d Humi:%d%% RSSI: %d"
, gValveData.switch_status, gValveData.temp, gValveData.bat, gValveData.humi, gValveData.rssi); , gValveData.switch_status, gValveData.temp, gValveData.bat, gValveData.humi, gValveData.rssi);

View File

@ -46,38 +46,42 @@ void app_task_handler(TeAppEvtType app_evt_type)
BSP_BlockSleep(); BSP_BlockSleep();
BSP_RequestBoost(); BSP_RequestBoost();
// DelayMs(15);
switch (app_evt_type) switch (app_evt_type)
{ {
case kKeyShort: case kKeyShort:
logDebug("button short press"); logDebug("button short press");
key_press_cnt++; key_press_cnt++;
logDebug("key_press_cnt = %d", 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显示状态"); logDebug("LED显示状态");
// tmos_set_event(led_task_id, LED_SHOW_START_EVT); // tmos_set_event(led_task_id, LED_SHOW_START_EVT);
BSP_BlockSleep(); BSP_BlockSleep();
BSP_RequestBoost(); BSP_RequestBoost();
DelayMs(1); DelayMs(1);
ShowLed(); 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) // if (gValveData.switch_status == kClosed)
{ // {
logDebug("kClosed-->kOpened"); // logDebug("kClosed-->kOpened");
// tmos_set_event(led_task_id, LED_SHOW_START_EVT); // // tmos_set_event(led_task_id, LED_SHOW_START_EVT);
gValveData.switch_status = kOpened; // gValveData.switch_status = kOpened;
BSP_BlockSleep(); // BSP_BlockSleep();
BSP_RequestBoost(); // BSP_RequestBoost();
DelayMs(1); // DelayMs(1);
ShowLed(); // ShowLed();
// tmos_stop_task(led_task_id, LED_SHOW_ONCE_EVT); // // tmos_stop_task(led_task_id, LED_SHOW_ONCE_EVT);
// tmos_start_task(led_task_id, LED_SHOW_ONCE_EVT, 1000); // // tmos_start_task(led_task_id, LED_SHOW_ONCE_EVT, 1000);
} // }
else if (gValveData.switch_status != kClosed) // else
if (gValveData.switch_status != kClosed)
{ {
logDebug("kOpened-->kClosed"); logDebug("kOpened-->kClosed");
gValveData.switch_status = kClosed; gValveData.switch_status = kClosed;
@ -194,7 +198,6 @@ int main(void)
BSP_BEEP_LED_EMV_Init(); BSP_BEEP_LED_EMV_Init();
logDebug("Start @ChipID=%02X\n", R8_CHIP_ID); logDebug("Start @ChipID=%02X\n", R8_CHIP_ID);
logError("中文测试 %2.2f", 123.456); logError("中文测试 %2.2f", 123.456);
@ -210,19 +213,107 @@ int main(void)
BSP_KEY_Init(app_task_handler); BSP_KEY_Init(app_task_handler);
DelayMs(10);
BSP_ADC_Init(); BSP_ADC_Init();
BSP_VAVLE_Init();
BSP_BlockSleep(); BSP_BlockSleep();
BSP_RequestBoost(); BSP_RequestBoost();
#if 0
DelayMs(1); 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(); ShowLed();
BEEP_ON; BEEP_ON;
DelayMs(1000 * 1); DelayMs(1000 * 1);
// tmos_set_event(Peripheral_TaskID, SBP_REPLY_CMD_EVT);
#if 0
// GPIOA_ModeCfg(GPIO_Pin_2, GPIO_ModeIN_Floating);
// TMR3功能引脚映射选择位
// 1TMR3_/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; LED_ALL_OFF_DEINIT;
BEEP_OFF_DEINIT; BEEP_OFF_DEINIT;
@ -243,4 +334,6 @@ int main(void)
Main_Circulation(); Main_Circulation();
} }
/******************************** endfile @ main ******************************/ /******************************** endfile @ main ******************************/

View File

@ -2,7 +2,7 @@
* @Author : stark1898y 1658608470@qq.com * @Author : stark1898y 1658608470@qq.com
* @Date : 2024-12-12 15:55:38 * @Date : 2024-12-12 15:55:38
* @LastEditors : stark1898y 1658608470@qq.com * @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 * @FilePath : \BLE_TYQ_CH584M\BSP\inc\bsp_valve.h
* @Description : * @Description :
* *
@ -23,9 +23,15 @@ extern tmosTaskID vavle_task_id;
#define VAVLE_CLOSE_ACTION_EVT (0x0001 << 3) // 关阀,动作 #define VAVLE_CLOSE_ACTION_EVT (0x0001 << 3) // 关阀,动作
#define VAVLE_CLOSE_END_EVT (0x0001 << 4) // 关阀结束 #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) #define VALVE_LOW_VBAT_ALARM_PERIOD_MS (1600 * 60 * 10)
@ -84,8 +90,15 @@ typedef enum
kUnknown = 0, kUnknown = 0,
kClosed, kClosed,
kOpened, kOpened,
kDisconnect,
} TeValveSwitchStatus; } 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)) typedef struct __attribute__((packed))
{ {
// uint8_t status; // 1B 阀门工作状态 超欠压、过流 // uint8_t status; // 1B 阀门工作状态 超欠压、过流
@ -105,6 +118,10 @@ extern TsValveData gValveData;
uint8_t CheckSum(const uint8_t *data, size_t len); 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); void BSP_VAVLE_Init(void);
TsFrameData* BSP_VAVLE_GetFrameData(uint8_t *data, uint8_t len); TsFrameData* BSP_VAVLE_GetFrameData(uint8_t *data, uint8_t len);

View File

@ -25,12 +25,16 @@ uint16_t min_number = 0;
uint16_t max_number = 0; uint16_t max_number = 0;
double voltage = 0; double voltage = 0;
// https://www.cnblogs.com/iot-fan/p/14304854.html
uint8_t BSP_ReadVbat(void) uint8_t BSP_ReadVbat(void)
{ {
uint8_t i; uint8_t i;
// VBAT // VBAT
uint32_t CountBat = 0; uint32_t CountBat = 0;
ADC_InterBATSampInit(); ADC_InterBATSampInit();
DelayUs(1);
ADC_ExcutSingleConver();
DelayUs(1);
for (i = 0; i < 20; i++) for (i = 0; i < 20; i++)
{ {
adcBuff[i] = ADC_ExcutSingleConver(); // 连续采样20次 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); logDebug("min_number = %d, max_number = %d", min_number, max_number);
CountBat = (CountBat - min_number - max_number) / 18; // 删除最小与最大值 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); uint8_t vbat = (uint8_t)(CountBat / 100);
logDebug("AverageCountBat = %dmV, vbat = %d(100mV)", CountBat, vbat); logDebug("AverageCountBat = %dmV, vbat = %d(100mV)", CountBat, vbat);

View File

@ -31,7 +31,7 @@ void ShowLed()
LED_ALL_OFF_DEINIT; LED_ALL_OFF_DEINIT;
LED_Y_ON; LED_Y_ON;
BEEP_ON; // BEEP_ON;
logDebug("LED_Y_ON"); logDebug("LED_Y_ON");
} }
else if (gValveData.switch_status == kUnknown || gValveData.switch_status == kClosed) else if (gValveData.switch_status == kUnknown || gValveData.switch_status == kClosed)

View File

@ -4,6 +4,7 @@
#include "log.h" #include "log.h"
#include "SLEEP.h" #include "SLEEP.h"
#include "bsp_valve.h"
// https://www.cnblogs.com/iot-fan/p/14304943.html // 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_0, GPIO_ModeIN_Floating);
// GPIOB_ModeCfg(GPIO_Pin_1, 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)); tmos_start_task(key_task_id, KEY_SCAN_EVT, MS1_TO_SYSTEM_TIME(KEY_SACN_MS));
#endif #endif
DelayMs(2);
logDebug("BSP_KEY_Init=%d", IS_KEY_Vaild());
DelayMs(2);
logDebug("BSP_KEY_Init=%d", IS_KEY_Vaild()); logDebug("BSP_KEY_Init=%d", IS_KEY_Vaild());
} }
@ -292,6 +293,7 @@ void KEY_ProcessLoop(void)
key_wakeup_flag = 0; key_wakeup_flag = 0;
tmos_set_event(key_task_id, KEY_SCAN_EVT); tmos_set_event(key_task_id, KEY_SCAN_EVT);
tmos_set_event(vavle_task_id, VAVLE_DECT_SWITCH_START_EVT);
logDebug("KEY_ProcessLoop"); logDebug("KEY_ProcessLoop");
} }
} }

View File

@ -2,7 +2,7 @@
* @Author : stark1898y 1658608470@qq.com * @Author : stark1898y 1658608470@qq.com
* @Date : 2024-12-15 15:01:15 * @Date : 2024-12-15 15:01:15
* @LastEditors : stark1898y 1658608470@qq.com * @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 * @FilePath : \BLE_TYQ_CH584M\BSP\src\bsp_valve.c
* @Description : * @Description :
* *
@ -36,6 +36,23 @@ TsRawFrameData RelyData;
// 存储 当前task id 的全局变量 // 存储 当前task id 的全局变量
tmosTaskID vavle_task_id = INVALID_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: 256255 * @description: 256255
* @param {uint8_t} *data * @param {uint8_t} *data
@ -54,6 +71,98 @@ uint8_t CheckSum(const uint8_t *data, size_t len)
return sum; 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 #if 0
/** /**
* @description: * @description:
@ -342,10 +451,20 @@ static uint16_t VAVLE_Task_ProcessEvent(uint8_t task_id, uint16_t events)
BSP_BlockSleep(); BSP_BlockSleep();
BSP_RequestBoost(); BSP_RequestBoost();
DelayMs(1); DelayUs(200);
// EMV_CHARGE // EMV_CHARGE
// EMV_CHARGE_EN;
// DelayUs(500);
// EMV_CHARGE_OFF_DEINIT;
// DelayUs(200);
// DelayUs(500);
// EMV_CHARGE_OFF_DEINIT;
// DelayUs(200);
EMV_CHARGE_EN; EMV_CHARGE_EN;
logDebug("EMV_CHARGE_EN"); logDebug("EMV_CHARGE_EN");
// 开始一个定时event,1s后产生,当前语句只会产生一次event // 开始一个定时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"); logDebug("VAVLE_CLOSE_END_EVT");
return (events ^ 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) if (events & VAVLE_LOW_VBAT_ALARM_EVT)
{ {
logDebug("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)); // 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 (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(); 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_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 // Discard unknown events
@ -468,7 +637,42 @@ void BSP_VAVLE_Init(void)
// //立即开始一个event // //立即开始一个event
// tmos_set_event(vavle_task_id, VAVLE_RX_DATA_EVT); // 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
/* 定时器3CAP捕捉 */
GPIOA_ResetBits(GPIO_Pin_2);
GPIOA_ModeCfg(GPIO_Pin_2, GPIO_ModeIN_PU);
// TMR3功能引脚映射选择位
// 1TMR3_/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"); 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;
}
}