This commit is contained in:
edisondeng
2026-07-31 13:57:06 +08:00
parent d8df5d49d3
commit a7a2cc9465
23 changed files with 902 additions and 328 deletions

View File

@@ -7,6 +7,7 @@
#include "system.h"
#include "../Drivers/rf.h"
#include "../Drivers/lcd.h"
#include "../Drivers/timer.h"
/* =========================================================================
* 系统全局变量定义
@@ -193,9 +194,46 @@ void Debug_ProcessCommand(char cmd)
}
}
// ====== 调试用最小化启动开关 ======
// 置 1 时 main() 只做点亮屏幕这一件事RF/自检/数据库/事件框架/Timer1 全部跳过,
// 用于定位"开机反复重启"问题的范围。定位完成后改回 0恢复正常启动流程。
#define DEBUG_MINIMAL_BOOT 1
/* =========================================================================
* 主函数 (入口)
* ========================================================================= */
#if DEBUG_MINIMAL_BOOT
void main(void)
{
// ====== STC32G 特殊功能寄存器内核基础初始化 ======
WTST = 0; // 设置程序 Flash 访问等待时间为 0 (最高速运行)
EAXFR = 1; // 允许访问扩展特殊功能寄存器 (XSFR)
CKCON = 0; // 外部总线时钟设定为最快
WDT_CONTR = 0x00; // 关闭看门狗定时器
// ====== 步骤 A加回 RF_Init() 与 Timer1_Init(),先不打开 RF 接收 ======
GPIO_Init(); // 配置各个引脚的推挽输出/准双向模式及内部上拉 (锁存 PWR_HOLD=1)
RGB_Send(0, 0, 0, 0, 0, 0); // 上电第一时间强制发送 0 码关闭灯条,熄灭上电暂态引起的随机白光
RF_Init(); // 加回来Timer0 常驻自由运行 + P3.6 常态双边沿中断 + 上拉,此时芯片仍 SHUT=1 关闭
Delay_ms(500); // 软启动延时,等待供电电容稳定
LCD_Init(); // 初始化 LHS114TC-IF03 (ST7789V) 屏幕控制寄存器序列并开启背光
Uart1_Init(); // 初始化串口 1 波特率 115200 供调试日志
Uart_SendString("Wristband System Initialized! (DEBUG_MINIMAL_BOOT=1, step A: RF_Init+Timer1_Init)\r\n");
Timer1_Init(); // 全局中断 EA=1 从这里开始生效Timer0 溢出中断与 P3.6 边沿中断真正开始工作
// 注意:已恢复到步骤 A不调用 RF_SetMode(1)RF 芯片保持关闭状态
LCD_ShowStringCentered(100, "STEP A OK", COLOR_WHITE, COLOR_BLACK);
LCD_ShowStringCentered(130, "RF_Init+Timer1", COLOR_GRAY, COLOR_BLACK);
while (1) {
Delay_ms(1);
}
}
#else
void main(void)
{
char cmd;
@@ -268,6 +306,8 @@ void main(void)
}
}
#endif // DEBUG_MINIMAL_BOOT
// 唤醒源事件标志,由对应的外部中断 ISR 写入
volatile u8 p0_wakeup_flag = 0; // P0 端口按键唤醒标志
volatile u8 p2_wakeup_flag = 0; // P2 端口按键唤醒标志
@@ -304,12 +344,15 @@ void Port2_Isr(void) interrupt 15
/**
* @brief Port3 端口掉电中断服务函数 (由 isr_jump.asm 引导定位至此)
* @details 负责处理 P3.6 (新射频数据脚) 在休眠模式下的物理跳变唤醒。
* @details P3.6 (RF_RX_DATA) 双边沿中断现在改为常态开启 (见 RF_Init()),身兼两职:
* 1. 休眠期间作为唤醒源,记录 p3_wakeup_flag 供 Wakeup_Restore() 判定唤醒来源;
* 2. 正常运行期间驱动 RF_HandleEdgeInterrupt() 增量解码 EV1527 信号。
* 不再像旧版那样在首次触发后自行关闭 P3INTE否则第 2 项功能会在第一次边沿后失效。
*/
void Port3_Isr(void) interrupt 16
{
EAXFR = 1; // 使能访问扩展寄存器
p3_wakeup_flag = P3INTF | 0x01;// 读取并备份 P3 中断标志寄存器值 (0x01作安全掩码)
P3INTF = 0x00; // 清除 P3 端口中断悬挂标志位
P3INTE = 0x00; // 立即关闭 P3 中断通道,防止反复重入
RF_HandleEdgeInterrupt(); // 驱动 EV1527 边沿增量解码状态机
}