【AT32】 at32 软复位
AT32 芯片软重启函数实现方法
1. 标准库函数实现
AT32 系列芯片(如 AT32F421、AT32F403A/407 等)的软重启可通过 NVIC 系统复位函数实现,该函数已集成在雅特力官方提供的 BSP 库中。
核心代码示例:
#include "at32f421.h" // 根据具体芯片型号包含头文件void System_SoftReset(void) {nvic_system_reset(); // 直接调用库函数
}
功能:此函数通过触发 Cortex-M4 内核的 SYSRESETREQ 标志位实现系统复位,复位所有外设(除备份域寄存器)。
底层原理:内部调用 NVIC_SystemReset(),其本质是操作内核寄存器 SCB->AIRCR,组合写入 0x05FA0000 | 0x04 以触发复位。
2. 增强型安全复位
为避免复位过程中中断干扰,建议先关闭全局中断:
void Safe_SoftReset(void) {__disable_irq(); // 关闭所有中断nvic_system_reset(); // 执行复位
}
适用场景:在关键任务或通信协议(如 IAP 升级)中,防止复位时中断残留导致异常。
AT32 芯片软重启函数实现方法
1. 标准库函数实现
AT32 系列芯片(如 AT32F421、AT32F403A/407 等)的软重启可通过 NVIC 系统复位函数实现,该函数已集成在雅特力官方提供的 BSP 库中。
核心代码示例:
#include "at32f421.h" // 根据具体芯片型号包含头文件void System_SoftReset(void) {nvic_system_reset(); // 直接调用库函数
}
功能:此函数通过触发 Cortex-M4 内核的 SYSRESETREQ 标志位实现系统复位,复位所有外设(除备份域寄存器)。
底层原理:内部调用 NVIC_SystemReset(),其本质是操作内核寄存器 SCB->AIRCR,组合写入 0x05FA0000 | 0x04 以触发复位。
2. 增强型安全复位
为避免复位过程中中断干扰,建议先关闭全局中断:
void Safe_SoftReset(void) {__disable_irq(); // 关闭所有中断nvic_system_reset(); // 执行复位
}
适用场景:在关键任务或通信协议(如 IAP 升级)中,防止复位时中断残留导致异常。
3. 注意事项
地址偏移与向量表:
若程序涉及多区启动(如 Bootloader + App),需在 App 中设置中断向量表偏移(NVIC_SetVectorTable),否则复位后可能跳转错误。
示例代码:
NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x4000); // 偏移 0x4000(AT32F421 的典型 App 起始地址)
看门狗与复位的区别:
看门狗复位:需配置独立看门狗(IWDG)或窗口看门狗(WWDG),适用于防程序跑飞。
软件复位:立即触发,无需等待超时,适合主动控制场景。
4. 跨型号兼容性
芯片型号 | 复位函数 | 头文件依赖 |
---|---|---|
AT32F421 系列 | nvic_system_reset() | at32f421_misc.c |
AT32F403A/407 系列 | NVIC_SystemReset() | core_cm4.h(CMSIS 标准) |
AT32F413 系列 | 同 AT32F403A(寄存器兼容) | 参考对应 BSP 库 |