打印
[其他ST产品]

试用论坛中IAP程序,有问题请教?

[复制链接]
3274|17
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
gotomy|  楼主 | 2007-11-8 20:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
今天使用了论坛中的最新IAP程序,见贴,
程序是烧进了芯片,但发现定时器0的中断无法响应?不知何故?

应用程序作了如下修改:
[1]linkarm_flash.xcl中  DROMSTART = 0x40000000 改为 0x40004000
[2]71x_init.s中注释了EIC_INIT;
[3]在应用程序的初始化程序中加入了如下代码?
    extern u32 T0TIMI_Addr;
    u32 * p = (u32 *)& T0TIMI_Addr;
    u8 bCounter;
    u32 offset;
      
    EIC->ICR = 0x00000000; 
    EIC->IER = 0x00000000; 
    EIC->IPR = 0xFFFFFFFF; 
    EIC->FIR = 0x0000000C; 
    EIC->CIPR = 0x00000000; 
    
    EIC->IVR  = 0xEA000000; 
  
    for(bCounter  = 0; bCounter < 32; bCounter++)
    {
      offset = (((*p)&0xffff) + 0x7E0) >> 2;
      p++;
      EIC->SIR[bCounter] = offset << 16;
    }
[4]IDE中的设置,生成raw-binary

由于应用程序中参考了AN1799_使用STR71x的通用IO驱动一个4X4的矩阵键盘中的如下代码,是否有影响?

//  EIC configuration
    //  Initialize the interrupt controller
    EIC_Init();
  
    //  Set the Timer 0 interrupt channel priority level to 1 
    EIC_IRQChannelPriorityConfig(T0TIMI_IRQChannel, 1);
  
    //  Enable the Timer 0 IRQ channel interrupts 
    EIC_IRQChannelConfig(T0TIMI_IRQChannel, ENABLE);
    
    //  Set the XTI interrupt channel priority level to 2 
    EIC_IRQChannelPriorityConfig(XTI_IRQChannel, 2);
  
    //  Enable the XTI IRQ channel interrupts 
    EIC_IRQChannelConfig(XTI_IRQChannel, ENABLE);
  
    //  Enable IRQ interrupts 
    EIC_IRQConfig(ENABLE);

//  Configure the External Interrupt Unit
    //  Initialize the XTI 
    XTI_Init();
  
    //  Configure the line 2, 3, 4 and 5 edge. 
    XTI_LineModeConfig(XTI_Line2|XTI_Line3|XTI_Line4|XTI_Line5, XTI_RisingEdge);
  
    //  Enable the line 2, 3, 4 and 5 interrupt. 
    XTI_LineConfig(XTI_Line2|XTI_Line3|XTI_Line4|XTI_Line5, ENABLE);
  
    //  Enable Interrupt. 
    XTI_ModeConfig(XTI_Interrupt, ENABLE);
  
    //  TIM0 configuration
    //  Configure the Prescaler to 0x04 to get an Overflow     interrupt    every 5.120 ms
    //  This will gives an update rate of 48.8 Hz
    //   Inisialize the Timer 0 
    TIM_Init( TIM0 );
  
    //  Configure the Timer 0 prescaler 
    TIM_PrescalerConfig(TIM0, 0x02);
  
    //  Enable the Overflow Interrupt 
    TIM_ITConfig(TIM0, TIM_TO_IT, ENABLE);
  
    //  Start the TIM0 Counter 
    TIM_CounterConfig(TIM0, TIM_START);
沙发
tc741206| | 2007-11-14 10:42 | 只看该作者

请教IAP

我也用了lut1lut提供的IAP程序,但是确下载都没有实现,请指教。
我在主菜单下选择执行1后没有相应。
谢谢

使用特权

评论回复
板凳
gotomy|  楼主 | 2007-11-14 19:34 | 只看该作者

只有定时器0的中断进不了,

只有定时器0的中断进不了,因按键是通过Time0扫描的,所以按键的外部中断也进不了;串口的中断能执行。

使用特权

评论回复
地板
gotomy|  楼主 | 2007-11-14 19:36 | 只看该作者

2楼的是否没发送YModem协议的bin文件?

使用特权

评论回复
5
gotomy|  楼主 | 2007-11-14 19:44 | 只看该作者

请教lut1lut?

以下代码在应用程序中是必须要执行的,
extern u32 T0TIMI_Addr;
    u32 * p = (u32 *)& T0TIMI_Addr;
    u8 bCounter;
    u32 offset;
      
    EIC->ICR = 0x00000000; 
    EIC->IER = 0x00000000; 
    EIC->IPR = 0xFFFFFFFF; 
    EIC->FIR = 0x0000000C; 
    EIC->CIPR = 0x00000000; 
    
    EIC->IVR  = 0xEA000000; 
  
    for(bCounter  = 0; bCounter < 32; bCounter++)
    {
      offset = (((*p)&0xffff) + 0x7E0) >> 2;
      p++;
      EIC->SIR[bCounter] = offset << 16;
    }
