最近在搞430的FLASH的自定义法(运用串口)程序烧写,烧写完结后断电复位,reset按键就能够运转新的程序。可是和学长交流了一下,这种办法不够好,期望有一种软复位的办法。所以百度了一下,都是些对看门狗进行写入特别值使得430的cpu复位。横竖个人是没有选用。
因为在搞程序的烧写下载,所以看了一下430的BSL。看到里边有一段话,关于从C代码中发动BSL的办法。如下:
从一个外部运用中发动BSL
将程序计数器设定到内存为方位0x1000 来发动BSL。仓库一向被复位,而RAM 被清空。应该留意的是,GIE 位未被禁用,所以假如不需要中止的话,这一步应该经过调用运用来完结,而且假如它们被运用的话,这一步应该从“回来BSL”回来。
因为仓库被复位,方位0x1000 也能够被作为一个C 功用进行调用,示例代码如下:
((void (*)())0x1000)()
所以想到,已然能够从C里边跳转到0x1000,那么也能够跳转到其他地址,比方复位地址了。
以6638为例。430的复位中止矢量地址是0xFFFE,里边存储了即将跳转的物理地址。6638的代码区开端地址是0x8000,正常复位是先进入复位中止,然后PC指针导入地址0x8000,然后从0x8000开端履行代码。那么软复位则是,履行((void (*)())0x8000)(),直接PC指针被导入0x8000的地址,而这个地址正好是6638的代码区开端地址,所以软复位了。个人剖析一下这个指令,如有过错敬请大神们纠正。
从代码上讲,(void (*)()是一个指向空函数的指针,((void (*)())0x8000)()是将0x8000强制转换为函数指针后进行函数调用,所以0x8000便被送入了PC指针。
关于其他的430单片,去查其数据手册FLASH段,澄清其代码区的开端地址,也能够用这个办法软复位了。
实测,IAR,CCS下编译、实践经过。