杰理AD698N/AD697N系列芯片是当前TWS耳机市场的主流方案之一,作为在蓝牙音频领域深耕多年的硬件工程师,我经常需要处理各种芯片复位配置问题。这次要分享的是针对这两款芯片在SDK开发环境下的复位配置全流程,包含从底层寄存器操作到上层应用封装的完整实现方案。
在实际项目中,合理的复位配置直接关系到耳机的稳定性、功耗表现和用户体验。特别是在量产测试环节,可靠的复位机制能显著降低不良率。本文将基于AC79系列SDK V1.6.2版本,详细解析硬件看门狗、软件复位和低功耗模式下的特殊处理方案。
AD698N/AD697N提供6种复位源:
在SDK的hal_reset.h头文件中,通过RESET_SOURCE_REG寄存器可以查询当前复位来源。这对故障诊断尤为重要,建议在系统初始化时优先读取并记录该值:
c复制uint8_t reset_source = READ_REG(RESET_SOURCE_REG);
log_printf("Last reset source: 0x%02X", reset_source);
硬件看门狗是保障系统稳定的最后防线。杰理芯片的看门狗时钟源固定为32kHz低频时钟,通过WDT_CTRL_REG寄存器配置:
c复制#define WDT_TIMEOUT_2S 0x03
#define WDT_TIMEOUT_1S 0x02
#define WDT_TIMEOUT_500MS 0x01
void wdt_init(uint8_t timeout)
{
WRITE_REG(WDT_CTRL_REG, (0x01 << 7) | (timeout & 0x07));
WRITE_REG(WDT_FEED_REG, 0x5A); // 初始喂狗
}
重要提示:在低功耗模式下,看门狗会暂停计数。唤醒后需要重新喂狗,否则可能触发意外复位。
杰理SDK提供了多级复位接口,最常用的是system_reset()函数。但在实际使用中发现其存在两个问题:
改进后的安全复位实现:
c复制void safe_system_reset(uint8_t reason)
{
// 保存复位原因到保留内存区域
*(volatile uint8_t *)(0x2000F000) = reason;
// 关闭中断防止干扰
__disable_irq();
// 硬件复位
WRITE_REG(SYS_CTRL_REG, 0x1 << 3);
// 确保复位执行
while(1);
}
在深度睡眠(DEEP SLEEP)模式下,常规复位可能无法唤醒芯片。需要通过RTC唤醒引脚配合复位:
c复制rtc_set_wakeup_interval(500); // 500ms
c复制pmu_set_wakeup_source(WAKEUP_SRC_RTC);
c复制void lowpower_reset(void)
{
rtc_force_wakeup(); // 强制唤醒
delay_ms(10); // 等待稳定
system_reset();
}
在量产测试中,我们开发了基于UART指令的复位控制协议:
code复制AT+RESET=WDT\n
c复制void uart_cmd_handler(char *cmd)
{
if(strstr(cmd, "AT+RESET=WDT")) {
wdt_force_reset();
}
}
通过实测得到的复位时序参数:
| 复位类型 | 最小时间(ms) | 典型时间(ms) |
|---|---|---|
| 冷启动 | 120 | 150 |
| 看门狗 | 85 | 100 |
| 软件复位 | 70 | 90 |
在编写测试脚本时,建议按典型时间的1.5倍设置等待超时。
现象:复位后某些GPIO输出异常高电平
解决方法:在复位初始化代码中添加IO状态恢复:
c复制void io_state_recovery(void)
{
for(int i=0; i<GPIO_NUM; i++) {
gpio_set_pull(i, GPIO_PULL_DOWN);
gpio_set_direction(i, GPIO_INPUT);
}
}
排查步骤:
典型原因:
诊断方法:
c复制void check_wakeup_source(void)
{
uint8_t src = pmu_get_wakeup_source();
log_printf("Wakeup by: %s",
src == WAKEUP_SRC_RTC ? "RTC" :
src == WAKEUP_SRC_PIN ? "PIN" : "UNKNOWN");
}
在保留内存区域实现环形缓冲区记录复位事件:
c复制#define RESET_LOG_SIZE 8
typedef struct {
uint32_t timestamp;
uint8_t reason;
uint16_t extra;
} reset_log_t;
reset_log_t reset_log[RESET_LOG_SIZE];
uint8_t log_index = 0;
void record_reset(uint8_t reason)
{
reset_log[log_index].timestamp = rtc_get_counter();
reset_log[log_index].reason = reason;
log_index = (log_index + 1) % RESET_LOG_SIZE;
}
在使用JLINK调试时,需要特别注意:
c复制if(jtag_is_connected()) {
wdt_disable();
}
c复制WRITE_REG(DBG_HOLD_REG, 0x1);
system_reset();
经过多个量产项目验证,这套复位方案可将TWS耳机的异常复位率控制在0.3%以下。特别是在处理蓝牙连接不稳定时的自动恢复场景,合理的看门狗超时设置(建议1.5-2秒)能显著提升用户体验。