如题在新建工程的时候,如果自己设计的板子rtc 没有外部晶振,软件debug运行在这里就会卡死
cpp
R_RTC->RCR2_b.RESET = 1;
FSP_HARDWARE_REGISTER_WAIT(R_RTC->RCR2_b.RESET, 0);
我隐约感觉到时rtc时钟问题,所以在e2studio 里打开 configuration.xml stacks 添加 timers 添加rtc,就可以跳过这代码。正常运行新建代码。
当然我也咨询ai 如下是ai回复
问题根因先说结论:你这段代码卡死,是因为 RTC 没有时钟源在跑。
R_RTC->RCR2_b.RESET = 1 是一条"软件复位"指令,硬件复位完成后会自动清 0。但 RTC 复位动作必须在 RTC 时钟源工作 的前提下才能完成。RA6M5 的 RTC 时钟源默认选择是副时钟(外部 32.768kHz 晶振) ,如果你没有先使能并等待副时钟稳定(或者板子上根本没焊晶振),RESET 位就永远不会清 0,FSP_HARDWARE_REGISTER_WAIT 是死循环(无超时),于是卡死。
推荐做法:用 FSP 配置,不要手写寄存器
在 e2studio 里打开 configuration.xml,做两处配置:
1. Clocks 页 ------ 开启副时钟振荡器
- Sub-Clock Oscillator (SOSC) → Enabled
- Sub-Clock Oscillator Frequency → 32768
- 驱动能力 Drive Capability 按你的晶振负载选,一般选 Standard
这样生成代码后,system_init 里的 R_CGC_SystemClockSet() 会帮你开副时钟并等待稳定,进 main 时 SOSC 已经跑起来了。
2. Stacks 页 ------ 添加 r_rtc 模块
- Add → Realtime Clock (r_rtc)
- 属性里 Clock Source → Sub Clock(有晶振时)
- Operating Mode → Calendar
- Hour Format → 按需 24 Hour / 12 Hour
- 按需开 Alarm / Periodic 中断
Generate Project Content 后,代码里直接:
c
R_RTC_Open(&g_rtc0_ctrl, &g_rtc0_cfg); // 内部就做了:开副时钟→RESET=1→等清0→配置寄存器
R_RTC_CalendarTimeSet(&g_rtc0_ctrl, ¤t_time);
R_RTC_Start(&g_rtc0_ctrl);
不要再手写 RCR2。FSP 驱动里已经正确实现了完整初始化序列。