24924|23

76

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

STR71xIAPwithinterruptforapplication [复制链接]

                                 版本已更新,请参考后续跟帖:方法二的新版本1,2,3。  
此帖出自stm32/stm8论坛

最新回复

                                 下不了啊,哪位好心的大哥发我一下啊,谢谢!邮箱是855857zhang@163.com  详情 回复 发表于 2010-4-29 09:14
点赞 关注
 

回复
举报

63

帖子

0

TA的资源

一粒金砂(初级)

沙发
 

非常感谢

                                 下载了,还没看,顶一下先!
此帖出自stm32/stm8论坛
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

板凳
 

非常不错


 ST  ARM有戏了!可以看到的东西越来越多了!
 顶!
此帖出自stm32/stm8论坛
 
 

回复

77

帖子

0

TA的资源

一粒金砂(初级)

4
 

谢了

                                 好人啊。
此帖出自stm32/stm8论坛
 
 
 

回复

57

帖子

0

TA的资源

一粒金砂(初级)

5
 

不一定需要REMAP到RAM。

因为EIC的中断,每次都是读EIC_IRV这个寄存器的,即0X18处的指令其实是跳到EIC_IRV处。EIC_IRV其实是EIC_IVR+SIRn组成的,这个合成动作是硬件自动完成的。这样在需要升级的应用程序开始的地方重新置IVR,SIRn寄存器的值即可保证IRQ中断能进入到正确的ISR程序中。

我使用KEIL FOR ARM的,只要使用同一个keil自带的启动文件即可(BOOT的启动文件有一点改动,下面讲)。

启动时先进入BOOT,运行BOOT程序检查升级条件。其实不一定需要在启动文件中进行条件的检测,完全可以在BOOT的C程序中进行。我的IAP是检查串口命令的,串口的驱动太大,不可能用汇编写,我就用C写的。很多没有按键的场合应用,要IAP只能使用这个方法。如果超时,串口没有正确的升级命令来,就跳转到指定的应用程序开始地址,例如0X40008000。

待升级的应用程序就放到0X40008000开始的地址,应用程序不用改什么,直接从0X40008000开始放启动文件,进行一系列的初始化,最后跳入main程序。

关键:BOOT的启动文件去掉切换到用户模式的几句语句,使得BOOT工作在系统模式。这样从BOOT跳转到0X40008000的地址后,可以正常运行应用程序的启动文件。另一个关键就是STR71X的EIC硬件功能了,所以这个方法别的ARM不一定能用。

窍门:如何调试应用程序。
开发调试应用程序时,把开始地址设为0X40000000即可。keil的启动文件保证了中断的响应。
实际应用时,把开始地址设为0X40008000,编译,使用fromelf生成BIN文件下载,这时中断由存放在0X40000000地址的BOOT的启动文件中断向量表保证中断的响应。应用程序的中断向量表就不用了。

呵呵,一点方法给各位参考。
此帖出自stm32/stm8论坛
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

6
 

确实不必一定remap to ram

谢谢楼上提出宝贵意见和心得和大家分享

附件中的范例是基于mcu网站上的AN2078的一个完善。那个application note结尾就说了如果用户自己的程序有用到中断的话,可以进行remap和拷贝中断向量。范例是把application note里面没有说完的话,给大家再仔细说清楚一下

现在我们又出了一个application note的补充说明,提供了一个更好的方法,即用户无需进行以上的remap和copy vector的动作,过两天会贴出来,欢迎大家参考并指正。谢谢
此帖出自stm32/stm8论坛
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

7
 

新的方法(不用remap和copy vector)

 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

8
 

新的方法(续)

iap bootloader source code
相关链接:https://bbs.eeworld.com.cn/upfiles/img/20073/20073914271577.zip
此帖出自stm32/stm8论坛
 
 
 

回复

67

帖子

0

TA的资源

一粒金砂(初级)

9
 

新的方法(续)

application source code of gpio flashing with interrupt
相关链接:https://bbs.eeworld.com.cn/upfiles/img/20073/200739142913567.zip
此帖出自stm32/stm8论坛
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

10
 

多谢多谢

                                 继续感谢!!!
此帖出自stm32/stm8论坛
 
 
 

回复

81

帖子

0

TA的资源

一粒金砂(初级)

11
 

重新置IVR,SIRn寄存器的值

不一定需要REMAP到RAM。 
因为EIC的中断,每次都是读EIC_IRV这个寄存器的,即0X18处的指令其实是跳到EIC_IRV处。EIC_IRV其实是EIC_IVR+SIRn组成的,这个合成动作是硬件自动完成的。这样在需要升级的应用程序开始的地方重新置IVR,SIRn寄存器的值即可保证IRQ中断能进入到正确的ISR程序中。


是不是只要重置用到的SIRx 和 IVR 就可以了 ?

keil 的例子 :

