许多mcu配置了一个独立的启动rom,包含处理器复位并跳转到用户应用程序之前执行的代码。启动rom的工作包含设置时钟,启用调试接口,根据不同的引导源初始化外围设备等等…当然,不同mcu的启动rom行为并不相同。实际上,启动rom的行为在同一设备的两个硬件版本之间也会有变化。
问题
调试体系架构没有规定如何设计启动rom或其行为,因此在启动rom执行之后,无法为mcu实现一种通用的复位方法,让其暂停在用户应用程序的第一条指令上。处理器需要一个特定的复位程序,它可以处理设备特定的启动rom场景,如没有有效的映像,映像位于qspi中,通过sd卡启动等等…实现这种特定于设备的复位非常具有挑战性,甚至是不可能的,而且非常耗时,因为现代mcu通常有多种启动路径。此外,由于某些原因,供应商通常不会记录启动rom的行为。
解决方式
如果j-link不支持使用设备或引导源的引导加载程序后的reset&halt,则可以通过两个步骤轻松启用正确的复位:
2.1 修改启动代码
在startup代码中添加下列指令:
//// perform a dummy read access from address 0x00000008 followed by two nop's// this is needed to support the reset strategy: reset and halt after bootloader.//mov r0, 8ldr r0,[r0]nopnop
2.2 修改reset策略
复位策略需要设置为12。
如何改变j-link使用的复位策略取决于所使用的环境。复位策略可以通过所使用环境设置配置,也可以通过j-link命令字符串配置。如j-link commander,允许通过本机命令直接将j-link命令字符串传递给j-link dll。如果这两个方式都不可用,使用通用方法。
2.2.1 j-link commander
启动j-link commander后,可以通过执行rsettype命令改变复位策略为
rsettype = 12
2.2.2 通用方法
如果使用的ide 或应用没有提供选项配置使用的reset类型,也不能将j-link命令字符串传递给j-link dll,我们建议使用j-link脚本文件api函数jlink_execcommand(“”)将它们包含到j-link脚本文件中。
下面是一个j-link脚本文件的示例,该文件通过jlink_execcommand(…)传递j-link命令字符串setresettype到j-link dll。
/********************************************************************** * configtargetsettings ** function description* called before inittarget(). mainly used to set some global dll variables to customize the* normal connect procedure. for arm coresight devices this may be specifying the base* address of some coresight components (etm, …) that cannot be auto-detected by j-link* due to erroneous rom tables etc. may also be used to specify the device name in case* debugger does not pass it to the dll. ** notes* (1) may not, under absolutely no circumstances, call any api functions that perform target communication.* (2) should only set some global dll variables** return value* >= 0 o.k.* < 0 error* -1 unspecified error*/int configtargetsettings(void) { // // set reset strategy used by the j-link to reset + halt after bootloader using watchpoint. // jlink_sys_report(-- configure reset strategy --); jlink_execcommand(setresettype = 12); return 0;}
操作示例
基于segger cortex-m trace参考板的segger embedded studio工程示例项目,可以访问:https://wiki.segger.com/file:segger_cortex-m_trace_reference_board_blinky_es_v550b.zip
该项目可以很容易地移植到其它基于cortex-m的mcu。
3.1 使用j-link commander测试&验证
1、使用ses下载应用
2、使用j-link commander连接目标板
3、执行reset
4、检查pc==0x0800010e
5、修改reset策略为 reset+halt
6、执行reset
7、检查pc==0x08000116
总结
正常复位后,mcu停在复位向量(reset_handler / 0x0800010e)处。
通过执行reset&halt after bootloader复位策略后,mcu停在启动代码(0x08000116)处。
这确认了reset的行为与预期一致。
为了模拟引导加载程序,可以将修改的代码从启动代码移动到用户应用程序中的其它地方。执行reset应该显示cpu在代码移动到的地址处停止。
饭山推出一款原生10bit显示器 售价约合人民币3800元
仲至信息科技的HERCULES产品信息安全合规自动化平台介绍
金属3D打印与非金属3D打印,浅析两者的应用价值
医疗大健康将成区块链产业的新风口
缓跳式和突跳式温控开关区别大揭秘
使用Reset和Halt After bootloader复位策略
各种大语言模型是彻底被解封了
基于Blackfin BF50x处理器的电机驱动控制系统
小米8透明探索版将在今晚7:30正式开售,魅族16也将在8月8日发布与小米8正式展开对抗!
中国经济信息社发布,我国工业互联网发展步入快车道
开关电源设计详细步骤全解
中华电信、高通开通台湾地区首个5G毫米波专网
谷歌新专利用电子眼替换晶状体:能矫正近视眼还能拍照
空调插座和普通插座的区别
正激变换器磁性元件的设计
14nm或于6月量产,中芯首次披露12nm及第二代FinFET "N+1"计划
东芝存储——推出了全新M303 microSDXC UHS-I存储卡
强化选型工具,MLCC搜索引擎功力大
SPI通信总线的原理及工作过程简单分析
iPhone市场疲软 苹果供应链亦被殃及