430软复位方法
来源:互联网 发布:php教程百度云 编辑:程序博客网 时间:2024/05/01 11:24
最近在搞430的FLASH的自定义法(利用串口)程序烧写,烧写完成后断电复位,reset按键就可以运行新的程序。但是和学长交流了一下,这种方法不够好,希望有一种软复位的方式。于是百度了一下,都是些对看门狗进行写入特殊值使得430的cpu复位。反正个人是没有采用。
因为在搞程序的烧写下载,所以看了一下430的BSL。看到里面有一段话,关于从C代码中启动BSL的方法。如下:
3.7.1 从一个外部应用中启动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下编译、实践通过。
最后,查了一下,对于计算机系的这个方法可能是常识了,但是对于搞单片机、嵌入式的大多还不知晓,个人就写出来,大家交流交流。已经知道这个方法的高手们,就一笑而过吧!
原文:http://blog.csdn.net/tcxp_for_wife/article/details/17384473
- 430软复位方法
- 一种430软复位方法(原创)
- 软复位方法
- 单片机实现软件复位(软复位)的方法及讨论 ——转载
- 20120822-[转]单片机实现软件复位(软复位)的方法及讨论
- 路由复位方法
- 430的复位及复位电路
- MCU中的软复位
- STC实现软复位
- MCS51系列单片机软件复位的方法
- ACCESS 自动编号列复位方法
- Web输入域通用复位方法
- 树莓派重新启动和复位的方法
- Unity 5.x Oculus复位方法
- 复位windows网络参数的方法
- 异步复位同步释放的方法以及多时钟系统的复位设计
- 逻辑设计方法学【4】 --复位信号设计方法
- [H/W] EFI Administrator 口令的复位方法
- QQ密码窃取器 2017邮箱收信版
- 初学javascript和php的感想
- 如何解决github安装失败 【转】
- 扶老奶奶过马路
- iOS 10.2.1第四次重生
- 430软复位方法
- 面试题:(考察Object.defineProperty(obj,prop,descriptor) 的get方法)
- Python3.5.2网络爬虫教程(1)
- hadoop伪分布模式环境安装
- MarkdownPad2.5 注册码 【转】
- 网站排名优化,各大搜索引擎网站优化首页排名,不上首页不收费!
- Problem 344.Reverse String
- 如何配置TeXstudio+SumatraPDF+Texlive
- 股票量化交易初探一