3 Commits

Author SHA1 Message Date
xushaoxiang 2aa2ee3d95 修复不带记忆的bug 2026-08-22 13:16:33 +08:00
xushaoxiang b140b47ceb 最新发布版本 2026-07-28 13:31:36 +08:00
xushaoxiang 440c4b622c 新增兼容两种墙壁开关 2026-07-22 11:37:38 +08:00
104 changed files with 1921 additions and 1731 deletions
@@ -55,10 +55,9 @@ void read_user_data(void)
adress_ch1_index = r_data[22]; adress_ch1_index = r_data[22];
adress_ch2_index = r_data[23]; adress_ch2_index = r_data[23];
flash_ch1_state=0; flash_ch1_state=r_data[24];
flash_ch2_state=r_data[25]; flash_ch2_state=r_data[25];
memset(adress_H_ch1, 0, sizeof(adress_H_ch1));
memset(adress_L_ch1, 0, sizeof(adress_L_ch1));
adress_ch1_index = 0; adress_ch1_index = 0;
} }
@@ -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,65 +1,191 @@
#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;
#define DEBOUNCE_MS 2 //消抖时间40ms /*
* ============================================================
* 回弹点击标志
* ============================================================
*/
static volatile uint8_t s1_return_click_flag = 0;
//uint16_t switch1_debounce = 0; /*
//uint16_t switch2_debounce = 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 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_press_flag = 0;
uint8_t S1_first_on_state=0; //上电时开关的状态 /*
uint8_t S2_first_on_state=0; //上电时开关的状态 * ============================================================
* 上电时开关状态
* ============================================================
*/
uint8_t S1_first_on_state = 0;
/*
* ============================================================
* S1 状态清理函数
* ============================================================
*/
static void switch_s1_clear_action_state(void)
{
trig1_cnt = 0;
trig1_timeout = 0;
trig1_wait = 0;
switch1_RELEASE_flag = 0;
s1_first_press_flag = 0;
s1_return_click_flag = 0;
s1_long_press_done = 0;
s1_press_cnt = 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_ch2_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_ch2_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_ch2_state = xc_gpio_read_pin(GPIO_5);
flash_run();
}
/*
* ============================================================
* 开关 GPIO 初始化
* ============================================================
*/
void switch_init(void) void switch_init(void)
{ {
GPIO_InitCfg_t GPIO_InitCfg = { 0 };
GPIO_InitCfg_t GPIO_InitCfg = { 0 }; // 清零初始化配置结构体 GPIO_InitCfg.Mux = GPIO_Mux0;
GPIO_InitCfg.Mux = GPIO_Mux0; // 选择功能复用器0 GPIO_InitCfg.FunSel = GPIO_Dx;
GPIO_InitCfg.FunSel = GPIO_Dx; // 选择GPIO功能(非特殊功能) GPIO_InitCfg.Pull = GPIO_PULLUP;
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);
GPIO_InitCfg.Dir = GPIO_DIR_INPUT; // 输出方向 /*
GPIO_InitCfg.Int = FAIL_EDGE_INT; //使能中断 * GPIO1 下降沿中断
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_1, FAIL_EDGE_INT);
xc_gpio_it_config(GPIO_19,FAIL_EDGE_INT);
NVIC_EnableIRQ(GPIO_IRQn); NVIC_EnableIRQ(GPIO_IRQn);
/*
//判断首次上电开关状态 * 上电时检测 GPIO1 初始状态
*/
if(xc_gpio_read_pin(SWITCH_S1_PIN) == 0) if(xc_gpio_read_pin(SWITCH_S1_PIN) == 0)
{ {
S1_first_on_state = 1; S1_first_on_state = 1;
@@ -68,60 +194,67 @@ void switch_init(void)
{ {
S1_first_on_state = 0; 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;
}
} }
/*
* ============================================================
* 开关检测主处理函数
* ============================================================
*
* 需要周期调用。
* 当前按 SWITCH_SCAN_PERIOD_MS = 10ms 计算。
*/
void trigger_check_process(void) void trigger_check_process(void)
{ {
/*
* ========================================================
* 上电时 GPIO1 已经按下
* ========================================================
*/
if(S1_first_on_state == 1) if(S1_first_on_state == 1)
{ {
S1_first_on_state = 0; S1_first_on_state = 0;
s1_state = DB_PRESS_DEBOUNCE; s1_state = DB_PRESS_DEBOUNCE;
s1_debounce_cnt = DEBOUNCE_MS;
} }
// 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;
// }
/*
* ========================================================
* S1 状态机
* ========================================================
*/
switch(s1_state) switch(s1_state)
{ {
case DB_IDLE: //空闲状态 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) if(xc_gpio_read_pin(SWITCH_S1_PIN) == 0)
{ {
s1_state = DB_PRESSED; //进入按下状态,不响应中断 s1_state = DB_PRESS_DEBOUNCE;
s1_debounce_cnt = DEBOUNCE_MS;
}
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;
s1_press_cnt = 0;
s1_long_press_done = 0;
/*
* 连续触发计数
*/
if(trig1_wait == 0) if(trig1_wait == 0)
{ {
trig1_cnt = 1; trig1_cnt = 1;
@@ -134,137 +267,168 @@ void trigger_check_process(void)
{ {
trig1_cnt++; trig1_cnt++;
} }
else
{
/*
* 如果等待标志还在,但超时已经为 0,
* 说明旧状态异常,重新作为第一次点击。
*/
trig1_cnt = 1;
}
trig1_timeout = TRIGGER_TIMEOUT_MS; trig1_timeout = TRIGGER_TIMEOUT_MS;
//
} }
} }
else else
{ {
// 杂波导致误触,回到空闲
s1_state = DB_IDLE; s1_state = DB_IDLE;
} }
} }
break; break;
case DB_PRESSED:
/*
* 按下超过 200ms:
* 认为是普通不回弹墙壁开关,打开 GPIO5。
*/
if(s1_long_press_done == 0)
{
if(s1_press_cnt < RETURN_SWITCH_CNT)
{
s1_press_cnt++;
}
case DB_PRESSED: //确认按下 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) if(xc_gpio_read_pin(SWITCH_S1_PIN) == 1)
{ {
s1_state = DB_RELEASE_DEBOUNCE; s1_state = DB_RELEASE_DEBOUNCE;
s1_debounce_cnt = DEBOUNCE_MS; // 释放30ms防抖 s1_debounce_cnt = DEBOUNCE_MS;
} }
break; break;
case DB_RELEASE_DEBOUNCE: //释放防抖 case DB_RELEASE_DEBOUNCE:
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) // 确认释放 s1_debounce_cnt--;
{
s1_state = DB_IDLE; // 回到空闲
trig1_timeout = TRIGGER_TIMEOUT_MS;
switch1_RELEASE_flag=1;
if(s1_first_press_flag==1)
{
s1_first_press_flag=2;
} }
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 else
{ {
// 再等20ms /*
s1_debounce_cnt = DEBOUNCE_MS; // 30ms * 释放后重新给连击窗口计时。
*/
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; break;
} }
/*
// * ========================================================
// switch(s2_state) * S1 连击超时处理
// { * ========================================================
// 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 超时处理
if(trig1_timeout > 0) if(trig1_timeout > 0)
{ {
trig1_timeout--; trig1_timeout--;
@@ -275,155 +439,149 @@ void trigger_check_process(void)
} }
// 600ms倒计时结束,且有计数 /*
if(trig1_timeout == 0 && trig1_cnt == 1 && trig1_wait == 1 && s1_state == DB_PRESSED) //确定按下1次 * ========================================================
* S1 回弹开关处理
* ========================================================
*/
if(trig1_timeout == 0 &&
switch1_RELEASE_flag == 2 &&
s1_state == DB_IDLE &&
s1_return_click_flag == 1)
{ {
//printf("按下一次 trig1_cnt %d\r\n",trig1_cnt); if(trig1_cnt == 1 && trig1_wait == 1)
trig1_cnt = 0; {
trig1_wait = 0; /*
s1_first_press_flag=1; * 单击:
xc_gpio_write_pin(GPIO_5,GPIO_PIN_SET); * GPIO5 翻转。
flash_ch1_state=xc_gpio_read_pin(GPIO_5); */
flash_run(); 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;
} }
else if(trig1_timeout == 0 && (trig1_cnt > 1 && trig1_cnt < TRIGGER_CONTINUE_CNT)) switch_s1_clear_action_state();
{
// 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 else
{ {
trig1_cnt = 0; /*
trig1_wait = 0; * 异常兜底清理。
*/
switch_s1_clear_action_state();
} }
} }
/*
else if(trig1_timeout == 0 && switch1_RELEASE_flag==2 && s1_state == DB_IDLE && s1_first_press_flag==2 ) * ========================================================
* 普通不回弹开关释放后关闭 GPIO5
* ========================================================
*/
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; * 普通不回弹开关释放后关闭 GPIO5。
switch1_RELEASE_flag=0; */
s1_first_press_flag=0; switch_s1_clear_action_state();
xc_gpio_write_pin(GPIO_5,GPIO_PIN_RESET); switch_s1_output_off();
flash_ch1_state=xc_gpio_read_pin(GPIO_5); }
flash_run(); /*
* ========================================================
* 兜底:2~4 次超时
} * ========================================================
*/
else if(trig1_timeout == 0 &&
trig1_cnt > 1 &&
trig1_cnt < TRIGGER_CONTINUE_CNT)
{
// // S2 超时处理 /*
// if(trig2_timeout > 0) * 2~4 次:
// { * 不动作,但是必须清理全部状态。
// trig2_timeout--; */
// } switch_s1_clear_action_state();
// else if(trig2_timeout==0 && switch2_RELEASE_flag==1 ) }
// { /*
// switch2_RELEASE_flag=2; * ========================================================
// } * 兜底:5 次及以上超时
// * ========================================================
// */
// // 600ms倒计时结束,且有计数 else if(trig1_timeout == 0 &&
// if(trig2_timeout == 0 && trig2_cnt == 1 && trig2_wait == 1 && s2_state == DB_PRESSED) //确定按下1次 trig1_cnt >= TRIGGER_CONTINUE_CNT &&
// { s1_state == DB_IDLE)
// {
// trig2_cnt = 0; /*
// trig2_wait = 0; * 5 次及以上:
// s2_first_press_flag=1; *
// * 这里必须保留对码。
// xc_gpio_write_pin(GPIO_2,GPIO_PIN_SET); * 因为正常快速拨动 5 次后,经常就是走这个兜底分支进入对码。
// *
// flash_ch2_state=xc_gpio_read_pin(GPIO_2); * 但是增加 s1_pair_invalid_flag 判断:
// flash_run(); * 如果是“5次后停留打开超过200ms再关闭”,则不允许对码。
// */
// if(s1_pair_invalid_flag == 0)
// } {
// rf433_sw_flag = 2;
// 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();
// }
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) void gpio_intr_callback(uint64_t intr_sta)
{ {
if((intr_sta & ((uint64_t)1 << SWITCH_S1_PIN)) != 0) //如果是GPIO_1的中断 /*
* GPIO1 下降沿中断
*/
if((intr_sta & ((uint64_t)1 << SWITCH_S1_PIN)) != 0)
{ {
if(s1_state == DB_IDLE && S1_first_on_state==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 SWITCH_SCAN_PERIOD_MS 10
// 连击超时时间:20 * 10ms = 200ms
#define TRIGGER_TIMEOUT_MS 20 #define TRIGGER_TIMEOUT_MS 20
// 连续触发次数
// 连续触发次数,达到 5 次进入对码
#define TRIGGER_CONTINUE_CNT 5 #define TRIGGER_CONTINUE_CNT 5
#define SWITCH_S1_PIN GPIO_1 // 回弹开关判断时间:200ms 内松手,认为是回弹开关
#define SWITCH_S2_PIN GPIO_19 #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>
@@ -29,6 +29,7 @@ Project File Date: 07/21/2026
Rebuild target 'ble-sdk-xip' Rebuild target 'ble-sdk-xip'
assembling startup_xinc.s... assembling startup_xinc.s...
compiling system_xinc.c... compiling system_xinc.c...
compiling aes.c...
compiling sleep.c... compiling sleep.c...
compiling app_batt.c... compiling app_batt.c...
compiling arch_main.c... compiling arch_main.c...
@@ -42,86 +43,85 @@ 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 aes.c...
compiling app_task.c...
compiling nvds.c... compiling nvds.c...
compiling app_task.c...
compiling xc_drv_adc.c... compiling xc_drv_adc.c...
compiling xc_drv_aotimer.c... compiling xc_drv_aotimer.c...
compiling xc_gap_api.c...
compiling xc_drv_bor.c... compiling xc_drv_bor.c...
compiling xc_gatt_client_api.c... compiling xc_gatt_client_api.c...
compiling xc_gap_api.c...
compiling xc_gatt_server_api.c... 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_fmc_spi.c...
compiling xc_drv_i2c.c... compiling xc_drv_i2c.c...
compiling xc_drv_gpio.c...
compiling xc_drv_pga.c... compiling xc_drv_pga.c...
compiling xc_drv_pwm.c... compiling xc_drv_pwm.c...
compiling xc_drv_pwr.c... compiling xc_drv_pwr.c...
compiling xc_drv_qdec.c... compiling xc_drv_qdec.c...
compiling xc_drv_spi.c...
compiling xc_drv_rtc.c...
compiling xc_drv_spi_dma.c... compiling xc_drv_spi_dma.c...
compiling xc_drv_rtc.c...
compiling xc_drv_spi.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_dma.c...
compiling xc_drv_uart.c... compiling xc_drv_uart.c...
compiling timer.c...
compiling xc_drv_wdt.c... compiling xc_drv_wdt.c...
compiling switch_s.c... compiling timer.c...
compiling fmc_spi_1.c... compiling fmc_spi_1.c...
compiling key.c...
compiling led.c...
compiling timeslice.c...
compiling uart_1.c... compiling uart_1.c...
compiling timeslice.c...
compiling switch_s.c...
compiling key.c...
compiling rf433.c... compiling rf433.c...
..\app\src\rf433.c(116): warning: #177-D: function "set_click" was declared but never referenced ..\app\src\rf433.c(116): warning: #177-D: function "set_click" was declared but never referenced
static void set_click(void) static void set_click(void)
..\app\src\rf433.c: 1 warning, 0 errors ..\app\src\rf433.c: 1 warning, 0 errors
compiling rf433_decoder.c... compiling led.c...
compiling ota_flash_interface.c... compiling ota_flash_interface.c...
compiling rf433_decoder.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=28440 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: 30352 bytes.
all_size=30180 all_size=30352
size:30180 PageCNT118 size:30352 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:0xf3ee5b20
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: 30352 bytes.
all_size=30180 all_size=30352
size:30180 PageCNT118 size:30352 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:0xf3ee5b20
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: 30352
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:a31fcaa0
crc:31:47fc4b60 crc:31:a9410300
crc:32:c27823c0 crc:32:2d51c2c0
crc:33:11f82b40 crc:33:19efa7a0
crc:34:2d6f6aa0 crc:34:3e831760
crc:35:b0392d00 crc:35:ab1dd900
crc:36:401f46a0 crc:36:efc872c0
crc:37:8390a5c0 crc:37:9d51d1c0
crc:38:bf87ea40 crc:38:613f6ce0
crc:39:c8a721e0 crc:39:7b8943e0
crc:40:86d31a80 crc:40:da673840
crc:41:8be11c20 crc:41:9cbbb7c0
crc:42:374eca60 crc:42:11d72520
crc:43:b006f720 crc:43:39067680
crc:44:39cd6ee0 crc:44:7226f460
crc:45:7712960 crc:45:11ff9980
crc:46:779a9dc0 crc:46:7808a320
crc:47:e1fa0080 crc:47:6c1cdcc0
crc:48:31290d00 crc:48:3abe080
crc:49:6abb1860 crc:49:ac944ac0
crc:50:ae9bb4c0 crc:50:e633c580
crc:51:f95677a0 crc:51:7f39eb40
crc:52:10d3a280 crc:52:bcb099a0
crc:53:5e050800 crc:53:20b1e2e0
crc:54:38f19840 crc:54:5eb02d80
crc:55:9c788100 crc:55:d9860080
crc:56:5e940ac0 crc:56:b2091060
crc:57:9edd18e0 crc:57:d85b9a60
crc:58:d3ef8860 crc:58:58f5be0
crc:59:7d4e26c0 crc:59:1ab21ee0
crc:60:703f73a0 crc:60:c7dca740
crc:61:5a43cc20 crc:61:3f36200
crc:62:fd2d7f80 crc:62:aeb8e520
crc:63:470db080 crc:63:64e9a960
crc:64:4f181b20 crc:64:f2572a80
crc:65:808b86a0 crc:65:5ede0b20
crc:66:fc5c88a0 crc:66:45848640
crc:67:9b1072e0 crc:67:e3be7940
crc:68:4d182440 crc:68:d1e0c7c0
crc:69:dcc9bde0 crc:69:1e221860
crc:70:6f547d60 crc:70:a20c58a0
crc:71:d8ec8e0 crc:71:1d888ac0
crc:72:440f72c0 crc:72:2a155100
crc:73:39aeb560 crc:73:dde84280
crc:74:ceb10f60 crc:74:4113c200
crc:75:68620300 crc:75:a089b460
crc:76:888f4620 crc:76:21725a80
crc:77:b82d9fe0 crc:77:4bea96e0
crc:78:59251d00 crc:78:ad5865e0
crc:79:8c9f95a0 crc:79:9f7979e0
crc:80:2c9abd20 crc:80:d0651de0
crc:81:803bef40 crc:81:a8b61260
crc:82:b980af60 crc:82:7a481420
crc:83:95503420 crc:83:f40765c0
crc:84:5fdecca0 crc:84:196081a0
crc:85:b4aff440 crc:85:a0ee1700
crc:86:2f74d160 crc:86:b97d91c0
crc:87:b6fbce00 crc:87:74774de0
crc:88:d6bfc880 crc:88:6380bc40
crc:89:b0cb5080 crc:89:56aff140
crc:90:d2d2d60 crc:90:37c8e540
crc:91:72885fe0 crc:91:f63e2b00
crc:92:2af87600 crc:92:8e9a79e0
crc:93:ebee5080 crc:93:dcbfce60
crc:94:9fadd2a0 crc:94:851e3360
crc:95:1bab0c60 crc:95:e8978b20
crc:96:884941e0 crc:96:f78e9020
crc:97:3b483e20 crc:97:403a7600
crc:98:2cb130e0 crc:98:ab8c33a0
crc:99:7a70ba00 crc:99:47376780
crc:100:b64585a0 crc:100:f0eaeb80
crc:101:7f2c1fc0 crc:101:3b298400
crc:102:df4b28e0 crc:102:aaf73bc0
crc:103:789166c0 crc:103:d09b0e40
crc:104:30d42cc0 crc:104:6d5a7600
crc:105:91cee2c0 crc:105:4d2cd360
crc:106:e2651700 crc:106:bc25f520
crc:107:f1597ee0 crc:107:d20d62c0
crc:108:abcc4780 crc:108:a5297900
crc:109:81d65380 crc:109:6363d940
crc:110:5d830c60 crc:110:e1d9dd20
crc:111:f4037a40 crc:111:2c765c60
crc:112:10733d00 crc:112:95b21580
crc:113:20da18e0 crc:113:2fb09080
crc:114:a1d0dae0 crc:114:3e2ac80
crc:115:d356e880 crc:115:4adab660
crc:116:460020e0 crc:116:5a3cbb60
crc:117:3e569e20 crc:117:26b4c7a0
crc:118:eb234e00 crc:118:2aff6f80
crc:119:c0c72500 crc:119:e2664520
crc:120:3f640c0 crc:120:ca89b920
crc:121:cb475280 crc:121:5261a20
crc:122:24730a00 crc:122:bb74f2e0
crc:123:62339d20 crc:123:a32bdba0
crc:124:106ada00 crc:124:ee8b8f20
crc:125:56f44e40 crc:125:89f29d60
crc:126:5bdad3c0 crc:126:53955600
crc:127:64227c00 crc:127:d762b000
crc:128:3faed80 crc:128:527c1aa0
crc:129:69d33aa0 crc:129:c602d00
crc:130:bf45e4c0 crc:130:695af8c0
crc:131:504b5860 crc:131:c338fa20
crc:132:735615c0 crc:132:5bfeec20
crc:133:cf0c80a0 crc:133:e56311a0
crc:134:353daa60 crc:134:881292a0
crc:135:afbda200 crc:135:2a854aa0
crc:136:f13e0480 crc:136:eeac4a00
crc:137:46ed4f00 crc:137:1f53bfa0
crc:138:dc223be0 crc:138:e7fed2c0
crc:139:f777aa00 crc:139:2d544160
crc:140:c25ac140 crc:140:b40e9800
crc:141:55ff7ba0 crc:141:3dfe49a0
crc:142:c51b7a40 crc:142:55298800
crc:143:90cc9cc0 crc:143:d6b70c00
crc:144:1918be40 crc:144:e10da4c0
crc:145:36e0e620 crc:145:8c33a4e0
crc:146:ce5dff20 crc:146:bda2cde0
crc:147:4b0e7a40 crc:147:64e7ba60
crc:148:99817c80 crc:148:ba9b2660
crc:149:241fac20 crc:149:e63ee5c0
crc:150:2f032400 crc:150:b31d0380
crc:151:3f8eae20 crc:151:6b6d85e0
crc:152:aa546a0 crc:152:487c2080
crc:153:79594a00 crc:153:975ebb00
crc:154:4d82e920 crc:154:8c72e4a0
crc:155:311a54e0 crc:155:a1c06f60
crc:156:d1da5f20 crc:156:13135200
crc:157:3b6921e0 crc:157:59b9c220
crc:158:f2f86a40 crc:158:157ab660
crc:159:9ea748e0 crc:159:630a8f60
crc:160:29356280 crc:160:f2308dc0
crc:161:20becf20 crc:161:45249500
crc:162:a02d0080 crc:162:b8398d80
crc:163:9e9ba9e0 crc:163:a6563c60
crc:164:8538daa0 crc:164:18785220
crc:165:5aab7500 crc:165:ec58ca00
crc:166:3eb67be0 crc:166:67635460
crc:167:5cc299c0 crc:167:8ec282e0
crc:168:990e9040 crc:168:ecbebf40
crc:169:3971eea0 crc:169:805a8bc0
crc:170:b6b9ef40 crc:170:728a35e0
crc:171:85d6d7c0 crc:171:b6bdb620
crc:172:75a78be0 crc:172:9d8c64c0
crc:173:828a9ec0 crc:173:5878a0e0
crc:174:1e55dba0 crc:174:fcdddca0
crc:175:3d3f0160 crc:175:74980720
crc:176:2c26cd60 crc:176:8d3fc620
crc:177:2b841920 crc:177:2ce3fbc0
crc:178:5fc736a0 crc:178:a2aa7bc0
crc:179:e596de0 crc:179:6cd38d60
crc:180:ed70cda0 crc:180:6dd7d600
crc:181:539c65c0 crc:181:47f125a0
crc:182:7f997500 crc:182:65a85fc0
crc:183:48c819c0 crc:183:35d19800
crc:184:9dec0740 crc:184:960db1a0
crc:185:c1711560 crc:185:d606e800
crc:186:d5b64280 crc:186:cf7bf980
crc:187:5e8b5380 crc:187:79e646a0
crc:188:bb426300 crc:188:860b83c0
crc:189:1d962e80 crc:189:bb475ae0
crc:190:b7c27dc0 crc:190:e8970d60
crc:191:76b9160 crc:191:6e0c95e0
crc:192:7b30f520 crc:192:65042400
crc:193:26844700 crc:193:31fb660
crc:194:144a3320 crc:194:81da6cc0
crc:195:a1e22ec0 crc:195:f4ad0ac0
crc:196:9ed604e0 crc:196:df739100
crc:197:7658b0c0 crc:197:615c1760
crc:198:dddad000 crc:198:bae19140
crc:199:4de914a0 crc:199:e0073b00
crc:200:ca3a9e0 crc:200:db9e1920
crc:201:93712f40 crc:201:76729aa0
crc:202:e8d81ca0 crc:202:c076fc60
crc:203:928e3e0 crc:203:d2a77560
crc:204:b6eb0b60 crc:204:98fe9f00
crc:205:35393080 crc:205:a438c720
crc:206:5f107d60 crc:206:3fbdde80
crc:207:4f88e240 crc:207:bf39ab80
crc:208:ab279f00 crc:208:41ba7280
crc:209:8b580b60 crc:209:e58c580
crc:210:c6f31a60 crc:210:939551e0
crc:211:fcd2b3a0 crc:211:5d193b80
crc:212:6f9c3d00 crc:212:3dc7bfc0
crc:213:555d10a0 crc:213:eeef5980
crc:214:ff8bb2a0 crc:214:39e18340
crc:215:c948fa60 crc:215:56a4f920
crc:216:477fdec0 crc:216:1fc14c60
crc:217:37028fc0 crc:217:4deda880
crc:218:3025ad00 crc:218:f9b18220
crc:219:632ead20 crc:219:596f0b20
crc:220:aadaa4c0 crc:220:be6f0de0
crc:221:39764440 crc:221:1ec7bc0
crc:222:baad1500 crc:222:8c7c5880
crc:223:ea848400 crc:223:e7aa8de0
crc:224:99dd7100 crc:224:3396baa0
crc:225:300cd9a0 crc:225:c295ef40
crc:226:ec9c5e0 crc:226:fd9a4300
crc:227:7560f8e0 crc:227:558621c0
crc:228:e85ebce0 crc:228:9a187620
crc:229:9fbdda0 crc:229:43deb0c0
crc:230:aaddd200 crc:230:9ddab820
crc:231:24141fc0 crc:231:47607e0
crc:232:70000bc0 crc:232:2e8e6e00
crc:233:3b8958e0 crc:233:8a9bce80
crc:234:e46cc400 crc:234:6fadeee0
crc:235:eec7cae0 crc:235:65200ca0
crc:236:edc6da60 crc:236:1a6396e0
crc:237:45102560 crc:237:6396bec0
crc:238:2923c9c0 crc:238:a2c060
crc:239:93497800 crc:239:4476a3a0
crc:240:ad1aa2c0 crc:240:87a0f180
crc:241:96507740 crc:241:1b4b0c0
crc:242:73b2180 crc:242:454aa6a0
crc:243:95569720 crc:243:a9aaf6c0
crc:244:cc5ce8a0 crc:244:1e111260
crc:245:cc63e2a0 crc:245:9dc1efc0
crc:246:a2079a00 crc:246:55e2ff40
crc:247:9990e7c0 crc:247:b5e546e0
crc:248:760d1060 crc:248:65d97cc0
crc:249:39fa9dc0 crc:249:33667c20
crc:250:17c00240 crc:250:c33610c0
crc:251:bed960a0 crc:251:c830260
crc:252:33f3d020 crc:252:419e06a0
crc:253:1ca25ac0 crc:253:32d618e0
crc:254:ec072660 crc:254:452724a0
crc:255:186cf880 crc:255:6144fb60
crc:256:e8f6ba80 crc:256:82129760
crc:257:36d3c8c0 crc:257:624ca00
crc:258:a91f9280 crc:258:35c52380
crc:259:1e79a780 crc:259:91b1c9e0
crc:260:98059f00 crc:260:c22ffb00
crc:261:f153ffa0 crc:261:6c8b2380
crc:262:5e074420 crc:262:83b17520
crc:263:220d6b20 crc:263:ad685700
crc:264:ad4479a0 crc:264:3b7f01e0
crc:265:8c4ecac0 crc:265:ddae2920
crc:266:28e1c760 crc:266:56d2f480
crc:267:12d37d60 crc:267:52561140
crc:268:a60fc3a0 crc:268:cb0206e0
crc:269:8c9e0d20 crc:269:511bcc40
crc:270:6f6a04c0 crc:270:f22f2040
crc:271:a5782ae0 crc:271:f8415980
crc:272:c45ffce0 crc:272:87b62440
crc:273:ffb662c0 crc:273:cf5feda0
crc:274:40b6f120 crc:274:44f10300
crc:275:18546f40 crc:275:9ab46c00
crc:276:ec7aa0e0 crc:276:26339cc0
crc:277:38422a60 crc:277:6a94d6e0
crc:278:752406c0 crc:278:cc4774e0
crc:279:471f62a0 crc:279:7d9da980
crc:280:f9ea0580 crc:280:bba52380
crc:281:9b258060 crc:281:dfd99e20
crc:282:17a9dc80 crc:282:a18a3be0
crc:283:baee4380 crc:283:25cc7840
crc:284:6d8be900 crc:284:52875fe0
crc:285:6c07cec0 crc:285:5ca6b580
crc:286:3eeb4760 crc:286:f5b2dbc0
crc:287:d44fda0 crc:287:2a512520
crc:288:41a6c900 crc:288:6d9557a0
crc:289:c0935040 crc:289:31d6ab00
crc:290:968816e0 crc:290:45d1bdc0
crc:291:61023220 crc:291:931afe0
crc:292:a1180480 crc:292:4956f80
crc:293:e4b4f6a0 crc:293:17557a60
crc:294:ffd20a00 crc:294:46a0db20
crc:295:ddca1a00 crc:295:134ce480
crc:296:29449f00 crc:296:ae6ac380
crc:297:c6743ea0 crc:297:31cfd300
crc:298:1883f640 crc:298:539cb280
crc:299:601529e0 crc:299:9b1547e0
crc:300:b7e45a20 crc:300:6c082d00
crc:301:d939a6c0 crc:301:eab2eba0
crc:302:c1ae36e0 crc:302:b44d27c0
crc:303:b7579e20 crc:303:69f1cac0
crc:304:b09f5880 crc:304:7e816160
crc:305:8d035540 crc:305:9cd3b2e0
crc:306:cc844f40 crc:306:a1631f40
crc:307:98a20700 crc:307:6c133be0
crc:308:3bc23ac0 crc:308:2692fb40
crc:309:44af7180 crc:309:ae27c8c0
crc:310:2d005620 crc:310:d6e17760
crc:311:f29b9d80 crc:311:74603e00
crc:312:6916ae40 crc:312:89a43720
crc:313:482f96c0 crc:313:209a9640
crc:314:47e0d160 crc:314:5a50e320
crc:315:6d1f5a00 crc:315:b8a38b00
crc:316:7ee8a480 crc:316:59df3b20
crc:317:afa4d560 crc:317:29976080
crc:318:e9350040 crc:318:a13b40
crc:319:6c875480 crc:319:e3f67840
crc:320:2f5ae3c0 crc:320:6432c580
crc:321:7c32b6e0 crc:321:ce493240
crc:322:263f1320 crc:322:95cc1d60
crc:323:59e36c60 crc:323:63376c60
crc:324:b6dd64e0 crc:324:b6423300
crc:325:5d8e16e0 crc:325:4a8a9e00
crc:326:b4be9860 crc:326:c5534cc0
crc:327:9b58d6e0 crc:327:f6ec3a60
crc:328:fbd55c80 crc:328:8caea3c0
crc:329:9ea6b5c0 crc:329:f08f320
crc:330:7100f400 crc:330:e182be40
crc:331:445eafc0 crc:331:ec69dc80
crc:332:35be09e0 crc:332:7e6b1920
crc:333:4b27a000 crc:333:3df7d140
crc:334:2b125bc0 crc:334:86a4e4c0
crc:335:f90ec5a0 crc:335:dd6ece00
crc:336:53a034a0 crc:336:4f48d400
crc:337:8ed61ec0 crc:337:ba3330e0
crc:338:efad3c00 crc:338:a4a77c60
crc:339:370ba720 crc:339:d09c1940
crc:340:88cc59a0 crc:340:df604a40
crc:341:8a5ca260 crc:341:9cf03c60
crc:342:29b5be20 crc:342:53734700
crc:343:11fe0a20 crc:343:16918640
crc:344:4ff30260 crc:344:cecfd140
crc:345:89c42000 crc:345:58b8cea0
crc:346:b2eef280 crc:346:f5734e0
crc:347:4987a780 crc:347:46297f00
crc:348:6ad18aa0 crc:348:d2b23500
crc:349:d7dfed00 crc:349:ce11b700
crc:350:c6e09500 crc:350:85fa24c0
crc:351:3aed0300 crc:351:cf4042c0
crc:352:83259cc0 crc:352:16714d60
crc:353:54b81720 crc:353:78ba1c80
crc:354:9c3a8260 crc:354:4ff1efc0
crc:355:5c4e7420 crc:355:8c64ffa0
crc:356:218c2800 crc:356:15d592c0
crc:357:bcf198a0 crc:357:152132a0
crc:358:c453f140 crc:358:ccc7a840
crc:359:c3a6ef60 crc:359:b70ab0e0
crc:360:a36cfe80 crc:360:5858b5e0
crc:361:66655000 crc:361:7b728e00
crc:362:52957360 crc:362:dfd8d360
crc:363:69af65c0 crc:363:71f68f40
crc:364:a02c8f40 crc:364:63aff720
crc:365:f9a1c920 crc:365:dcb28340
crc:366:56b66720 crc:366:b6b35380
crc:367:88c326a0 crc:367:3034b2c0
crc:368:83de9f80 crc:368:4f036760
crc:369:b041e720 crc:369:e60afb20
crc:370:50e5b560 crc:370:dd6253e0
crc:371:be9ef5e0 crc:371:2293cae0
crc:372:63da24e0 crc:372:1057bc60
crc:373:10b272c0 crc:373:4a818f80
crc:374:3b32a680 crc:374:36cc540
crc:375:bae000 crc:375:a0def0e0
crc:376:b19c8280 crc:376:347c00a0
crc:377:495e8160 crc:377:33e23540
crc:378:43590a0 crc:378:96a91740
crc:379:8c092de0 crc:379:e16722c0
crc:380:a75c9080 crc:380:a7d6f6c0
crc:381:1c745860 crc:381:909a3480
crc:382:186ecee0 crc:382:5dc28220
crc:383:f49045c0 crc:383:1af0cb20
crc:384:953ffdc0 crc:384:41663ae0
crc:385:ebaa3560 crc:385:abb4f100
crc:386:b2378680 crc:386:ae9c1d20
crc:387:57417460 crc:387:17759380
crc:388:4cf7eb20 crc:388:321b400
crc:389:66339f60 crc:389:dd503a20
crc:390:cac5d1a0 crc:390:5e7758a0
crc:391:f4cc3440 crc:391:d9202660
crc:392:6280e620 crc:392:e1568a20
crc:393:c45d9a0 crc:393:efef0a80
crc:394:9c6fe4e0 crc:394:dc8dd520
crc:395:1ebaf2c0 crc:395:b4f46c80
crc:396:d8da48c0 crc:396:134e6980
crc:397:b88b2540 crc:397:aae69380
crc:398:b3a3b2a0 crc:398:4b9ff420
crc:399:1acf2ac0 crc:399:bf8ead20
crc:400:3657b040 crc:400:36632180
crc:401:ffa3b9e0 crc:401:be5b4c20
crc:402:67462620 crc:402:3faa5c60
crc:403:a762aca0 crc:403:b91f3f80
crc:404:e760a9c0 crc:404:934427c0
crc:405:fb5e14e0 crc:405:d0475620
crc:406:1462e540 crc:406:f18f1dc0
crc:407:d43a1500 crc:407:966fdc20
crc:408:465bbe0 crc:408:94a66060
crc:409:46a1ac60 crc:409:9606e140
crc:410:9b639880 crc:410:aaa47720
crc:411:a8b33b20 crc:411:436288c0
crc:412:6fc21c40 crc:412:86cddd40
crc:413:74f886a0 crc:413:739a4e0
crc:414:8f568980 crc:414:e1040560
crc:415:5e0ba1e0 crc:415:cb96ec20
PageCNT:416remain:256file_sumcheck:5e0ba1e0 i:416 PageCNT:416remain:256file_sumcheck:cb96ec20 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_CB96EC20_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_CB96EC20.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_CB96EC20_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>
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 Aug 18 11:24:13 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.
Binary file not shown.

Some files were not shown because too many files have changed in this diff Show More