执行了上面的代码后,应该就不能再调用 EIC_Init()了吧?

使用特权

评论回复
6
tc741206| | 2007-11-15 09:05 | 只看该作者

调试程序后发现,通讯正常,但是flash操作飞了

调试IAP3.0程序后发现,通讯是正常的,但是每次执行到               FLASH_SectorErase(Sector_Mask);和                     
FLASH_WordWrite(Flash_Destination,*(u32*)Ram_Source);
时,程序死掉,终端IAR后发现程序跑飞了,不知如何解决,请指教。
谢谢

使用特权

评论回复
7
lut1lut| | 2007-11-15 11:33 | 只看该作者

to 6楼

EIC_Init()与“上述代码“是并行的关系,都是对ISR和IVR进行初始化。当中断到来时,firmware读取IVR和ISR中的内容才知道该中断对应的中断处理程序放在哪里。由于application已经从0x4000,0000移到0x4000,4000,要从0xffff818跳到中断处理程序,其jump的range已经扩大,EIC_Init()中对IVR的初始化已经不能达到这样的眺转范围,所以改用“上述代码”。二者只用其一。

使用特权

评论回复
8
lut1lut| | 2007-11-15 11:35 | 只看该作者

to 8 楼

擦出flash之前有解除写保护么?
FLASH_WritePrConfig(Sector_Mask, DISABLE);  /*turn off write protection*/
FLASH_SectorErase(Sector_Mask);

使用特权

评论回复
9
tc741206| | 2007-11-15 11:41 | 只看该作者

加上解除写保护的也一样现象,到flash操作的地方死掉

我原来直接使用你提供的源程序编译的,没有注意到这个问题,但是现在加上解除保护后现象一样,运行到flash操作的地方就死机,跑飞了

使用特权

评论回复
10
tc741206| | 2007-11-15 11:57 | 只看该作者

lut1lut,单步运行可以通过

lut1lut,你好,我跟踪程序看了,单步运行程序时可以操作flash,可以同样是用jlink仿真器,全速运行却无法操作flash,很奇怪

使用特权

评论回复
11
浪淘沙| | 2007-11-15 13:13 | 只看该作者

你有没有检查一下全速运行时程序是在哪里跑飞的

你是如何判断全速运行时无法操作flash?

是否可以在操作flash的前后各加一个断点,看看flash操作部分是否可以正常工作?

使用特权

评论回复
12
tc741206| | 2007-11-15 13:50 | 只看该作者

浪淘沙:flash操作如下

我在保留flash操作时,交换数据程序无法运行先去,如果我屏蔽掉flash操作语句,然后全速运行,可以运行下去。
采用单步方式执行,flash可以擦除,也可以写入;
采用两个断点,flash操作前一个,可以运行到;然后在flash后放一个,程序无法停止。

STR710文档中有这样一句话,不知如何理解?是不是程序必须拷贝到RAM中才可以写FLASH?
This means that the bank cannot be fetched when a write operation on the bank is processed.
Any write operation on the bank must be executed from the internal RAM memory.

使用特权

评论回复
13
浪淘沙| | 2007-11-15 13:58 | 只看该作者

你理解正确:程序必须拷贝到RAM中才可以写FLASH!

你拿到的例子中都应该是在RAM中进行操作的。

使用特权

评论回复
14
gotomy|  楼主 | 2007-11-15 14:26 | 只看该作者

有必要出一个IAP应用的详细步骤参考

使用特权

评论回复
15
lut1lut| | 2007-11-15 16:55 | 只看该作者

re

你拿到的例子,用IAR打开,可以看到对flash操作的所有函数(解除写保护/擦除/写数据等)都定义在flash.c,而该文件在workspace窗口的里有个“钩”的记号,表示该文件被"override inherited settings",即把它放在一个叫做CODE_Flash的segment中执行,而这个CODE_Flash在lnkarm_flash.xcl的连接文件中,是指定放在ram区的。

“This means that the bank cannot be fetched when a write operation on the bank is processed.
Any write operation on the bank must be executed from the internal RAM memory.”:不能一边从flash的某个bank中读取数据来执行,一边还对这个bank进行写操作。对某个bank的写操作一定要在ram里来执行

使用特权

评论回复
16
yxs1977| | 2007-11-16 11:34 | 只看该作者

这是个好贴,可惜是针对710的

俺用的主打芯片是730,不知能否借鉴一下,还请lut1lut指教,先谢了。

使用特权

评论回复
17
lut1lut| | 2007-11-16 16:12 | 只看该作者

re 18 楼

这是针对STR7x系列的IAP,71/73之间不过库函数换一下,boot配置和memory map与STR71系列都不同,作相应调整即可。注意STR73系列的IVR的地址从STR71的0xffff,f818移到了0xffff,fc18,从此处跳到相应ISR的offset,要重新计算,以初始化ISRi(i=0~31)

使用特权

评论回复
18
yxs1977| | 2007-11-19 16:26 | 只看该作者

知道了,谢谢

使用特权

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

本版积分规则

43

主题

93

帖子

0

粉丝