IAR Embedded Workbench把程序写入目标芯片后,CPU下一步是停在复位入口、运行到main暂停,还是脱离调试器后自行启动,和C-SPY的下载方式、Run to配置以及硬件调试驱动的复位策略都有关系。程序能够正常编译和写入Flash,却在下载后一直停着,先别急着改启动代码,可以先确认当前执行的是下载还是调试启动,再检查复位后的PC、SP和程序入口。
一、IAR怎么设置下载与复位方式
IAR的下载和复位配置主要集中在【Debugger】选项中。I-jet、J-Link、CMSIS-DAP等驱动提供的复位项目并不完全相同,设置时应以当前工程实际选择的调试驱动为准。
1、配置Flash下载方式
①打开IAR工程,进入【Project】→【Options】。
②打开【General Options】→【Target】,确认【Device】与目标板上的芯片型号对应。
③切换到【Debugger】→【Setup】。
④在【Driver】中选择当前使用的调试器,例如【I-jet】【J-Link/J-Trace】或【CMSIS-DAP】。
⑤进入【Debugger】→【Download】。
⑥程序需要写入片内Flash时,勾选【Use flash loader(s)】。
⑦打开【Flash Loader Overview】,检查当前使用的Flash Loader和目标存储区域。
⑧项目没有特殊Flash布局时,可以继续使用器件默认的.board配置。
⑨程序放在自定义Flash区域时,再进入【Flash Loader Configuration】核对【Memory range】。
⑩保存设置后执行【Project】→【Rebuild All】,再启动下载。
如果工程已经正确选择目标Device,IAR通常会使用对应的Flash Loader。手工修改过Flash起始位置、Bootloader分区或外部Flash配置时,要把下载区域和链接地址一起核对。
2、选择合适的复位策略
以Cortex-M配合CMSIS-DAP为例,可以在驱动设置中看到多种Reset方式。
①进入【Project】→【Options】。
②打开【Debugger】→【CMSIS-DAP】→【Setup】。
③找到【Reset】。
④希望复位内核和外设时,可以选择【System】。
⑤通过目标板复位引脚操作时,可以选择【Hardware】。
⑥只调整程序计数器时,可查看【Software】。
⑦调试器很难在程序跑飞前连接目标板时,可以尝试【Connect during reset】。
⑧芯片带ROM Bootloader并要求执行后再停住时,检查驱动是否提供【Reset and halt after bootloader】。
⑨修改后重新进入C-SPY,查看复位后的PC位置。
使用J-Link时名称会有所变化,例如【Normal】【Core】【Core and peripherals】【Reset Pin】等。不要照搬另一种调试器的Reset名称。
3、设置复位后停在main还是复位入口
①进入【Project】→【Options】→【Debugger】→【Setup】。
②找到【Run to】。
③勾选【Run to】后,把位置设置为【main】。
④执行【Download and Debug】。
⑤C-SPY完成复位和启动代码执行后,会在main处暂停。
⑥要观察芯片从复位入口开始执行的过程,可以取消【Run to】。
⑦重新进入调试,此时PC会停在常规复位地址附近。
⑧按【F5】继续运行程序。
【Run to】默认目标通常就是main,因此下载进入调试后看到程序停在main,并不表示程序启动失败,只是C-SPY按设置停下来等调试操作。
二、IAR下载程序后无法自动运行如何处理
碰到下载成功但程序没有继续运行,可以先看自己用了哪一种下载命令。单独下载程序和启动C-SPY调试会话的行为不同,这一步分清以后,后面的检查范围会小很多。
1、检查使用的是Download还是Download and Debug
①查看刚才执行的操作。
②如果使用【Debug】→【Download】→【Download active application】,IAR只负责把当前应用写入目标设备,并不会启动完整调试会话。
③下载结束后,按目标板【RESET】键测试一次。
④也可以给目标板重新上电,观察程序能否从Flash启动。
⑤如果使用【Download and Debug】,进入C-SPY后查看当前PC。
⑥PC停在【main】时按【F5】继续执行。
⑦PC停在复位入口时,检查【Run to】是否被关闭。
这样可以区分“程序没有运行”和“调试器主动让CPU暂停”这两种现象。
2、重新上电后仍然没有运行
重新上电仍无动作,就要继续检查程序是否被链接到芯片能够启动的位置。
①进入【Project】→【Options】→【General Options】→【Target】,再次确认【Device】。
②打开【Linker】→【Config】,确认当前使用的ICF文件。
③检查ICF中的Flash起始地址。
④打开链接生成的【.map】文件。
⑤查看中断向量表所在地址。
⑥检查Reset Handler的地址是否落在有效Flash区域。
⑦工程带Bootloader时,确认应用程序起始地址和Bootloader跳转地址相同。
⑧进入C-SPY查看复位后的【PC】和【SP】。
⑨确认PC位于有效代码区域,SP位于实际RAM范围。
Flash下载正常,只能说明数据已经写进去。向量表或应用入口地址和芯片启动配置不对应时,重新上电仍可能跑不到main。
3、程序只在某一种Reset方式下能运行
①记录当前可以正常启动的【Reset】方式。
②切换到【System】重新测试。
③再用【Hardware】或当前驱动提供的复位引脚方式做一次对照。
④如果软件复位能运行,硬件复位后却失败,进入启动代码检查时钟初始化。
⑤再检查外部RAM、外部Flash和内存控制器初始化。
⑥查看目标板RESET信号有没有正常释放。
⑦程序启用了Watchdog时,检查启动阶段有没有被连续复位。
⑧在Reset Handler设置断点,查看硬件复位后程序停在哪一步。
硬件复位会影响更多外设状态,而软件复位可能只改变CPU执行状态,两者结果不同的时候,更适合去查低层初始化。
三、设置修改后怎么确认启动状态
下载与复位参数改完以后,可以把C-SPY调试启动和脱机启动分别跑一遍。两边都能进入应用程序,才能排除调试器设置对结果的干扰。
1、先验证C-SPY下的启动过程
①执行【Project】→【Download and Debug】。
②确认Flash Loader没有返回下载错误。
③取消【Run to】后重新复位。
④查看PC能否进入Reset Handler。
⑤单步执行启动代码。
⑥继续运行到【main】。
⑦按【F5】让程序继续执行。
⑧再执行一次【Debug】→【Reset】,检查第二次启动结果。
如果第一次可以启动,执行Reset后却停住,可以继续对比当前Reset strategy和低层初始化流程。
2、再验证脱离调试器后的启动
①结束当前C-SPY会话。
②使用【Debug】→【Download】→【Download active application】重新写入程序。
③下载完成后断开调试连接。
④给目标板重新上电。
⑤检查已有LED、串口或其他程序运行现象。
⑥按一次硬件RESET再次测试。
⑦如果C-SPY中运行正常,而脱离调试器后没有启动,重点检查复位向量、Bootloader、启动脚和硬件初始化。
3、调试器连接困难时改用复位连接
①进入当前硬件驱动的【Setup】。
②把Reset strategy切换到【Connect during reset】。
③重新启动C-SPY。
④观察调试器能否在用户程序执行前接管CPU。
⑤连接成功后暂停在Reset Handler附近。
⑥检查程序是否在初始化阶段修改调试接口、进入低功耗或者快速复位。
⑦修正程序后再恢复原来的Reset方式测试。
总结
IAR下载程序后没有自行运行时,要把C-SPY暂停状态、目标板重新上电后的启动状态以及芯片真实复位行为分开判断。调试状态下能跑、脱离调试器后不能跑,通常还要继续核对启动地址和低层初始化;不同复位方式得到的结果不一样,则更适合检查硬件复位后外设和时钟的初始条件。如需进一步了解IAR程序下载、C-SPY复位设置与程序启动异常排查方法,欢迎联系咨询。