本帖最后由 radio2radio 于 2018-6-10 11:54 编辑 6 x* S* c) Q4 C; ?; e; F: q0 o$ b 遇到过这个问题的朋友,知道我说的是什么。多数情况是目标板没有RESET线,或不方便多引出一条线。 g6 X) s+ V. Y 首先,也可以这样解决: 1. 换用J-LINK仿真器,它不用RESET连线,也可以下载后程序自动运行。2. 进入Debug模式,按Run按钮,开始运行程序。3. 编写一个批处理程序,调用外部的Flash Programmer下载程序+软启动程序。( c' A- H5 s- ^. i7 j s 导致不能实现软启动的原因,是因为KEIL里面的SYSRESETREQ功能在使用CMSIS-DAP时不起作用,没有发出相应的软启动的命令。! g, w) Z8 ^7 d% O E' }4 \ 4 n1 B+ Z; \+ c MCU软启动的原理,是向某个地址位写入特定的数据(此为后门),内部的逻辑就会给出等同于外部复位启动的动作。 系统时钟正常工作,是软启动(复位)成功的必要条件,这也就是MCU应用中软启动不能完全替代硬启动的原因。1 s0 r, \3 i9 Y 3 S4 M: V% V4 t# C _ Cortex-M系列MCU的软启动,就是向AIRCR地址0xE000ED0C写入数据0x05FA0007。 (人生,如果有这样一个“奇葩后门”,太多的大小问题都不会是问题了。)6 Z! J8 K1 I5 G" j& \* G) l! u8 \ , P' i8 D% H* v: w I6 f& x * Z' N( Q! m( l% \6 ` 下面我给出一个KAIL解决CMSIS-DAP仿真器软启动CortexMCU的办法。 ' z, P% @+ {3 H7 m& P) s 1. 编写一个KEIL的Debug模式的脚本文件,文件名随意,比如ResetTargetBoard.ini,内容如下:! @0 T7 P" [. X ------------------------------------------------------------------------------------------- LOG OFF FUNC void Reset_Target(void) { _WWORD(0xE000ED0C, 0x05FA0007); //Reset Command. X! r3 }8 z: `+ D* V9 E, U( b4 w printf("\nApplication running ...\n");, T1 m: T ^' f }6 J1 q9 ?: e: |$ Q% L* v! ? Reset_Target(); //run! b- u2 G9 n; M5 i EXIT //exit Debug mode,如果需要留在Debug模式,删除这个EXIT指令; W% T6 D6 b3 W1 U0 x5 E- S --------------------------------------------------------------------------------------------- 8 a) o5 i% ^1 S: j. x 2. 在KAIL的环境下,导入此脚本文件:, C$ N% B9 L8 d! |' J7 J+ D7 X ( ^* M) B e9 }9 a- Z: F; T, | 3. 在KAIL下载了用户程序以后,按一下Debug按钮,软启动就会自动完成。 4. 如果需要软启动后,留在Debug模式,删除最后面的EXIT。 希望有兴趣的朋友,找到更加简便的方法。 注意,此文的环境是针对Cortex-M MCU,CMSIS-DAP仿真器,KEIL系统,不使用RESET连接线。2 a a7 W* m4 d; h 其他情况下,各种不同的,仅供参考。4 F$ C2 D& {+ v 文中,软启动,复位,RESET,都是开始运行应用程序的同义词。 硬启动,是指仿真器和开发板之间,连接上RESET连线,使用CMSIS-DAP仿真器连上RESET线,就没有上述问题了。 % t1 K' J2 O$ A D) m |
所谓的新版的DAP,只是DAP接收到keil发出的DAP_SWJ_PINS命令去操作reset pin时,在固件中将置高置低复位pin的操作强制改为了你上面提到的写寄存器E000ED0C的操作。' h% V2 I2 U5 t8 H$ v8 ^! a
根本问题没解决,就是keil始终没有通过不同的复位选项主动去发不同的复位命令操作
jlink是因为仿真时默认把DBG寄存器中的看门狗位使能,而DAP不会去操作该寄存器9 O! n" d2 l* E8 e
解决方法很简单,程序代码初始化时打开DBG寄存器的看门狗使能位就行了
我没有这方面的经验,如果我遇到,我会暂时关闭WDT,毕竟WDT只是系统出现严重问题时重启系统的,不影响正常的程序运行。
楼主研究得真细。
这个问题就是您提出来的,我正在尝试解决。
另外,我发的ST-LINK的固件,与您的板子的GPIO定义一样,您可以试一试:
https://www.stmcu.org.cn/module/forum/thread-616215-1-1.html
一楼的方法,可以用于老式的没有软起动功能的CMSIS-DAP仿真器。
这等于关闭WDT功能。
手段不重要,目的达到就好。
没有关只是在仿真单步调试时停止WDT,全速运行时还是会使能,跟Jlink的做法一样,只不过jlink是通过SWD接口去操作dbg寄存器,用dap的话就需要自己代码去操作或者直接在寄存器窗口操作