2 Commits

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