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_ch2_index = r_data[23];
flash_ch1_state=0;
flash_ch1_state=r_data[24];
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;
}
@@ -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,65 +1,191 @@
#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;
#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 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)
{
GPIO_InitCfg_t GPIO_InitCfg = { 0 };
GPIO_InitCfg_t GPIO_InitCfg = { 0 }; // 清零初始化配置结构体
GPIO_InitCfg.Mux = GPIO_Mux0; // 选择功能复用器0
GPIO_InitCfg.FunSel = GPIO_Dx; // 选择GPIO功能(非特殊功能)
GPIO_InitCfg.Pull = GPIO_PULLUP; //上拉电阻使能
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);
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
/*
* GPIO1 下降沿中断
*/
xc_gpio_it_config(GPIO_1, FAIL_EDGE_INT);
xc_gpio_it_config(GPIO_19,FAIL_EDGE_INT);
NVIC_EnableIRQ(GPIO_IRQn);
//判断首次上电开关状态
/*
* 上电时检测 GPIO1 初始状态
*/
if(xc_gpio_read_pin(SWITCH_S1_PIN) == 0)
{
S1_first_on_state = 1;
@@ -68,60 +194,67 @@ void switch_init(void)
{
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)
{
/*
* ========================================================
* 上电时 GPIO1 已经按下
* ========================================================
*/
if(S1_first_on_state == 1)
{
S1_first_on_state = 0;
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)
{
case DB_IDLE: //空闲状态
break;
case DB_PRESS_DEBOUNCE: //按下防抖
if(s1_debounce_cnt>0) s1_debounce_cnt--;
if(s1_debounce_cnt==0)
{
//防抖时间到,采样当前电平是否是低电平
case DB_IDLE:
/*
* 空闲状态低电平补检,防止漏中断。
*/
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)
{
trig1_cnt = 1;
@@ -134,137 +267,168 @@ void trigger_check_process(void)
{
trig1_cnt++;
}
else
{
/*
* 如果等待标志还在,但超时已经为 0,
* 说明旧状态异常,重新作为第一次点击。
*/
trig1_cnt = 1;
}
trig1_timeout = TRIGGER_TIMEOUT_MS;
//
}
}
else
{
// 杂波导致误触,回到空闲
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++;
}
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)
{
s1_state = DB_RELEASE_DEBOUNCE;
s1_debounce_cnt = DEBOUNCE_MS; // 释放30ms防抖
s1_debounce_cnt = DEBOUNCE_MS;
}
break;
case DB_RELEASE_DEBOUNCE: //释放防抖
if(s1_debounce_cnt > 0) s1_debounce_cnt--;
if(s1_debounce_cnt == 0)
case DB_RELEASE_DEBOUNCE:
if(s1_debounce_cnt > 0)
{
if(xc_gpio_read_pin(SWITCH_S1_PIN) == 1) // 确认释放
{
s1_state = DB_IDLE; // 回到空闲
trig1_timeout = TRIGGER_TIMEOUT_MS;
switch1_RELEASE_flag=1;
if(s1_first_press_flag==1)
{
s1_first_press_flag=2;
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
{
// 再等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;
}
//
// 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--;
@@ -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);
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();
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;
}
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;
switch_s1_clear_action_state();
}
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;
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();
// }
/*
* 普通不回弹开关释放后关闭 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的中断
/*
* 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_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 超时
// trigger_check_process() 实际调用周期,单位 ms
#define SWITCH_SCAN_PERIOD_MS 10
// 连击超时时间:20 * 10ms = 200ms
#define TRIGGER_TIMEOUT_MS 20
// 连续触发次数
// 连续触发次数,达到 5 次进入对码
#define TRIGGER_CONTINUE_CNT 5
#define SWITCH_S1_PIN GPIO_1
#define SWITCH_S2_PIN GPIO_19
// 回弹开关判断时间: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>
@@ -29,6 +29,7 @@ Project File Date: 07/21/2026
Rebuild target 'ble-sdk-xip'
assembling startup_xinc.s...
compiling system_xinc.c...
compiling aes.c...
compiling sleep.c...
compiling app_batt.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
static uint8_t ble_state_last_ch1_count = 0;
..\app\src\usr_server.c: 1 warning, 0 errors
compiling aes.c...
compiling app_task.c...
compiling nvds.c...
compiling app_task.c...
compiling xc_drv_adc.c...
compiling xc_drv_aotimer.c...
compiling xc_gap_api.c...
compiling xc_drv_bor.c...
compiling xc_gatt_client_api.c...
compiling xc_gap_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_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_rtc.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_systick.c...
compiling xc_drv_timer.c...
compiling xc_drv_uart_dma.c...
compiling xc_drv_uart.c...
compiling timer.c...
compiling xc_drv_wdt.c...
compiling switch_s.c...
compiling timer.c...
compiling fmc_spi_1.c...
compiling key.c...
compiling led.c...
compiling timeslice.c...
compiling uart_1.c...
compiling timeslice.c...
compiling switch_s.c...
compiling key.c...
compiling rf433.c...
..\app\src\rf433.c(116): warning: #177-D: function "set_click" was declared but never referenced
static void set_click(void)
..\app\src\rf433.c: 1 warning, 0 errors
compiling rf433_decoder.c...
compiling led.c...
compiling ota_flash_interface.c...
compiling rf433_decoder.c...
compiling ota_server.c...
compiling ota_protocol.c...
..\app\src\ota_protocol.c(149): warning: #550-D: variable "sw_ver" was set but never used
uint16_t sw_ver;
..\app\src\ota_protocol.c(150): warning: #550-D: variable "rom_ver" was set but never used
uint16_t rom_ver;
..\app\src\ota_protocol.c: 2 warnings, 0 errors
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=28440 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: 30352 bytes.
all_size=30352
size:30352 PageCNT119
dual_xip
length:30472
size:30472
length:30728
size:30728
Addr:12000
Size:0x7600
Size:0x7700
BAddr:0x12000
Acheck:0x741cdb80
Acheck:0xf3ee5b20
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: 30352 bytes.
all_size=30352
size:30352 PageCNT119
dual_xip
length:30472
size:30472
length:30728
size:30728
Addr:12000
Size:0x7600
Size:0x7700
BAddr:0x1e000
Acheck:0x741cdb80
Acheck:0xf3ee5b20
SoftVer:0x10
RomVer:0x20
LoadAddr:0x11012000
@@ -155,11 +155,11 @@ is_db=1
is_th=0
需要填充0个sector
all_size:1a000
size: 30180
size: 30352
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:a31fcaa0
crc:31:a9410300
crc:32:2d51c2c0
crc:33:19efa7a0
crc:34:3e831760
crc:35:ab1dd900
crc:36:efc872c0
crc:37:9d51d1c0
crc:38:613f6ce0
crc:39:7b8943e0
crc:40:da673840
crc:41:9cbbb7c0
crc:42:11d72520
crc:43:39067680
crc:44:7226f460
crc:45:11ff9980
crc:46:7808a320
crc:47:6c1cdcc0
crc:48:3abe080
crc:49:ac944ac0
crc:50:e633c580
crc:51:7f39eb40
crc:52:bcb099a0
crc:53:20b1e2e0
crc:54:5eb02d80
crc:55:d9860080
crc:56:b2091060
crc:57:d85b9a60
crc:58:58f5be0
crc:59:1ab21ee0
crc:60:c7dca740
crc:61:3f36200
crc:62:aeb8e520
crc:63:64e9a960
crc:64:f2572a80
crc:65:5ede0b20
crc:66:45848640
crc:67:e3be7940
crc:68:d1e0c7c0
crc:69:1e221860
crc:70:a20c58a0
crc:71:1d888ac0
crc:72:2a155100
crc:73:dde84280
crc:74:4113c200
crc:75:a089b460
crc:76:21725a80
crc:77:4bea96e0
crc:78:ad5865e0
crc:79:9f7979e0
crc:80:d0651de0
crc:81:a8b61260
crc:82:7a481420
crc:83:f40765c0
crc:84:196081a0
crc:85:a0ee1700
crc:86:b97d91c0
crc:87:74774de0
crc:88:6380bc40
crc:89:56aff140
crc:90:37c8e540
crc:91:f63e2b00
crc:92:8e9a79e0
crc:93:dcbfce60
crc:94:851e3360
crc:95:e8978b20
crc:96:f78e9020
crc:97:403a7600
crc:98:ab8c33a0
crc:99:47376780
crc:100:f0eaeb80
crc:101:3b298400
crc:102:aaf73bc0
crc:103:d09b0e40
crc:104:6d5a7600
crc:105:4d2cd360
crc:106:bc25f520
crc:107:d20d62c0
crc:108:a5297900
crc:109:6363d940
crc:110:e1d9dd20
crc:111:2c765c60
crc:112:95b21580
crc:113:2fb09080
crc:114:3e2ac80
crc:115:4adab660
crc:116:5a3cbb60
crc:117:26b4c7a0
crc:118:2aff6f80
crc:119:e2664520
crc:120:ca89b920
crc:121:5261a20
crc:122:bb74f2e0
crc:123:a32bdba0
crc:124:ee8b8f20
crc:125:89f29d60
crc:126:53955600
crc:127:d762b000
crc:128:527c1aa0
crc:129:c602d00
crc:130:695af8c0
crc:131:c338fa20
crc:132:5bfeec20
crc:133:e56311a0
crc:134:881292a0
crc:135:2a854aa0
crc:136:eeac4a00
crc:137:1f53bfa0
crc:138:e7fed2c0
crc:139:2d544160
crc:140:b40e9800
crc:141:3dfe49a0
crc:142:55298800
crc:143:d6b70c00
crc:144:e10da4c0
crc:145:8c33a4e0
crc:146:bda2cde0
crc:147:64e7ba60
crc:148:ba9b2660
crc:149:e63ee5c0
crc:150:b31d0380
crc:151:6b6d85e0
crc:152:487c2080
crc:153:975ebb00
crc:154:8c72e4a0
crc:155:a1c06f60
crc:156:13135200
crc:157:59b9c220
crc:158:157ab660
crc:159:630a8f60
crc:160:f2308dc0
crc:161:45249500
crc:162:b8398d80
crc:163:a6563c60
crc:164:18785220
crc:165:ec58ca00
crc:166:67635460
crc:167:8ec282e0
crc:168:ecbebf40
crc:169:805a8bc0
crc:170:728a35e0
crc:171:b6bdb620
crc:172:9d8c64c0
crc:173:5878a0e0
crc:174:fcdddca0
crc:175:74980720
crc:176:8d3fc620
crc:177:2ce3fbc0
crc:178:a2aa7bc0
crc:179:6cd38d60
crc:180:6dd7d600
crc:181:47f125a0
crc:182:65a85fc0
crc:183:35d19800
crc:184:960db1a0
crc:185:d606e800
crc:186:cf7bf980
crc:187:79e646a0
crc:188:860b83c0
crc:189:bb475ae0
crc:190:e8970d60
crc:191:6e0c95e0
crc:192:65042400
crc:193:31fb660
crc:194:81da6cc0
crc:195:f4ad0ac0
crc:196:df739100
crc:197:615c1760
crc:198:bae19140
crc:199:e0073b00
crc:200:db9e1920
crc:201:76729aa0
crc:202:c076fc60
crc:203:d2a77560
crc:204:98fe9f00
crc:205:a438c720
crc:206:3fbdde80
crc:207:bf39ab80
crc:208:41ba7280
crc:209:e58c580
crc:210:939551e0
crc:211:5d193b80
crc:212:3dc7bfc0
crc:213:eeef5980
crc:214:39e18340
crc:215:56a4f920
crc:216:1fc14c60
crc:217:4deda880
crc:218:f9b18220
crc:219:596f0b20
crc:220:be6f0de0
crc:221:1ec7bc0
crc:222:8c7c5880
crc:223:e7aa8de0
crc:224:3396baa0
crc:225:c295ef40
crc:226:fd9a4300
crc:227:558621c0
crc:228:9a187620
crc:229:43deb0c0
crc:230:9ddab820
crc:231:47607e0
crc:232:2e8e6e00
crc:233:8a9bce80
crc:234:6fadeee0
crc:235:65200ca0
crc:236:1a6396e0
crc:237:6396bec0
crc:238:a2c060
crc:239:4476a3a0
crc:240:87a0f180
crc:241:1b4b0c0
crc:242:454aa6a0
crc:243:a9aaf6c0
crc:244:1e111260
crc:245:9dc1efc0
crc:246:55e2ff40
crc:247:b5e546e0
crc:248:65d97cc0
crc:249:33667c20
crc:250:c33610c0
crc:251:c830260
crc:252:419e06a0
crc:253:32d618e0
crc:254:452724a0
crc:255:6144fb60
crc:256:82129760
crc:257:624ca00
crc:258:35c52380
crc:259:91b1c9e0
crc:260:c22ffb00
crc:261:6c8b2380
crc:262:83b17520
crc:263:ad685700
crc:264:3b7f01e0
crc:265:ddae2920
crc:266:56d2f480
crc:267:52561140
crc:268:cb0206e0
crc:269:511bcc40
crc:270:f22f2040
crc:271:f8415980
crc:272:87b62440
crc:273:cf5feda0
crc:274:44f10300
crc:275:9ab46c00
crc:276:26339cc0
crc:277:6a94d6e0
crc:278:cc4774e0
crc:279:7d9da980
crc:280:bba52380
crc:281:dfd99e20
crc:282:a18a3be0
crc:283:25cc7840
crc:284:52875fe0
crc:285:5ca6b580
crc:286:f5b2dbc0
crc:287:2a512520
crc:288:6d9557a0
crc:289:31d6ab00
crc:290:45d1bdc0
crc:291:931afe0
crc:292:4956f80
crc:293:17557a60
crc:294:46a0db20
crc:295:134ce480
crc:296:ae6ac380
crc:297:31cfd300
crc:298:539cb280
crc:299:9b1547e0
crc:300:6c082d00
crc:301:eab2eba0
crc:302:b44d27c0
crc:303:69f1cac0
crc:304:7e816160
crc:305:9cd3b2e0
crc:306:a1631f40
crc:307:6c133be0
crc:308:2692fb40
crc:309:ae27c8c0
crc:310:d6e17760
crc:311:74603e00
crc:312:89a43720
crc:313:209a9640
crc:314:5a50e320
crc:315:b8a38b00
crc:316:59df3b20
crc:317:29976080
crc:318:a13b40
crc:319:e3f67840
crc:320:6432c580
crc:321:ce493240
crc:322:95cc1d60
crc:323:63376c60
crc:324:b6423300
crc:325:4a8a9e00
crc:326:c5534cc0
crc:327:f6ec3a60
crc:328:8caea3c0
crc:329:f08f320
crc:330:e182be40
crc:331:ec69dc80
crc:332:7e6b1920
crc:333:3df7d140
crc:334:86a4e4c0
crc:335:dd6ece00
crc:336:4f48d400
crc:337:ba3330e0
crc:338:a4a77c60
crc:339:d09c1940
crc:340:df604a40
crc:341:9cf03c60
crc:342:53734700
crc:343:16918640
crc:344:cecfd140
crc:345:58b8cea0
crc:346:f5734e0
crc:347:46297f00
crc:348:d2b23500
crc:349:ce11b700
crc:350:85fa24c0
crc:351:cf4042c0
crc:352:16714d60
crc:353:78ba1c80
crc:354:4ff1efc0
crc:355:8c64ffa0
crc:356:15d592c0
crc:357:152132a0
crc:358:ccc7a840
crc:359:b70ab0e0
crc:360:5858b5e0
crc:361:7b728e00
crc:362:dfd8d360
crc:363:71f68f40
crc:364:63aff720
crc:365:dcb28340
crc:366:b6b35380
crc:367:3034b2c0
crc:368:4f036760
crc:369:e60afb20
crc:370:dd6253e0
crc:371:2293cae0
crc:372:1057bc60
crc:373:4a818f80
crc:374:36cc540
crc:375:a0def0e0
crc:376:347c00a0
crc:377:33e23540
crc:378:96a91740
crc:379:e16722c0
crc:380:a7d6f6c0
crc:381:909a3480
crc:382:5dc28220
crc:383:1af0cb20
crc:384:41663ae0
crc:385:abb4f100
crc:386:ae9c1d20
crc:387:17759380
crc:388:321b400
crc:389:dd503a20
crc:390:5e7758a0
crc:391:d9202660
crc:392:e1568a20
crc:393:efef0a80
crc:394:dc8dd520
crc:395:b4f46c80
crc:396:134e6980
crc:397:aae69380
crc:398:4b9ff420
crc:399:bf8ead20
crc:400:36632180
crc:401:be5b4c20
crc:402:3faa5c60
crc:403:b91f3f80
crc:404:934427c0
crc:405:d0475620
crc:406:f18f1dc0
crc:407:966fdc20
crc:408:94a66060
crc:409:9606e140
crc:410:aaa47720
crc:411:436288c0
crc:412:86cddd40
crc:413:739a4e0
crc:414:e1040560
crc:415:cb96ec20
PageCNT:416remain:256file_sumcheck:cb96ec20 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_CB96EC20_1000000.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_CB96EC20_OTA.bin
".\Objects\Xinc_ble_sdk.axf" - 0 Error(s), 7 Warning(s).
<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\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: Tue Aug 18 11:24:13 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.
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