新增兼容两种墙壁开关

This commit is contained in:
xushaoxiang
2026-07-22 11:37:38 +08:00
parent 360697296c
commit 440c4b622c
93 changed files with 1851 additions and 1657 deletions
@@ -234,11 +234,11 @@ void scan_433(void)
long_timer--;
}
if(rf433_sw_flag==1)
{
rf433_sw_flag=0;
}
else if(rf433_sw_flag==2)
// if(rf433_sw_flag==1)
// {
// rf433_sw_flag=0;
// }
if(rf433_sw_flag==2)
{
rf433_sw_flag=0;
power=4;
@@ -1,429 +1,587 @@
#include "switch_s.h"
#include "xc_drv_gpio.h"
#include "rf433.h"
// ==================== GPIO1 检测 ====================
uint8_t trig1_cnt = 0; // 连续触发次数
uint16_t trig1_timeout = 0; // 300ms 倒计时
uint8_t trig1_wait = 0; // 0=空闲 1=连续出触发
// ==================== GPIO19 检测 ====================
uint8_t trig2_cnt = 0; // 连续触发次数
uint16_t trig2_timeout = 0; // 300ms 倒计时
uint8_t trig2_wait = 0; // 0=空闲 1=连续出触发
/*
* ============================================================
* GPIO1 / S1 检测变量
* ============================================================
*/
uint8_t trig1_cnt = 0;
uint16_t trig1_timeout = 0;
uint8_t trig1_wait = 0;
uint8_t rf433_sw_flag=0; //进入对码标志
/*
* ============================================================
* RF433 对码标志
* ============================================================
*
* 0:无对码
* 2:GPIO1 快速按 5 次及以上进入对码
*/
uint8_t rf433_sw_flag = 0;
/*
* ============================================================
* 防抖状态机变量
* ============================================================
*/
static volatile debounce_state_t s1_state = DB_IDLE;
static volatile debounce_state_t s2_state = DB_IDLE;
static volatile uint16_t s1_debounce_cnt = 0;
static volatile uint16_t s2_debounce_cnt = 0;
/*
* ============================================================
* 按下持续时间计数
* ============================================================
*/
static volatile uint16_t s1_press_cnt = 0;
/*
* ============================================================
* 长按普通开关已处理标志
* ============================================================
*/
static volatile uint8_t s1_long_press_done = 0;
/*
* ============================================================
* 回弹点击标志
* ============================================================
*/
static volatile uint8_t s1_return_click_flag = 0;
/*
* ============================================================
* 5次对码失效标志
* ============================================================
*
* 作用:
* 快速拨动达到 5 次后,如果最后一次停留在打开状态超过 200ms,
* 则本次 5 次对码序列失效。
*
* 这样可以避免:
* 快速拨动 5 次后停留在打开一段时间,再关闭,仍然进入对码。
*/
static volatile uint8_t s1_pair_invalid_flag = 0;
/*
* ============================================================
* 防抖时间
* ============================================================
* trigger_check_process() 如果 10ms 调用一次:
* DEBOUNCE_MS = 2 表示 20ms 防抖
*/
#define DEBOUNCE_MS 2
/*
* ============================================================
* 释放标志
* ============================================================
*/
uint8_t switch1_RELEASE_flag = 0;
/*
* ============================================================
* 普通不回弹开关第一次按下标志
* ============================================================
*/
uint8_t s1_first_press_flag = 0;
/*
* ============================================================
* 上电时开关状态
* ============================================================
*/
uint8_t S1_first_on_state = 0;
#define DEBOUNCE_MS 2 //消抖时间40ms
//uint16_t switch1_debounce = 0;
//uint16_t switch2_debounce = 0;
uint8_t switch1_RELEASE_flag=0;
uint8_t switch2_RELEASE_flag=0;
uint8_t s1_first_press_flag = 0; //S2首次按下标志
uint8_t s2_first_press_flag = 0; //S2首次按下标志
uint8_t S1_first_on_state=0; //上电时开关的状态
uint8_t S2_first_on_state=0; //上电时开关的状态
void switch_init(void)
/*
* ============================================================
* S1 状态清理函数
* ============================================================
*/
static void switch_s1_clear_action_state(void)
{
trig1_cnt = 0;
trig1_timeout = 0;
trig1_wait = 0;
GPIO_InitCfg_t GPIO_InitCfg = { 0 }; // 清零初始化配置结构体
GPIO_InitCfg.Mux = GPIO_Mux0; // 选择功能复用器0
GPIO_InitCfg.FunSel = GPIO_Dx; // 选择GPIO功能(非特殊功能)
GPIO_InitCfg.Pull = GPIO_PULLUP; //上拉电阻使能
switch1_RELEASE_flag = 0;
s1_first_press_flag = 0;
s1_return_click_flag = 0;
s1_long_press_done = 0;
s1_press_cnt = 0;
GPIO_InitCfg.Dir = GPIO_DIR_INPUT; // 输出方向
GPIO_InitCfg.Int = FAIL_EDGE_INT; //使能中断
GPIO_InitCfg.Pin = SWITCH_S1_PIN; // 设置S1引脚
xc_gpio_init(&GPIO_InitCfg); // 初始化GPIO
// GPIO_InitCfg.Dir = GPIO_DIR_INPUT; // 输出方向
// GPIO_InitCfg.Int = FAIL_EDGE_INT; //使能中断
// GPIO_InitCfg.Pin = SWITCH_S2_PIN; // 设置S2引脚
// xc_gpio_init(&GPIO_InitCfg); // 初始化GPIO
xc_gpio_it_config(GPIO_1,FAIL_EDGE_INT);
xc_gpio_it_config(GPIO_19,FAIL_EDGE_INT);
NVIC_EnableIRQ(GPIO_IRQn);
//判断首次上电开关状态
if(xc_gpio_read_pin(SWITCH_S1_PIN)==0)
{
S1_first_on_state=1;
}
else
{
S1_first_on_state=0;
}
if(xc_gpio_read_pin(SWITCH_S2_PIN)==0)
{
S2_first_on_state=1;
}
else
{
S2_first_on_state=0;
}
/*
* 新增:
* 清理 5 次对码失效标志。
*/
s1_pair_invalid_flag = 0;
}
/*
* ============================================================
* S1 输出控制:GPIO5
* ============================================================
*/
static void switch_s1_output_on(void)
{
xc_gpio_write_pin(GPIO_5, GPIO_PIN_SET);
flash_ch1_state = xc_gpio_read_pin(GPIO_5);
flash_run();
}
static void switch_s1_output_off(void)
{
xc_gpio_write_pin(GPIO_5, GPIO_PIN_RESET);
flash_ch1_state = xc_gpio_read_pin(GPIO_5);
flash_run();
}
static void switch_s1_output_toggle(void)
{
if(xc_gpio_read_pin(GPIO_5))
{
xc_gpio_write_pin(GPIO_5, GPIO_PIN_RESET);
}
else
{
xc_gpio_write_pin(GPIO_5, GPIO_PIN_SET);
}
flash_ch1_state = xc_gpio_read_pin(GPIO_5);
flash_run();
}
/*
* ============================================================
* 开关 GPIO 初始化
* ============================================================
*/
void switch_init(void)
{
GPIO_InitCfg_t GPIO_InitCfg = { 0 };
GPIO_InitCfg.Mux = GPIO_Mux0;
GPIO_InitCfg.FunSel = GPIO_Dx;
GPIO_InitCfg.Pull = GPIO_PULLUP;
/*
* GPIO1 输入初始化
*/
GPIO_InitCfg.Dir = GPIO_DIR_INPUT;
GPIO_InitCfg.Int = FAIL_EDGE_INT;
GPIO_InitCfg.Pin = SWITCH_S1_PIN;
xc_gpio_init(&GPIO_InitCfg);
/*
* GPIO1 下降沿中断
*/
xc_gpio_it_config(GPIO_1, FAIL_EDGE_INT);
NVIC_EnableIRQ(GPIO_IRQn);
/*
* 上电时检测 GPIO1 初始状态
*/
if(xc_gpio_read_pin(SWITCH_S1_PIN) == 0)
{
S1_first_on_state = 1;
}
else
{
S1_first_on_state = 0;
}
}
/*
* ============================================================
* 开关检测主处理函数
* ============================================================
*
* 需要周期调用。
* 当前按 SWITCH_SCAN_PERIOD_MS = 10ms 计算。
*/
void trigger_check_process(void)
{
if(S1_first_on_state==1)
{
S1_first_on_state=0;
/*
* ========================================================
* 上电时 GPIO1 已经按下
* ========================================================
*/
if(S1_first_on_state == 1)
{
S1_first_on_state = 0;
s1_state = DB_PRESS_DEBOUNCE;
s1_debounce_cnt = DEBOUNCE_MS;
}
s1_state=DB_PRESS_DEBOUNCE;
}
// if(S2_first_on_state==1)
// {
// S2_first_on_state=0;
//
// s2_state=DB_PRESS_DEBOUNCE;
// }
// if(S1_first_on_state==1)
// {
// S1_first_on_state=0;
// s1_first_press_flag=1;
// s1_state=DB_PRESSED;
// }
// if(S2_first_on_state==1)
// {
// S2_first_on_state=0;
// s2_first_press_flag=1;
// s2_state=DB_PRESSED;
// }
switch(s1_state)
{
case DB_IDLE: //空闲状态
break;
case DB_PRESS_DEBOUNCE: //按下防抖
if(s1_debounce_cnt>0) s1_debounce_cnt--;
if(s1_debounce_cnt==0)
{
//防抖时间到,采样当前电平是否是低电平
if(xc_gpio_read_pin(SWITCH_S1_PIN)==0)
{
s1_state = DB_PRESSED; //进入按下状态,不响应中断
if(trig1_wait == 0)
{
trig1_cnt = 1;
trig1_timeout = TRIGGER_TIMEOUT_MS;
trig1_wait = 1;
}
else
{
if(trig1_timeout>0)
{
trig1_cnt++;
}
trig1_timeout = TRIGGER_TIMEOUT_MS;
//
}
}
else
{
// 杂波导致误触,回到空闲
s1_state = DB_IDLE;
}
}
break;
case DB_PRESSED: //确认按下
// 等待引脚回高电平
if(xc_gpio_read_pin(SWITCH_S1_PIN) == 1)
/*
* ========================================================
* S1 状态机
* ========================================================
*/
switch(s1_state)
{
case DB_IDLE:
/*
* 空闲状态低电平补检,防止漏中断。
*/
if(xc_gpio_read_pin(SWITCH_S1_PIN) == 0)
{
s1_state = DB_RELEASE_DEBOUNCE;
s1_debounce_cnt = DEBOUNCE_MS; // 释放30ms防抖
s1_state = DB_PRESS_DEBOUNCE;
s1_debounce_cnt = DEBOUNCE_MS;
}
break;
case DB_RELEASE_DEBOUNCE: //释放防抖
if(s1_debounce_cnt > 0) s1_debounce_cnt--;
case DB_PRESS_DEBOUNCE:
if(s1_debounce_cnt > 0)
{
s1_debounce_cnt--;
}
if(s1_debounce_cnt == 0)
{
if(xc_gpio_read_pin(SWITCH_S1_PIN) == 1) // 确认释放
if(xc_gpio_read_pin(SWITCH_S1_PIN) == 0)
{
s1_state = DB_IDLE; // 回到空闲
trig1_timeout = TRIGGER_TIMEOUT_MS;
s1_state = DB_PRESSED;
switch1_RELEASE_flag=1;
if(s1_first_press_flag==1)
{
s1_first_press_flag=2;
s1_press_cnt = 0;
s1_long_press_done = 0;
}
/*
* 连续触发计数
*/
if(trig1_wait == 0)
{
trig1_cnt = 1;
trig1_timeout = TRIGGER_TIMEOUT_MS;
trig1_wait = 1;
}
else
{
if(trig1_timeout > 0)
{
trig1_cnt++;
}
else
{
/*
* 如果等待标志还在,但超时已经为 0,
* 说明旧状态异常,重新作为第一次点击。
*/
trig1_cnt = 1;
}
trig1_timeout = TRIGGER_TIMEOUT_MS;
}
}
else
{
// 再等20ms
s1_debounce_cnt = DEBOUNCE_MS; // 30ms
s1_state = DB_IDLE;
}
}
break;
}
case DB_PRESSED:
/*
* 按下超过 200ms
* 认为是普通不回弹墙壁开关,打开 GPIO5。
*/
if(s1_long_press_done == 0)
{
if(s1_press_cnt < RETURN_SWITCH_CNT)
{
s1_press_cnt++;
}
if(s1_press_cnt >= RETURN_SWITCH_CNT)
{
s1_long_press_done = 1;
/*
* 普通不回弹开关只处理第一次有效按下。
*
* 注意:
* 这里仍然要求 trig1_cnt == 1
* 避免快速多次点击被误判成长按开关打开。
*/
if(trig1_cnt == 1 && trig1_wait == 1)
{
trig1_cnt = 0;
trig1_timeout = 0;
trig1_wait = 0;
s1_return_click_flag = 0;
switch1_RELEASE_flag = 0;
s1_first_press_flag = 1;
switch_s1_output_on();
}
else if(trig1_cnt >= TRIGGER_CONTINUE_CNT)
{
/*
* ====================================================
* 关键新增修复
* ====================================================
*
* 如果已经快速拨动到了 5 次或以上,
* 但是最后一次保持在打开状态超过 200ms,
* 那么这一次对码序列作废。
*
* 后面即使再关闭,也不能进入对码。
*/
s1_pair_invalid_flag = 1;
/*
* 防止旧的回弹点击标志残留。
*/
s1_return_click_flag = 0;
switch1_RELEASE_flag = 0;
}
}
}
/*
* 检测释放
*/
if(xc_gpio_read_pin(SWITCH_S1_PIN) == 1)
{
s1_state = DB_RELEASE_DEBOUNCE;
s1_debounce_cnt = DEBOUNCE_MS;
}
break;
case DB_RELEASE_DEBOUNCE:
if(s1_debounce_cnt > 0)
{
s1_debounce_cnt--;
}
if(s1_debounce_cnt == 0)
{
if(xc_gpio_read_pin(SWITCH_S1_PIN) == 1)
{
s1_state = DB_IDLE;
/*
* ====================================================
* 关键新增修复
* ====================================================
*
* 如果前面已经判定:
* 快速拨动 5 次后,最后一次停留打开超过 200ms,
* 那么这次释放只是无效释放。
*
* 直接清理状态,不再进入后面的 5 次对码处理。
*/
if(s1_pair_invalid_flag == 1)
{
switch_s1_clear_action_state();
}
else
{
/*
* 释放后重新给连击窗口计时。
*/
trig1_timeout = TRIGGER_TIMEOUT_MS;
switch1_RELEASE_flag = 1;
if(s1_long_press_done == 0)
{
/*
* 200ms 内释放:
* 回弹点击。
*/
s1_return_click_flag = 1;
}
else
{
/*
* 普通不回弹开关释放。
*/
if(s1_first_press_flag == 1)
{
s1_first_press_flag = 2;
}
}
}
}
else
{
s1_debounce_cnt = DEBOUNCE_MS;
}
}
break;
default:
s1_state = DB_IDLE;
break;
}
//
// switch(s2_state)
// {
// case DB_IDLE: //空闲状态
// break;
//
// case DB_PRESS_DEBOUNCE: //按下防抖
// if(s2_debounce_cnt>0) s2_debounce_cnt--;
// if(s2_debounce_cnt==0)
// {
// //防抖时间到,采样当前电平是否是低电平
// if(xc_gpio_read_pin(SWITCH_S2_PIN)==0)
// {
// s2_state = DB_PRESSED; //进入按下状态,不响应中断
// if(trig2_wait == 0)
// {
// trig2_cnt = 1;
// trig2_timeout = TRIGGER_TIMEOUT_MS;
// trig2_wait = 1;
// }
// else
// {
// if(trig2_timeout>0)
// {
// trig2_cnt++;
// }
//
// trig2_timeout = TRIGGER_TIMEOUT_MS;
// }
// }
// else
// {
// // 杂波导致误触,回到空闲
// s2_state = DB_IDLE;
// }
// }
// break;
//
//
// case DB_PRESSED: //确认按下
// // 等待引脚回高电平
// if(xc_gpio_read_pin(SWITCH_S2_PIN) == 1)
// {
// s2_state = DB_RELEASE_DEBOUNCE;
// s2_debounce_cnt = DEBOUNCE_MS; // 释放30ms防抖
// }
// break;
// case DB_RELEASE_DEBOUNCE: //释放防抖
// if(s2_debounce_cnt > 0) s2_debounce_cnt--;
// if(s2_debounce_cnt == 0)
// {
// if(xc_gpio_read_pin(SWITCH_S2_PIN) == 1) // 确认释放
// {
// s2_state = DB_IDLE; // 回到空闲
// trig2_timeout = TRIGGER_TIMEOUT_MS;
// switch2_RELEASE_flag=1;
// if(s2_first_press_flag==1)
// {
// s2_first_press_flag=2;
//
// }
//
//
// }
// else
// {
// // 再等20ms
// s2_debounce_cnt = DEBOUNCE_MS; // 30ms
// }
// }
// break;
// }
// S1 超时处理
/*
* ========================================================
* S1 连击超时处理
* ========================================================
*/
if(trig1_timeout > 0)
{
trig1_timeout--;
}
else if(trig1_timeout==0 && switch1_RELEASE_flag==1 )
{
switch1_RELEASE_flag=2;
}
}
else if(trig1_timeout == 0 && switch1_RELEASE_flag == 1)
{
switch1_RELEASE_flag = 2;
}
// 600ms倒计时结束,且有计数
if(trig1_timeout == 0 && trig1_cnt == 1 && trig1_wait == 1 && s1_state == DB_PRESSED) //确定按下1次
{
//printf("按下一次 trig1_cnt %d\r\n",trig1_cnt);
trig1_cnt = 0;
trig1_wait = 0;
s1_first_press_flag=1;
xc_gpio_write_pin(GPIO_5,GPIO_PIN_SET);
flash_ch1_state=xc_gpio_read_pin(GPIO_5);
flash_run();
}
else if(trig1_timeout == 0 && (trig1_cnt > 1 && trig1_cnt < TRIGGER_CONTINUE_CNT))
{
// printf("乱按 trig1_cnt %d\r\n",trig1_cnt);
trig1_cnt = 0;
trig1_wait = 0;
}
else if(trig1_timeout == 0 && trig1_cnt >= TRIGGER_CONTINUE_CNT)
{
//printf("对码 trig1_cnt %d\r\n",trig1_cnt);
if( s1_state == DB_IDLE)
{
rf433_sw_flag = 2; // HPW421: S1/GPIO5 is the single relay L2 pairing key
trig1_cnt = 0;
trig1_wait = 0;
}
else
{
trig1_cnt = 0;
trig1_wait = 0;
}
}
else if(trig1_timeout == 0 && switch1_RELEASE_flag==2 && s1_state == DB_IDLE && s1_first_press_flag==2 )
{
// printf("低电平 trig2_cnt %d\r\n",trig2_cnt);
s1_state = DB_IDLE;
switch1_RELEASE_flag=0;
s1_first_press_flag=0;
xc_gpio_write_pin(GPIO_5,GPIO_PIN_RESET);
flash_ch1_state=xc_gpio_read_pin(GPIO_5);
flash_run();
}
// // S2 超时处理
// if(trig2_timeout > 0)
// {
// trig2_timeout--;
// }
// else if(trig2_timeout==0 && switch2_RELEASE_flag==1 )
// {
// switch2_RELEASE_flag=2;
// }
//
//
// // 600ms倒计时结束,且有计数
// if(trig2_timeout == 0 && trig2_cnt == 1 && trig2_wait == 1 && s2_state == DB_PRESSED) //确定按下1次
// {
//
// trig2_cnt = 0;
// trig2_wait = 0;
// s2_first_press_flag=1;
//
// xc_gpio_write_pin(GPIO_2,GPIO_PIN_SET);
//
// flash_ch2_state=xc_gpio_read_pin(GPIO_2);
// flash_run();
//
//
// }
//
// else if(trig2_timeout == 0 && (trig2_cnt > 1 && trig2_cnt < TRIGGER_CONTINUE_CNT))
// {
//
// trig2_cnt = 0;
// trig2_wait = 0;
//
//
//
// }
// else if(trig2_timeout == 0 && trig2_cnt >= TRIGGER_CONTINUE_CNT)
// {
//
//
// if( s2_state == DB_IDLE)
// {
// rf433_sw_flag = 2;
// trig2_cnt = 0;
// trig2_wait = 0;
// }
// else
// {
// trig2_cnt = 0;
// trig2_wait = 0;
// }
//
//
// }
//
//
//
// else if(trig2_timeout == 0 && switch2_RELEASE_flag==2 && s2_state == DB_IDLE && s2_first_press_flag==2 )
// {
//
//
//
// s2_state = DB_IDLE;
// switch2_RELEASE_flag=0;
// s2_first_press_flag=0;
//
// xc_gpio_write_pin(GPIO_2,GPIO_PIN_RESET);
// flash_ch2_state=xc_gpio_read_pin(GPIO_2);
// flash_run();
// }
/*
* ========================================================
* S1 回弹开关处理
* ========================================================
*/
if(trig1_timeout == 0 &&
switch1_RELEASE_flag == 2 &&
s1_state == DB_IDLE &&
s1_return_click_flag == 1)
{
if(trig1_cnt == 1 && trig1_wait == 1)
{
/*
* 单击:
* GPIO5 翻转。
*/
switch_s1_clear_action_state();
switch_s1_output_toggle();
}
else if(trig1_cnt > 1 && trig1_cnt < TRIGGER_CONTINUE_CNT)
{
/*
* 2~4 次:
* 不动作,但必须彻底清状态。
*/
switch_s1_clear_action_state();
}
else if(trig1_cnt >= TRIGGER_CONTINUE_CNT)
{
/*
* 5 次及以上:
* 进入对码。
*
* 这里增加 s1_pair_invalid_flag 判断。
* 正常快速拨动 5 次并最终关闭:进入对码。
* 拨动 5 次后停留打开一段时间再关闭:不进入对码。
*/
if(s1_pair_invalid_flag == 0)
{
rf433_sw_flag = 2;
}
switch_s1_clear_action_state();
}
else
{
/*
* 异常兜底清理。
*/
switch_s1_clear_action_state();
}
}
/*
* ========================================================
* 普通不回弹开关释放后关闭 GPIO5
* ========================================================
*/
else if(trig1_timeout == 0 &&
switch1_RELEASE_flag == 2 &&
s1_state == DB_IDLE &&
s1_first_press_flag == 2)
{
/*
* 普通不回弹开关释放后关闭 GPIO5。
*/
switch_s1_clear_action_state();
switch_s1_output_off();
}
/*
* ========================================================
* 兜底:2~4 次超时
* ========================================================
*/
else if(trig1_timeout == 0 &&
trig1_cnt > 1 &&
trig1_cnt < TRIGGER_CONTINUE_CNT)
{
/*
* 2~4 次:
* 不动作,但是必须清理全部状态。
*/
switch_s1_clear_action_state();
}
/*
* ========================================================
* 兜底:5 次及以上超时
* ========================================================
*/
else if(trig1_timeout == 0 &&
trig1_cnt >= TRIGGER_CONTINUE_CNT &&
s1_state == DB_IDLE)
{
/*
* 5 次及以上:
*
* 这里必须保留对码。
* 因为正常快速拨动 5 次后,经常就是走这个兜底分支进入对码。
*
* 但是增加 s1_pair_invalid_flag 判断:
* 如果是“5次后停留打开超过200ms再关闭”,则不允许对码。
*/
if(s1_pair_invalid_flag == 0)
{
rf433_sw_flag = 2;
}
switch_s1_clear_action_state();
}
/*
* ========================================================
* 兜底:异常释放状态
* ========================================================
*/
else if(trig1_timeout == 0 &&
switch1_RELEASE_flag == 2 &&
s1_state == DB_IDLE &&
trig1_cnt == 0 &&
trig1_wait == 0)
{
/*
* 防止残留 switch1_RELEASE_flag == 2。
*/
switch_s1_clear_action_state();
}
}
/*
* ============================================================
* GPIO 中断回调
* ============================================================
*/
void gpio_intr_callback(uint64_t intr_sta)
{
if((intr_sta & ((uint64_t)1 << SWITCH_S1_PIN)) != 0) //如果是GPIO_1的中断
{
if(s1_state == DB_IDLE && S1_first_on_state==0) // 只有空闲才响应
/*
* GPIO1 下降沿中断
*/
if((intr_sta & ((uint64_t)1 << SWITCH_S1_PIN)) != 0)
{
if(s1_state == DB_IDLE && S1_first_on_state == 0)
{
s1_state = DB_PRESS_DEBOUNCE;
s1_debounce_cnt = DEBOUNCE_MS; // 40ms防抖
s1_debounce_cnt = DEBOUNCE_MS;
}
}
// if((intr_sta & ((uint64_t)1 << SWITCH_S2_PIN)) != 0) //如果是GPIO_19的中断
// {
// if(s2_state == DB_IDLE && S2_first_on_state==0)
// {
// s2_state = DB_PRESS_DEBOUNCE;
// s2_debounce_cnt = DEBOUNCE_MS;
// }
// }
}
}
@@ -1,47 +1,75 @@
#ifndef __SWITCH_S_H__
#define __SWITCH_S_H__
#include <stdint.h>
#include "xc_drv_gpio.h"
/*
* ============================================================
* 开关检测说明
* ============================================================
*
* 当前版本只保留 S1
*
* 输入:
* GPIO1
*
* 输出:
* GPIO5
*
* 功能:
*
* 1. 普通不回弹墙壁开关:
* - GPIO1 按下超过 200ms 不松手:
* GPIO5 打开。
* - GPIO1 释放后:
* GPIO5 关闭。
*
* 2. 回弹开关:
* - GPIO1 200ms 内按下松开:
* 认为是一次回弹点击。
* - 单击 1 次:
* GPIO5 翻转,开变关,关变开。
* - 快速点击 2~4 次:
* 不动作。
* - 快速点击 5 次及以上,并且最终释放为关:
* rf433_sw_flag = 2,进入对码。
*
* 3. 修复点:
* - 对码后彻底清理所有开关状态,避免后续只能开不能关。
* - DB_IDLE 状态增加 GPIO1 低电平补检,避免漏中断。
* - 快速拨动 5 次后如果最后停在打开状态,等一段时间再关,
* 不再进入对码。
*/
// 400ms 超时
#define TRIGGER_TIMEOUT_MS 20
// 连续触发次数
#define TRIGGER_CONTINUE_CNT 5
// trigger_check_process() 实际调用周期,单位 ms
#define SWITCH_SCAN_PERIOD_MS 10
#define SWITCH_S1_PIN GPIO_1
#define SWITCH_S2_PIN GPIO_19
// 连击超时时间:20 * 10ms = 200ms
#define TRIGGER_TIMEOUT_MS 20
// 连续触发次数,达到 5 次进入对码
#define TRIGGER_CONTINUE_CNT 5
// 回弹开关判断时间:200ms 内松手,认为是回弹开关
#define RETURN_SWITCH_TIME_MS 200
#define RETURN_SWITCH_CNT (RETURN_SWITCH_TIME_MS / SWITCH_SCAN_PERIOD_MS)
// S1 输入引脚
#define SWITCH_S1_PIN GPIO_1
// 防抖状态机
typedef enum {
DB_IDLE = 0, // 空闲,等待下降沿
DB_PRESS_DEBOUNCE, // 按下防抖中
DB_PRESSED, // 确认按下,等待释放
DB_RELEASE_DEBOUNCE // 释放防抖
DB_IDLE = 0,
DB_PRESS_DEBOUNCE,
DB_PRESSED,
DB_RELEASE_DEBOUNCE
} debounce_state_t;
extern uint8_t rf433_sw_flag;
extern uint8_t S1_first_on_state;
extern uint8_t S2_first_on_state;
void switch_init(void);
void trigger_check_process(void);
#endif
File diff suppressed because it is too large Load Diff
@@ -21,7 +21,7 @@ Target DLL: UL2CM3.DLL V1.164.8.0
Dialog DLL: TARMCM1.DLL V1.14.6.0
<h2>Project:</h2>
C:\Users\QJM\Desktop\421发布58\project\example\ble\ble_peripheral\mdk\ble_peripheral.uvprojx
C:\Users\QJM\Desktop\421发布58兼容两种遥控\project\example\ble\ble_peripheral\mdk\ble_peripheral.uvprojx
Project File Date: 07/21/2026
<h2>Output:</h2>
@@ -44,39 +44,39 @@ compiling usr_server.c...
..\app\src\usr_server.c: 1 warning, 0 errors
compiling aes.c...
compiling app_task.c...
compiling nvds.c...
compiling xc_drv_adc.c...
compiling nvds.c...
compiling xc_drv_aotimer.c...
compiling xc_gap_api.c...
compiling xc_drv_bor.c...
compiling xc_gap_api.c...
compiling xc_gatt_client_api.c...
compiling xc_gatt_server_api.c...
compiling xc_drv_calib.c...
compiling xc_drv_clock.c...
compiling xc_drv_dma.c...
compiling xc_drv_fmc_spi.c...
compiling xc_drv_clock.c...
compiling xc_drv_fmc_spi_dma.c...
compiling xc_drv_gpio.c...
compiling xc_drv_fmc_spi.c...
compiling xc_drv_i2c.c...
compiling xc_drv_gpio.c...
compiling xc_drv_pga.c...
compiling xc_drv_pwm.c...
compiling xc_drv_pwr.c...
compiling xc_drv_qdec.c...
compiling xc_drv_spi.c...
compiling xc_drv_pwr.c...
compiling xc_drv_rtc.c...
compiling xc_drv_spi.c...
compiling xc_drv_spi_dma.c...
compiling xc_drv_sw_i2c.c...
compiling xc_drv_systick.c...
compiling xc_drv_timer.c...
compiling xc_drv_uart_dma.c...
compiling xc_drv_uart.c...
compiling timer.c...
compiling xc_drv_uart_dma.c...
compiling xc_drv_wdt.c...
compiling timer.c...
compiling switch_s.c...
compiling fmc_spi_1.c...
compiling key.c...
compiling led.c...
compiling timeslice.c...
compiling key.c...
compiling uart_1.c...
compiling rf433.c...
..\app\src\rf433.c(116): warning: #177-D: function "set_click" was declared but never referenced
@@ -93,35 +93,35 @@ compiling ota_protocol.c...
compiling ota_server.c...
linking...
.\Linker\cpu_xip.scat(21): warning: L6329W: Pattern uread4.o(.text) only matches removed unused sections.
Program Size: Code=28268 RO-data=1784 RW-data=3012 ZI-data=4196
Program Size: Code=28456 RO-data=1784 RW-data=3016 ZI-data=4192
Finished: 0 information, 1 warning and 0 error messages.
After Build - User command #1: fromelf --bin --output=app.bin .\Objects\Xinc_ble_sdk.axf
After Build - User command #2: .\output_tool\Double_ota\ge_ota.bat
Size of file: 30180 bytes.
all_size=30180
size:30180 PageCNT118
Size of file: 30368 bytes.
all_size=30368
size:30368 PageCNT119
dual_xip
length:30472
size:30472
length:30728
size:30728
Addr:12000
Size:0x7600
Size:0x7700
BAddr:0x12000
Acheck:0x741cdb80
Acheck:0x21e62240
SoftVer:0x10
RomVer:0x20
LoadAddr:0x11012000
Is xip ota?:1
ota_data.bin success已复制 1 个文件。
Size of file: 30180 bytes.
all_size=30180
size:30180 PageCNT118
Size of file: 30368 bytes.
all_size=30368
size:30368 PageCNT119
dual_xip
length:30472
size:30472
length:30728
size:30728
Addr:12000
Size:0x7600
Size:0x7700
BAddr:0x1e000
Acheck:0x741cdb80
Acheck:0x21e62240
SoftVer:0x10
RomVer:0x20
LoadAddr:0x11012000
@@ -155,11 +155,11 @@ is_db=1
is_th=0
需要填充0个sector
all_size:1a000
size: 30180
size: 30368
updata file success !
已复制 1 个文件。
总有2个命令行参数
可 执 行文 件 名:C:\Users\QJM\Desktop\421发布58\tools\offline_burn\Xinc_mac_tool.exe
可 执 行文 件 名:C:\Users\QJM\Desktop\421发布58兼容两种遥控\tools\offline_burn\Xinc_mac_tool.exe
第一个命令行参数:40-ab-00-cd-01-01
第二个命令行参数:1000000
限制烧录次数burn_times=1000000
@@ -195,399 +195,399 @@ crc:26:c6f0eb20
crc:27:25ecd560
crc:28:57384220
crc:29:b08b2bc0
crc:30:e1a2b940
crc:31:47fc4b60
crc:32:c27823c0
crc:33:11f82b40
crc:34:2d6f6aa0
crc:35:b0392d00
crc:36:401f46a0
crc:37:8390a5c0
crc:38:bf87ea40
crc:39:c8a721e0
crc:40:86d31a80
crc:41:8be11c20
crc:42:374eca60
crc:43:b006f720
crc:44:39cd6ee0
crc:45:7712960
crc:46:779a9dc0
crc:47:e1fa0080
crc:48:31290d00
crc:49:6abb1860
crc:50:ae9bb4c0
crc:51:f95677a0
crc:52:10d3a280
crc:53:5e050800
crc:54:38f19840
crc:55:9c788100
crc:56:5e940ac0
crc:57:9edd18e0
crc:58:d3ef8860
crc:59:7d4e26c0
crc:60:703f73a0
crc:61:5a43cc20
crc:62:fd2d7f80
crc:63:470db080
crc:64:4f181b20
crc:65:808b86a0
crc:66:fc5c88a0
crc:67:9b1072e0
crc:68:4d182440
crc:69:dcc9bde0
crc:70:6f547d60
crc:71:d8ec8e0
crc:72:440f72c0
crc:73:39aeb560
crc:74:ceb10f60
crc:75:68620300
crc:76:888f4620
crc:77:b82d9fe0
crc:78:59251d00
crc:79:8c9f95a0
crc:80:2c9abd20
crc:81:803bef40
crc:82:b980af60
crc:83:95503420
crc:84:5fdecca0
crc:85:b4aff440
crc:86:2f74d160
crc:87:b6fbce00
crc:88:d6bfc880
crc:89:b0cb5080
crc:90:d2d2d60
crc:91:72885fe0
crc:92:2af87600
crc:93:ebee5080
crc:94:9fadd2a0
crc:95:1bab0c60
crc:96:884941e0
crc:97:3b483e20
crc:98:2cb130e0
crc:99:7a70ba00
crc:100:b64585a0
crc:101:7f2c1fc0
crc:102:df4b28e0
crc:103:789166c0
crc:104:30d42cc0
crc:105:91cee2c0
crc:106:e2651700
crc:107:f1597ee0
crc:108:abcc4780
crc:109:81d65380
crc:110:5d830c60
crc:111:f4037a40
crc:112:10733d00
crc:113:20da18e0
crc:114:a1d0dae0
crc:115:d356e880
crc:116:460020e0
crc:117:3e569e20
crc:118:eb234e00
crc:119:c0c72500
crc:120:3f640c0
crc:121:cb475280
crc:122:24730a00
crc:123:62339d20
crc:124:106ada00
crc:125:56f44e40
crc:126:5bdad3c0
crc:127:64227c00
crc:128:3faed80
crc:129:69d33aa0
crc:130:bf45e4c0
crc:131:504b5860
crc:132:735615c0
crc:133:cf0c80a0
crc:134:353daa60
crc:135:afbda200
crc:136:f13e0480
crc:137:46ed4f00
crc:138:dc223be0
crc:139:f777aa00
crc:140:c25ac140
crc:141:55ff7ba0
crc:142:c51b7a40
crc:143:90cc9cc0
crc:144:1918be40
crc:145:36e0e620
crc:146:ce5dff20
crc:147:4b0e7a40
crc:148:99817c80
crc:149:241fac20
crc:150:2f032400
crc:151:3f8eae20
crc:152:aa546a0
crc:153:79594a00
crc:154:4d82e920
crc:155:311a54e0
crc:156:d1da5f20
crc:157:3b6921e0
crc:158:f2f86a40
crc:159:9ea748e0
crc:160:29356280
crc:161:20becf20
crc:162:a02d0080
crc:163:9e9ba9e0
crc:164:8538daa0
crc:165:5aab7500
crc:166:3eb67be0
crc:167:5cc299c0
crc:168:990e9040
crc:169:3971eea0
crc:170:b6b9ef40
crc:171:85d6d7c0
crc:172:75a78be0
crc:173:828a9ec0
crc:174:1e55dba0
crc:175:3d3f0160
crc:176:2c26cd60
crc:177:2b841920
crc:178:5fc736a0
crc:179:e596de0
crc:180:ed70cda0
crc:181:539c65c0
crc:182:7f997500
crc:183:48c819c0
crc:184:9dec0740
crc:185:c1711560
crc:186:d5b64280
crc:187:5e8b5380
crc:188:bb426300
crc:189:1d962e80
crc:190:b7c27dc0
crc:191:76b9160
crc:192:7b30f520
crc:193:26844700
crc:194:144a3320
crc:195:a1e22ec0
crc:196:9ed604e0
crc:197:7658b0c0
crc:198:dddad000
crc:199:4de914a0
crc:200:ca3a9e0
crc:201:93712f40
crc:202:e8d81ca0
crc:203:928e3e0
crc:204:b6eb0b60
crc:205:35393080
crc:206:5f107d60
crc:207:4f88e240
crc:208:ab279f00
crc:209:8b580b60
crc:210:c6f31a60
crc:211:fcd2b3a0
crc:212:6f9c3d00
crc:213:555d10a0
crc:214:ff8bb2a0
crc:215:c948fa60
crc:216:477fdec0
crc:217:37028fc0
crc:218:3025ad00
crc:219:632ead20
crc:220:aadaa4c0
crc:221:39764440
crc:222:baad1500
crc:223:ea848400
crc:224:99dd7100
crc:225:300cd9a0
crc:226:ec9c5e0
crc:227:7560f8e0
crc:228:e85ebce0
crc:229:9fbdda0
crc:230:aaddd200
crc:231:24141fc0
crc:232:70000bc0
crc:233:3b8958e0
crc:234:e46cc400
crc:235:eec7cae0
crc:236:edc6da60
crc:237:45102560
crc:238:2923c9c0
crc:239:93497800
crc:240:ad1aa2c0
crc:241:96507740
crc:242:73b2180
crc:243:95569720
crc:244:cc5ce8a0
crc:245:cc63e2a0
crc:246:a2079a00
crc:247:9990e7c0
crc:248:760d1060
crc:249:39fa9dc0
crc:250:17c00240
crc:251:bed960a0
crc:252:33f3d020
crc:253:1ca25ac0
crc:254:ec072660
crc:255:186cf880
crc:256:e8f6ba80
crc:257:36d3c8c0
crc:258:a91f9280
crc:259:1e79a780
crc:260:98059f00
crc:261:f153ffa0
crc:262:5e074420
crc:263:220d6b20
crc:264:ad4479a0
crc:265:8c4ecac0
crc:266:28e1c760
crc:267:12d37d60
crc:268:a60fc3a0
crc:269:8c9e0d20
crc:270:6f6a04c0
crc:271:a5782ae0
crc:272:c45ffce0
crc:273:ffb662c0
crc:274:40b6f120
crc:275:18546f40
crc:276:ec7aa0e0
crc:277:38422a60
crc:278:752406c0
crc:279:471f62a0
crc:280:f9ea0580
crc:281:9b258060
crc:282:17a9dc80
crc:283:baee4380
crc:284:6d8be900
crc:285:6c07cec0
crc:286:3eeb4760
crc:287:d44fda0
crc:288:41a6c900
crc:289:c0935040
crc:290:968816e0
crc:291:61023220
crc:292:a1180480
crc:293:e4b4f6a0
crc:294:ffd20a00
crc:295:ddca1a00
crc:296:29449f00
crc:297:c6743ea0
crc:298:1883f640
crc:299:601529e0
crc:300:b7e45a20
crc:301:d939a6c0
crc:302:c1ae36e0
crc:303:b7579e20
crc:304:b09f5880
crc:305:8d035540
crc:306:cc844f40
crc:307:98a20700
crc:308:3bc23ac0
crc:309:44af7180
crc:310:2d005620
crc:311:f29b9d80
crc:312:6916ae40
crc:313:482f96c0
crc:314:47e0d160
crc:315:6d1f5a00
crc:316:7ee8a480
crc:317:afa4d560
crc:318:e9350040
crc:319:6c875480
crc:320:2f5ae3c0
crc:321:7c32b6e0
crc:322:263f1320
crc:323:59e36c60
crc:324:b6dd64e0
crc:325:5d8e16e0
crc:326:b4be9860
crc:327:9b58d6e0
crc:328:fbd55c80
crc:329:9ea6b5c0
crc:330:7100f400
crc:331:445eafc0
crc:332:35be09e0
crc:333:4b27a000
crc:334:2b125bc0
crc:335:f90ec5a0
crc:336:53a034a0
crc:337:8ed61ec0
crc:338:efad3c00
crc:339:370ba720
crc:340:88cc59a0
crc:341:8a5ca260
crc:342:29b5be20
crc:343:11fe0a20
crc:344:4ff30260
crc:345:89c42000
crc:346:b2eef280
crc:347:4987a780
crc:348:6ad18aa0
crc:349:d7dfed00
crc:350:c6e09500
crc:351:3aed0300
crc:352:83259cc0
crc:353:54b81720
crc:354:9c3a8260
crc:355:5c4e7420
crc:356:218c2800
crc:357:bcf198a0
crc:358:c453f140
crc:359:c3a6ef60
crc:360:a36cfe80
crc:361:66655000
crc:362:52957360
crc:363:69af65c0
crc:364:a02c8f40
crc:365:f9a1c920
crc:366:56b66720
crc:367:88c326a0
crc:368:83de9f80
crc:369:b041e720
crc:370:50e5b560
crc:371:be9ef5e0
crc:372:63da24e0
crc:373:10b272c0
crc:374:3b32a680
crc:375:bae000
crc:376:b19c8280
crc:377:495e8160
crc:378:43590a0
crc:379:8c092de0
crc:380:a75c9080
crc:381:1c745860
crc:382:186ecee0
crc:383:f49045c0
crc:384:953ffdc0
crc:385:ebaa3560
crc:386:b2378680
crc:387:57417460
crc:388:4cf7eb20
crc:389:66339f60
crc:390:cac5d1a0
crc:391:f4cc3440
crc:392:6280e620
crc:393:c45d9a0
crc:394:9c6fe4e0
crc:395:1ebaf2c0
crc:396:d8da48c0
crc:397:b88b2540
crc:398:b3a3b2a0
crc:399:1acf2ac0
crc:400:3657b040
crc:401:ffa3b9e0
crc:402:67462620
crc:403:a762aca0
crc:404:e760a9c0
crc:405:fb5e14e0
crc:406:1462e540
crc:407:d43a1500
crc:408:465bbe0
crc:409:46a1ac60
crc:410:9b639880
crc:411:a8b33b20
crc:412:6fc21c40
crc:413:74f886a0
crc:414:8f568980
crc:415:5e0ba1e0
PageCNT:416remain:256file_sumcheck:5e0ba1e0 i:416
crc:30:5dd40500
crc:31:b2d345c0
crc:32:35241b80
crc:33:caf9a220
crc:34:4811f7e0
crc:35:760e56e0
crc:36:fe5caee0
crc:37:9096fd00
crc:38:2cae7660
crc:39:b60a5900
crc:40:548ad6c0
crc:41:8b6eafa0
crc:42:f28bd0e0
crc:43:d17f94a0
crc:44:de59a2c0
crc:45:73193080
crc:46:d8da74a0
crc:47:4c632020
crc:48:66695b00
crc:49:d76df9a0
crc:50:23a62e0
crc:51:93c10ba0
crc:52:964f3c80
crc:53:7fb6c120
crc:54:d6107500
crc:55:ed2b0960
crc:56:f5764860
crc:57:40fc3220
crc:58:417f8300
crc:59:8c0de520
crc:60:ee46dbc0
crc:61:9e85c540
crc:62:c87b9c40
crc:63:6ba3760
crc:64:e7ac58a0
crc:65:eca7ba0
crc:66:54d67d40
crc:67:4b6989e0
crc:68:5d052240
crc:69:78b9c760
crc:70:23c42fe0
crc:71:a95fbd00
crc:72:dd9fa100
crc:73:d4d2dca0
crc:74:898379e0
crc:75:3e2171a0
crc:76:d05fbdc0
crc:77:b55abc0
crc:78:bf93d1c0
crc:79:c21b1160
crc:80:6a33c220
crc:81:e6c64a60
crc:82:4646c100
crc:83:13fe54c0
crc:84:62301960
crc:85:536f3040
crc:86:dbb13220
crc:87:db527e80
crc:88:225fd560
crc:89:c1404a40
crc:90:6988dca0
crc:91:38527fc0
crc:92:559ff600
crc:93:3eb92f80
crc:94:7dfc6e00
crc:95:50e440a0
crc:96:81ae8760
crc:97:a5fb6f80
crc:98:e245bc20
crc:99:3fe0c960
crc:100:57890aa0
crc:101:33c0b760
crc:102:d1ec1d20
crc:103:d76feb20
crc:104:ac2c800
crc:105:fa858ca0
crc:106:db8ff560
crc:107:697479e0
crc:108:4e57c7e0
crc:109:3746aac0
crc:110:5af187a0
crc:111:7fdc0820
crc:112:df356a80
crc:113:45167a0
crc:114:f0b85520
crc:115:ed30b580
crc:116:9c166240
crc:117:46048720
crc:118:488ae100
crc:119:4f508200
crc:120:5ad6bd00
crc:121:6d9de7c0
crc:122:12e49340
crc:123:c8115e80
crc:124:29e709a0
crc:125:54bef0a0
crc:126:f7e21c20
crc:127:89e00720
crc:128:4b140
crc:129:d52f90c0
crc:130:38d12ec0
crc:131:39cc5680
crc:132:85a77a40
crc:133:996662e0
crc:134:bbeca6e0
crc:135:5cf67420
crc:136:99ce0700
crc:137:cfbd25c0
crc:138:548176e0
crc:139:f7799d00
crc:140:5f660080
crc:141:f0c64ec0
crc:142:86f6bb00
crc:143:2f3628a0
crc:144:f056f820
crc:145:417b1460
crc:146:52aa4360
crc:147:7f2402e0
crc:148:c193a040
crc:149:bd761120
crc:150:1e1cf880
crc:151:94606b40
crc:152:815c8960
crc:153:1ef41580
crc:154:f3800680
crc:155:6295cd80
crc:156:9075db00
crc:157:b6165500
crc:158:47e725a0
crc:159:7a5e3d40
crc:160:c5577640
crc:161:f546bcc0
crc:162:67d4a860
crc:163:cd28b4c0
crc:164:45898860
crc:165:ae2819a0
crc:166:b79dd2e0
crc:167:f489f240
crc:168:df61c740
crc:169:ae51ac40
crc:170:459d15e0
crc:171:c8af6bc0
crc:172:d6b41aa0
crc:173:ce9fdde0
crc:174:72dbb600
crc:175:6232bae0
crc:176:f58c59e0
crc:177:47438c20
crc:178:78dd88e0
crc:179:3bc755e0
crc:180:cf10e980
crc:181:6e6153e0
crc:182:1ffbbbc0
crc:183:9238a3c0
crc:184:3071fac0
crc:185:1614fda0
crc:186:b9fbc300
crc:187:61485ac0
crc:188:d4162060
crc:189:c289f360
crc:190:5fa88860
crc:191:2c0f4640
crc:192:13002dc0
crc:193:ecafbb00
crc:194:6be8cde0
crc:195:80b01920
crc:196:74245ea0
crc:197:d62fd620
crc:198:e48febe0
crc:199:31b28880
crc:200:587ec140
crc:201:39f67920
crc:202:1328aa40
crc:203:c2770ca0
crc:204:678bb340
crc:205:7e9dc6c0
crc:206:ad3b1b80
crc:207:3a7b88e0
crc:208:78c43720
crc:209:fbacbe80
crc:210:7d88cc00
crc:211:fee53700
crc:212:ffbe6240
crc:213:f487ea60
crc:214:104e5c00
crc:215:afb84840
crc:216:20082cc0
crc:217:89935020
crc:218:662b46a0
crc:219:17ce8a00
crc:220:b0906840
crc:221:1e2171a0
crc:222:82e97380
crc:223:9746b680
crc:224:c0748fe0
crc:225:fe938d60
crc:226:25504640
crc:227:efe909a0
crc:228:319f2600
crc:229:25e9bfe0
crc:230:3c802800
crc:231:470b0a00
crc:232:fb95bf20
crc:233:caaaaac0
crc:234:fdef3ea0
crc:235:8d7aaea0
crc:236:fc99d20
crc:237:93f98240
crc:238:6d5b5880
crc:239:3f057f80
crc:240:6bd740a0
crc:241:7ed04080
crc:242:aadbca0
crc:243:2b1b600
crc:244:d7875260
crc:245:e0477fa0
crc:246:28aa0280
crc:247:19ad47e0
crc:248:246ce200
crc:249:e5336d60
crc:250:c890ae20
crc:251:fe426cc0
crc:252:2cad39c0
crc:253:29967280
crc:254:6504de80
crc:255:469509e0
crc:256:1d5f4ce0
crc:257:c08f7fc0
crc:258:af5a6a0
crc:259:c2da6260
crc:260:c598a440
crc:261:938c2b20
crc:262:e68bc0e0
crc:263:a539f940
crc:264:36525220
crc:265:fa4db8a0
crc:266:200e0ae0
crc:267:e5c16280
crc:268:539f27c0
crc:269:b1cd6900
crc:270:46abe5c0
crc:271:677e3800
crc:272:ee804420
crc:273:2a6ad2a0
crc:274:7f51a1c0
crc:275:393f7ea0
crc:276:8e4e6680
crc:277:bfe05480
crc:278:26085340
crc:279:f6b6c0e0
crc:280:e4bc0360
crc:281:7e0b9f60
crc:282:d0f2da20
crc:283:f2afb8c0
crc:284:a56c76c0
crc:285:2e5e6880
crc:286:c5faf120
crc:287:a8dd78c0
crc:288:1000fca0
crc:289:473d920
crc:290:cbdcd5e0
crc:291:e994f120
crc:292:7bec0380
crc:293:189ecea0
crc:294:31b6f080
crc:295:b5a84fc0
crc:296:2270680
crc:297:29c1f260
crc:298:8e157300
crc:299:bed38ec0
crc:300:c9ac64a0
crc:301:366bb540
crc:302:7e5c34c0
crc:303:2abe5660
crc:304:99dd2ba0
crc:305:eec6e920
crc:306:259991a0
crc:307:801903e0
crc:308:4b6a4520
crc:309:d99b8740
crc:310:dd845d60
crc:311:c6f0edc0
crc:312:d80b8fe0
crc:313:d833f560
crc:314:96bd6a60
crc:315:88cceb20
crc:316:43d3a9c0
crc:317:7a38df80
crc:318:fc744c0
crc:319:b15e7ea0
crc:320:96870540
crc:321:cfa02dc0
crc:322:c38c2c80
crc:323:fb416440
crc:324:fdcff660
crc:325:ffa044c0
crc:326:44000ce0
crc:327:bdcc1ae0
crc:328:6924f0a0
crc:329:19858380
crc:330:5d78b7c0
crc:331:756a43c0
crc:332:ca474d80
crc:333:625b23c0
crc:334:98f60040
crc:335:244bf920
crc:336:12f64cc0
crc:337:69e55020
crc:338:2f2e1e40
crc:339:aa025cc0
crc:340:23031ec0
crc:341:33fda400
crc:342:bcfa3300
crc:343:bf95b840
crc:344:84ddc760
crc:345:538d8580
crc:346:bcb51720
crc:347:f3abc820
crc:348:f1b137e0
crc:349:4c15c420
crc:350:ae0825a0
crc:351:e0cc3640
crc:352:ab8dee80
crc:353:f21cc5a0
crc:354:82375ba0
crc:355:e3532440
crc:356:fd119e40
crc:357:b6b8ccc0
crc:358:1d0be220
crc:359:5ec9fc60
crc:360:29dda300
crc:361:6971e3e0
crc:362:243e3be0
crc:363:eab8cca0
crc:364:d43e8120
crc:365:19fc9e80
crc:366:f21d3980
crc:367:691221c0
crc:368:4b291440
crc:369:7df61720
crc:370:ad9aeac0
crc:371:23f0f3c0
crc:372:e4039100
crc:373:a67190c0
crc:374:c7ec2860
crc:375:4f60c3e0
crc:376:a49183e0
crc:377:ba90db80
crc:378:bee37560
crc:379:76c755c0
crc:380:2968c780
crc:381:57a99840
crc:382:90bb99e0
crc:383:db700800
crc:384:57d6ba20
crc:385:fc8581c0
crc:386:4d3b40
crc:387:e2c8f0a0
crc:388:cd09d080
crc:389:b3541400
crc:390:ef541da0
crc:391:876504c0
crc:392:ffd09800
crc:393:1dbef980
crc:394:c6c85740
crc:395:af76bce0
crc:396:76538ca0
crc:397:91e60a60
crc:398:698e0280
crc:399:34399e80
crc:400:7f978f00
crc:401:fa26d6c0
crc:402:b6a12140
crc:403:1b39dc20
crc:404:5f86d180
crc:405:27b710c0
crc:406:b3fb8b60
crc:407:c9e121e0
crc:408:7b6732e0
crc:409:78e37d40
crc:410:6046e0
crc:411:fc3f7fa0
crc:412:17b44fe0
crc:413:3728d240
crc:414:b7a4a8e0
crc:415:df464f60
PageCNT:416remain:256file_sumcheck:df464f60 i:416
length:1a000
00 106496updata mac success !
merge file success !
Checksum source: C:\Users\QJM\Desktop\421发布58\tools\offline_burn\40-ab-00-cd-01-01_5E0BA1E0_1000000.bin
Online BIN: C:\Users\QJM\Desktop\421发布58\release\online\HPW421_V1.3_XC6517_5E0BA1E0.bin
OTA BIN: C:\Users\QJM\Desktop\421发布58\release\ota\HPW421_V1.3_XC6517_5E0BA1E0_OTA.bin
Checksum source: C:\Users\QJM\Desktop\421发布58兼容两种遥控\tools\offline_burn\40-ab-00-cd-01-01_DF464F60_1000000.bin
Online BIN: C:\Users\QJM\Desktop\421发布58兼容两种遥控\release\online\HPW421_V1.3_XC6517_DF464F60.bin
OTA BIN: C:\Users\QJM\Desktop\421发布58兼容两种遥控\release\ota\HPW421_V1.3_XC6517_DF464F60_OTA.bin
".\Objects\Xinc_ble_sdk.axf" - 0 Error(s), 7 Warning(s).
<h2>Software Packages used:</h2>
@@ -601,7 +601,7 @@ Package Vendor: ARM
D:/Keil_v5/Packs/ARM/CMSIS/5.9.0/Device/ARM/ARMCM0/Include
<h2>Collection of Component Files used:</h2>
Build Time Elapsed: 00:00:22
Build Time Elapsed: 00:00:20
</pre>
</body>
</html>
File diff suppressed because it is too large Load Diff
Binary file not shown.
File diff suppressed because one or more lines are too long
Binary file not shown.
Binary file not shown.
@@ -7,11 +7,10 @@
.\objects\timeslice.o: ..\app\src\rf433.h
.\objects\timeslice.o: ..\app\src\key.h
.\objects\timeslice.o: ..\app\src\switch_s.h
.\objects\timeslice.o: ..\app\src\ota_flash_interface.h
.\objects\timeslice.o: ..\..\..\..\..\component\xc6xx_drivers\Drivers\xc_driver\xc_drv_fmc_spi.h
.\objects\timeslice.o: ..\..\..\..\..\component\xc6xx_drivers\Drivers\xc_driver\xc_drv_gpio.h
.\objects\timeslice.o: D:\Keil_v5\ARM\ARMCC\Bin\..\include\stdbool.h
.\objects\timeslice.o: ..\..\..\..\..\component\xc6xx_drivers\Drivers\CMSIS\Device\xc6xxx.h
.\objects\timeslice.o: ..\..\..\..\..\component\xc6xx_drivers\Drivers\CMSIS\Device\xc65xx.h
.\objects\timeslice.o: D:\Keil_v5\ARM\ARMCC\Bin\..\include\stdbool.h
.\objects\timeslice.o: ..\..\..\..\..\component\xc6xx_drivers\Drivers\CMSIS\core_cm0.h
.\objects\timeslice.o: ..\..\..\..\..\component\xc6xx_drivers\Drivers\CMSIS\core_cmInstr.h
.\objects\timeslice.o: ..\..\..\..\..\component\xc6xx_drivers\Drivers\CMSIS\core_cmFunc.h
@@ -64,6 +63,8 @@
.\objects\timeslice.o: ..\..\..\..\..\component\xc6xx_drivers\Drivers\xc_driver\xc_drv_adc.h
.\objects\timeslice.o: ..\..\..\..\..\component\xc6xx_drivers\Drivers\xc_driver\xc_drv_pwm.h
.\objects\timeslice.o: ..\..\..\..\..\component\xc6xx_drivers\Drivers\xc_driver\xc_drv_bor.h
.\objects\timeslice.o: ..\app\src\ota_flash_interface.h
.\objects\timeslice.o: ..\..\..\..\..\component\xc6xx_drivers\Drivers\xc_driver\xc_drv_fmc_spi.h
.\objects\timeslice.o: ..\app\src\ota_protocol.h
.\objects\timeslice.o: ..\..\..\..\..\component\ble\plf\refip\src\arch\arch.h
.\objects\timeslice.o: ..\..\..\..\..\component\ble\modules\rwip\api\rwip_config.h
Binary file not shown.
File diff suppressed because one or more lines are too long
@@ -1,4 +1,4 @@
;#<FEEDBACK># ARM Linker, 5060960: Last Updated: Tue Jul 21 15:56:41 2026
;#<FEEDBACK># ARM Linker, 5060960: Last Updated: Wed Jul 22 10:59:11 2026
;VERSION 0.2
;FILE aes.o
__asm___5_aes_c____REV16 <= USED 0
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.