一、目的
已知客户问题:基于 SSDK3.0 使用 sleep_gpio_wakeup demo 可以正常休眠唤醒,将 sleep_gpio_wakeup demo 中休眠唤醒相关的代码移植到 XIP 的 sf demo 工程中,可以休眠但是无法正常唤醒。板卡:E3104。代码:
图 (1)
串口:
图 (2)
要做什么:将 sleep_gpio_wakeup 中休眠唤醒相关代码移植到 XIP 的 sf demo 工程中,并解决问题。
二、过程
过程(板卡:E3210):
1. 跑通 E3210 Sleep_gpio_wakeup demo:
1.1 使用 JLINK 下载镜像到 e3_176_ref 开发板,并启动调试;拨码 1110,选择 flashloader 下载。
1.2 本 Demo 执行完成后,因为芯片进入休眠模式,此时 Jlink 会断开连接,此时不要尝试重新链接;拨码 0000,log 打印 enter sleep。
1.3 拨动 GPIO_A0 拨码开关,产生上升沿脉冲,唤醒芯片;拨码 1000,唤醒成功。
图 (1)
1.4 然后使用 Jlink attach 上芯片, 确认芯片已被唤醒 project->attach to runing targe
图 (2)
udelay.h 放在头文件里;middleware 中加入 udelay.c 文件;路径:D:\Semidrive\train\internaltrain\ssdktrain\ssdktrain\project\E3_RTG3.0\ssdk\middleware\udelay
图 (3)
debug 后一直循环,一直打印 SSDK E3 Sleep gpio wakeup Demo Success!
图 (4)
单步执行,还在死循环里,单次打印 SSDK E3 Sleep gpio wakeup Demo Success。确认芯片已被唤醒。
2. 跑通 xip demo:
2.1 使用 JLINK 连接到开发板,拨码到 0b1110 调试模式启动开发板(或者 0b0000,保证此时 Jlink 可以连接即可。)
2.2 打开 sf XIP 工程,并编译;
2.3 打开 bootloader 工程并切换到 FlashDebug 配置;
0)点击编译,此时 IAR 会把 SFS + bootloader 程序 + sf XIP 程序整体编译为一个 elf 文件;路径:D:\Semidrive\train\internaltrain\ssdktrain\ssdktrain\project\E3_3.0\ssdk\boards\e3_176_ref\app_demo\xip\bootloader\IAR\FlashDebug\Exe
1)点击 Erase memory 先擦除 flash(推荐但非必须)
2)点击 Download active application 按钮,IAR flashloader 下载上述 elf 到 flash 中
图 (5)
3)以 0b0000 模式启动开发板,UART 打印输出;
SSDK E3 Bootloader Success!
SSDK E3 XIP Demo, SF Boot Success;
图 (6)
2.4 将bootloade r工程切换到 Debug 配置,点击 Download and Debug 按钮,即可对 bootloader 工程进行调试(此时由于没有配置 flashloader, download and Debug 仅下载 bootloader 程序至 iram)
2.5 在 bootloade r程序启动 sf 之后, 打开 sf 的 XIP 程序
选择 Attach to Running Target, attach 到 sf 的 XIP 程序进行调试;此步后移植代码;
图 (7)
反复启动,串口打印如图。
2.6 如果需要修改 sf 的 XIP 程序,可以直接使用 debug and download 进行下载调试。移植代码的过程即修改到 sf 的 XIP 程序,修改后直接使用 debug and download 下载调试。
3. 移植E3210 Sleep_gpio_wakeup demo 的休眠唤醒代码到 xip 的 sf demo:
xip sf 重新移植代码后 down and debug,此时拨码仍是 0000,在 flash 中启动,已经 attach 到 sf 的 xip 程序;
图 (8)
逐句移植;加入调用到的头文件;头文件相关见附件(1);将 power_cfg.c 与 pinmux_cfg.c 重新配置,并加入到 IDE boards 文件下;根据错误提示,将 IDE drives 加入和 sleep_sleep_gpio_wakeup 一样的 source 文件:
Add sdrv_power.c 40个错误;
Add sdrv_power_core_context.c 37个错误;
Add sdrv_pmu.c 19 个错误;
Add sdrv_scr.c 19 个错误;
Add sdrv_smc.c 无错误;
图 (9)
此时 down and debug 后无错误,进入 debug,点击 run,串口打印进入睡眠;
图 (10)
使 GPIO_A0 上升沿脉冲,没有唤醒成功,串口保持原样。复现问题。完整 sf 代码见附件(2)。
4. 解决问题
将原厂释放的 E3-SSDK-PTG3.0-NewFeature-6753543-Hibernate 进行解压缩,我们来大致了解一下此 patch 中的相关思路:
- E3104/E3106/E3205/E3206 XIP 模式支持 Hibernate 睡眠唤醒。
2)上述四款芯片在 sf 下电时会将 XSPI 模块(Flash 控制器)同时下电,而 XIP 模式运行依赖 XSPI。因此需要把睡眠唤醒后的初始化相关代码放到 IRAM 里,XSPI 重新初始化完成后,再 XIP运行。
4.1 将 patch 中 new 文件夹中的文件覆盖 E3_SSDK_PTG3.0/ssdk 对应的路径,通过 IAR 编译。
patch 内提供了 e3_176_ref/app_demo/power-xip (E3104/E3106/E3106)和 e3_144_ref/app_demo/power-xip(E3205)两个board的demo,测试这两个 demo 运行正常即可,运行方法参考 demo 目录下的 readme.txt。我们来观察一下 “new”文件夹中的
内容:
图 (11)
boards->
图 (12)
devices->
图 (13)
remap->
图 (14)
依次替换至 ssdk3.0;注意 power-xip 要更改名称为 xip。
5. 证明问题已解决:
5.1 使用 JLINK 连接到开发板,拨码到 0b1110 调试模式启动开发板(或者 0b0000,保证此时 Jlink 可以连接即可);
5.2 打开 bootloader 工程,使用 Debug 配置进行编译;
5.3 打开 wakeuploader 工程,使用 Debug 配置进行编译;
5.4、 打开 sf 工程,使用 FlashDebug 配置进行编译
0)点击编译,此时 IAR 会把 SFS + bootloader + sf + wakeuploader 整体编译为一个 elf 文件;
1)点击 Erase memory 先擦除 flash(推荐但非必须);
2)点击 Download active application 按钮,IAR flashloader 下载上述 elf 到 flash 中;
3)以 0b0000 模式启动开发板,UART 打印输出;
SSDK E3 Bootloader Success!
然后执行 APP 程序,立刻进入休眠
4)拨动 BOOT_PIN1 (GPIO_A0) 唤醒,UART 打印输出:
SSDK E3 Hib gpio wakeup Demo Success!
图 (15)
图 (16)
附件:
头文件相关附件(1): power_cfg.h:
图 (17)
power_cfg.c:
图 (18)
pinmux_cfg.h:
图 (19)
图 (20)
完整 sf 代码附件(2):
图 (21)
三、 参考资料:
《SemiDrive_E3_SSDK_User_Guide_Rev01.04》
《AppNote_E3_Boot_and_OTA_Rev01.06》
欢迎在博文下方留言评论,我们会及时回复您的问题。如有更多需求,欢迎联系大联大世平集团 ATU 部门:atu.sh@wpi-group.com
作者:Rita Liu / 刘倩
评论