微信公众号 | strongerHuang
如果你从,e2 studio V5.x版本升级到 V6.x版本,自动生成工程的时候,会发现在 src 文件夹下多出来一个 hal_warmstart.c 源代码文件:
那么,多出来的hal_warmstart.c 是什么文件?
一、文件来源与背景
warmstart翻译过来的意思就是:热启动。
e² studio或者FSP(灵活配置软件包)在V6.0版本之前,hal_entry.c源代码文件下有这么一个函数:R_BSP_WarmStart()
而从V6.0版本开始,官方就将其拆分出来了,因此,hal_warmstart.c就作为系统启动初始化的专用文件了,与 hal_entry.c 并列在 src/ 目录下。
src/
├── hal_entry.c # 应用入口(main → hal_entry)
└── hal_warmstart.c # 新增:启动初始化回调
二、它的核心作用:R_BSP_WarmStart() 回调
这个函数是 BSP 启动过程的 “钩子”,会在三个关键阶段被调用,用于用户自定义底层初始化(时钟、Flash、GPIO 等):
void R_BSP_WarmStart(bsp_warm_start_event_t event)
{
// 1. 复位后、时钟初始化前(最早时机)
if (BSP_WARM_START_RESET == event)
{
// 例:开启数据Flash访问
R_FACI_LP->DFLCTL = 1U;
}
// 2. 时钟初始化后、C运行库初始化前
if (BSP_WARM_START_POST_CLOCK == event)
{
// 可配置需在时钟就绪后执行的外设
}
// 3. C运行库/系统时钟/引脚全部初始化后(main() 之前)
if (BSP_WARM_START_POST_C == event)
{
// 例:打开GPIO端口(旧版常放这里)
R_IOPORT_Open(&g_ioport_ctrl, g_ioport.p_cfg);
}
}
三、为什么拆分?
1、职责分离:
hal_warmstart.c:只做系统启动阶段的底层初始化(时钟、Flash、引脚等)。
hal_entry.c:只放应用入口 hal_entry() 和业务逻辑。
2、便于维护:启动相关代码集中,不与应用代码混杂。
3、弱函数机制:R_BSP_WarmStart() 是 weak 定义,用户可直接在该文件修改,覆盖 BSP 默认实现。
最后,默认生成的代码已适配芯片,一般无需修改。
若需在时钟前 / 后、main 前做特殊配置(如特殊引脚、电源、Flash 操作),直接在 hal_warmstart.c 的 R_BSP_WarmStart() 中添加即可。
437