Vectors:        LDR     PC,Reset_Addr         
                LDR     PC,Undef_Addr
                LDR     PC,SWI_Addr
                LDR     PC,PAbt_Addr
                LDR     PC,DAbt_Addr
                NOP                         /* Reserved Vector */
                LDR     PC,[PC, #-0x0808]   /* Vector from EIC_IVR */
                LDR     PC,FIQ_Addr

Reset_Addr:     DD      Reset_Handler
Undef_Addr:     DD      Undef_Handler?A
SWI_Addr:       DD      SWI_Handler?A
PAbt_Addr:      DD      PAbt_Handler?A
DAbt_Addr:      DD      DAbt_Handler?A
                DD      0                   /* Reserved Address */
IRQ_Addr:       DD      IRQ_Handler?A
FIQ_Addr:       DD      FIQ_Handler?A


  // Configure and enable IRQ for Timer 3
  EIC->IVR = (u32)T3TIMI_IRQHandler;
  EIC->SIR[T3TIMI_IRQChannel] = ((u16)T3TIMI_IRQHandler << 16);
  EIC_IRQChannelConfig(T3TIMI_IRQChannel, ENABLE);
  EIC_IRQChannelPriorityConfig(T3TIMI_IRQChannel, 1);


  // Configure and enable IRQ for A/D Converter
  EIC->SIR[ADC_IRQChannel] = ((u16)ADC12_IRQHandler << 16);
  EIC_IRQChannelConfig(ADC_IRQChannel, ENABLE);
  EIC_IRQChannelPriorityConfig(ADC_IRQChannel, 2);
 

  EIC_IRQConfig(ENABLE);                            // Configure IRQ
此帖出自stm32/stm8论坛
 
 
 

回复

69

帖子

0

TA的资源

一粒金砂(初级)

12
 

还有疑问

谢谢lut1lut的共享,在程序中有个语句我看不懂,
offset = (((*p)&0xffff)+0x7E0) >> 2;
请问0x7E0是什么,怎么得出来的
此帖出自stm32/stm8论坛
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

13
 

方法二的新版本(1)

gpio application的生成bin的项目文件
相关链接:https://bbs.eeworld.com.cn/upfiles/img/20076/2007611162112358.zip
此帖出自stm32/stm8论坛
 
 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

14
 

方法二的新版本(2)

gpio application的在IAR下调试时的项目文件
相关链接:https://bbs.eeworld.com.cn/upfiles/img/20076/2007611162713703.zip
此帖出自stm32/stm8论坛
 
 
 

回复

83

帖子

0

TA的资源

一粒金砂(初级)

15
 

方法二的新版本(3)

bootloader的项目文件

小结:
(1) bootloader放在0x4000,0000开始的sector0。从对应的map文件看得出来,他的size超过了8K,即有一部分还放到了0x4000,2000开始的sector1了。
(2)所以把gpio application放在了0x4000,4000开始的sector2了。因此要修改一下地方:
  (a) ymodem.c 中的#define Flash_Offset   0x40004000
  (b) 71x_init.s中的Flash_Program       EQU    0x40004000
  (c) common.c中的jump_function =(pointer) 0x40004000 ;
  (d) vect.s中的LDR     PC, =0x400040f8
(3)如果用户以后希望把application放在更后面的sector,比如从sector3开始放,那么请一定修改函数u32 FLASH_SectorMask(vu32 Size)

(4)application中的linker file也需要指明把它放在0x4000,4000开始的地方:-DROMSTART=0x40004000 

(5) gpio application的两个版本,一个是首先在IAR环境中调试用的,一个是后来用来生成bin文件的。这两个项目的主要区别在于
   (a) 中断初始化:调试用的需要打开init.s中的EIC_INIT宏,而生成bin文件的要关闭这个宏,而打开main中用#if 1...#endif包含起来的那段对IVR以及各ISR初始化的那段代码
   (b) linker file中把:-DROMSTART=0x40004000改到0x40000000
   (c)  IDE中的设置,生成bin还是供调试的simple code
相关链接:https://bbs.eeworld.com.cn/upfiles/img/20076/200761116302979.zip
此帖出自stm32/stm8论坛
 
 
 

回复

88

帖子

0

TA的资源

一粒金砂(初级)

16
 

顶一个

多谢
 
此帖出自stm32/stm8论坛
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

17
 

听说是硬件自带的?

                                 最新的 ST MCU 是不是都自带的?
此帖出自stm32/stm8论坛
 
 
 

回复

79

帖子

0

TA的资源

一粒金砂(初级)

18
 

IAP都是由软件使用硬件提供的功能完成的

                                 18楼说的“硬件自带”,好像概念不太对。
此帖出自stm32/stm8论坛
 
 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

19
 

                                 持续关注中
此帖出自stm32/stm8论坛
 
 
 

回复

65

帖子

0

TA的资源

一粒金砂(初级)

20
 

多谢楼主的无私奉献....

看了后,基本了解了相关功能.
现在有个问题:如果IAP loader自己本身的中断怎么处理呢?
现在已经解决了application的中断问题,但不知道怎么样执行IAP的中断?
此帖出自stm32/stm8论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/6 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表