历史上的今天
今天是:2024年12月03日(星期二)
2020年12月03日 | 430怎么复位_430软复位方法详解
2020-12-03 来源:elecfans
最近在搞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下编译、实践通过。
最后,查了一下,对于计算机系的这个方法可能是常识了,但是对于搞单片机、嵌入式的大多还不知晓,个人就写出来,大家交流交流。已经知道这个方法的高手们,就一笑而过吧!
史海拾趣
|
Nand Flash结构与读写分析 NAND Flash 的数据是以bit 的方式保存在memory cell,一般来说,一个cell 中只能存储一个bit。这些cell 以8 个或者16 个为单位,连成bit line,形成所谓的byte(x8)/word(x16),这就是NAND Device 的位宽。这些Line 会再 ...… 查看全部问答> |
|
#include __CONFIG (INTRC & PROTECT & MCLREN & WDTEN); const unsigned char cs @ 0x1FF; void DelayUs( int x) // 32US {while(--x!=0) { CLRWDT(); NOP(); unsigned ...… 查看全部问答> |
|
现在有一个应用程序,实时性不够,想在windows下加一个实时模块!经过查找资料,目前确定的方案是添加一个实时驱动模块,而这个模块就用一个内核模式驱动程序来实现!该程序通过接管实时定时器的中断,也就是系统时钟中断,然后先将控制权交给实时 ...… 查看全部问答> |
|
在EVC下开发程序,有一个基于MFC Extension的动态库,其中包含有多个对话框架及一个菜单项,现在创建一个MFC应用程序,不知怎么调用此动态库,求助一下大家,谢谢!… 查看全部问答> |
|
请使用英文版 Visual studio 2005/2008的朋友帮个小忙,谢谢! 公司要找其它公司做应用软件,用WINCE生成的SDK还得附加个英文的使用说明,但是我的VS是中文版的,截图全是中文字,公司的人说不行,所以请使用英文版的朋友帮我截个图,非常感谢! 发到我的邮箱里就可以veabolho@126.com 截图的内容就像这张 … 查看全部问答> |
|
最近做项目的时候碰到了一个因为局部变量导致堆栈越界的问题,虽然最后靠扩大堆栈空间暂时解决了,但这也限制了全局变量的定义。有没有一种好的方法来解决这些问题了?看了看编译后的MAP文件,发现MDK将STACK放在了最后一个全局变量的后面。现 ...… 查看全部问答> |




