打印
[其他ST产品]

STR71x IAP with interrupt for application

[复制链接]
23366|25
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
lut1lut|  楼主 | 2007-2-8 14:08 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
版本已更新,请参考后续跟帖:方法二的新版本1,2,3。  
沙发
jackie816| | 2007-2-8 15:45 | 只看该作者

非常感谢

下载了,还没看,顶一下先!

使用特权

评论回复
板凳
mxchip_sh| | 2007-2-8 20:16 | 只看该作者

非常不错


 ST  ARM有戏了!可以看到的东西越来越多了!
 顶!

使用特权

评论回复
地板
gyt| | 2007-2-9 12:53 | 只看该作者

谢了

好人啊。

使用特权

评论回复
5
wikee| | 2007-2-27 16:18 | 只看该作者

不一定需要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的启动文件中断向量表保证中断的响应。应用程序的中断向量表就不用了。

呵呵,一点方法给各位参考。

使用特权

评论回复
6
lut1lut|  楼主 | 2007-3-1 15:41 | 只看该作者

确实不必一定remap to ram

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

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

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

使用特权

评论回复
7
lut1lut|  楼主 | 2007-3-9 14:24 | 只看该作者

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

使用特权

评论回复
8
lut1lut|  楼主 | 2007-3-9 14:27 | 只看该作者

新的方法(续)

iap bootloader source code
相关链接:https://bbs.21ic.com/upfiles/img/20073/20073914271577.zip

使用特权

评论回复
9
lut1lut|  楼主 | 2007-3-9 14:29 | 只看该作者

新的方法(续)

application source code of gpio flashing with interrupt
相关链接:https://bbs.21ic.com/upfiles/img/20073/200739142913567.zip

使用特权

评论回复
10
gyt| | 2007-3-17 12:32 | 只看该作者

多谢多谢

继续感谢!!!

使用特权

评论回复
11
starm| | 2007-4-15 11:23 | 只看该作者

重新置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

使用特权

评论回复
12
jackie816| | 2007-6-1 16:48 | 只看该作者

还有疑问

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

使用特权

评论回复
13
lut1lut|  楼主 | 2007-6-11 16:22 | 只看该作者

方法二的新版本(1)

gpio application的生成bin的项目文件
相关链接:https://bbs.21ic.com/upfiles/img/20076/2007611162112358.zip

使用特权

评论回复
14
lut1lut|  楼主 | 2007-6-11 16:27 | 只看该作者

方法二的新版本(2)

gpio application的在IAR下调试时的项目文件
相关链接:https://bbs.21ic.com/upfiles/img/20076/2007611162713703.zip

使用特权

评论回复
15
lut1lut|  楼主 | 2007-6-11 16:45 | 只看该作者

方法二的新版本(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.21ic.com/upfiles/img/20076/200761116302979.zip

使用特权

评论回复
16
xinyu210| | 2007-6-21 14:40 | 只看该作者

顶一个

多谢
 

使用特权

评论回复
17
carlward王| | 2007-6-25 19:13 | 只看该作者

听说是硬件自带的?

最新的 ST MCU 是不是都自带的?

使用特权

评论回复
18
浪淘沙| | 2007-6-25 20:55 | 只看该作者

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

18楼说的“硬件自带”,好像概念不太对。

使用特权

评论回复
19
daguang72| | 2007-7-9 11:24 | 只看该作者

持续关注中

使用特权

评论回复
20
hlmfox| | 2007-7-11 10:52 | 只看该作者

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

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

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

8

主题

483

帖子

3

粉丝