打印
[STM8]

STM8S105 IAP中断向量表重定义问题

[复制链接]
824|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
wds王王|  楼主 | 2020-5-17 21:50 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式


用STM8S105实现程序升级,想在bootloader里可以使用中断,参考网上写的资料,中断表放在RAM中实现bootloader和APP都可以中断,RAM区域0x0780~0x07FF  放中断向量表(128字节);但bootloader里卡住,中断函数不正常;定义了TIM1和TIM4中断,只有TIM1会中断,TIM4不进中断,或者只定义一个TIM4,TIM4中断正常,只要定义了两个以上中断就只有前面一个中断正常,后面的中断都进不了中断函数。不知道是什么原因?
一、main.c函数

#if 1
  typedef void (*isr_type_t)(void);
  typedef struct
  {
    uint16_t      interrupt_instruction;
    isr_type_t    interrupt_handler;
  }interrupt_vector;
  #pragma location=0x0780
  interrupt_vector  vector_table_[32]={0};
#endif

#pragma vector=25
__interrupt void TIM1_UPD_OVF_TRG_BRK_IRQ(void)
{
  if(TIM1_GetFlagStatus(TIM1_FLAG_UPDATE)==SET)
  {
    TIM1_ClearITPendingBit(TIM1_IT_UPDATE);  //清除中断标志
    Time1_Cnt.x1msFlag=1;
    if(++Time1_Cnt.x1msCnt>500)
    {
      Time1_Cnt.x1msCnt=0;
      LED_RUN=!LED_RUN;
    }
  }
}
#pragma vector=26
__interrupt void TIM4_UPD_OVF_IRQ(void)
{
  if(TIM4_GetFlagStatus(TIM4_FLAG_UPDATE)==SET)
  {
    TIM4_ClearITPendingBit(TIM4_IT_UPDATE);
    if(++Time4_Cnt.x1msCnt>1500)
    {
      Time4_Cnt.x1msCnt=0;
      LED2=!LED2;
    }

  }
}



int main(void)
{

  vector_table_[25].interrupt_instruction=0x8200;
  vector_table_[25].interrupt_handler=(isr_type_t)&TIM1_UPD_OVF_TRG_BRK_IRQ;
  vector_table_[26].interrupt_instruction=0x8200;
  vector_table_[26].interrupt_handler=(isr_type_t)&TIM4_UPD_OVF_IRQ;

  SystemClock_Init(HSE_Clock);
  LED_Init();
  Timer1_Init(16-1,1000);
  Timer4_Init();

。。。
}

二、ICF文件修改
define memory with size = 16M;

define region TinyData = [from 0x00 to 0xFF];

//define region NearData = [from 0x0000 to 0x07FF];


define region NearData = [from 0x0000 to 0x077F];

define region Eeprom = [from 0x4000 to 0x43FF];

define region BootROM = [from 0x6000 to 0x67FF];

define region NearFuncCode = [from 0x8000 to 0xFFFF];

define region FarFuncCode = [from 0x8000 to 0xFFFF];

define region HugeFuncCode = [from 0x8000 to 0xFFFF]



三、stm8s_interrupt.s文件修改
__intvec:
        DC8     0x82
        DC24    __iar_program_start          ;; RESET    0x8000
        DC8     0x82
        DC24    0x0784
        DC8     0x82
        DC24    0x0788
        DC8     0x82
        DC24    0x078C
        DC8     0x82
        DC24    0x0790
        DC8     0x82
        DC24    0x0794
        DC8     0x82
        DC24    0x0798
        DC8     0x82
        DC24    0x079C
        DC8     0x82
        DC24    0x07A0
        DC8     0x82
        DC24    0x07A4
        DC8     0x82
        DC24    0x07A8
        DC8     0x82
        DC24    0x07AC
        DC8     0x82
        DC24    0x07B0
        DC8     0x82
        DC24    0x07B4
        DC8     0x82
        DC24    0x07B8
        DC8     0x82
        DC24    0x07BC
        DC8     0x82
        DC24    0x07C0
        DC8     0x82
        DC24    0x07C4
        DC8     0x82
        DC24    0x07C8
        DC8     0x82
        DC24    0x07CC
        DC8     0x82
        DC24    0x07D0
        DC8     0x82
        DC24    0x07D4
        DC8     0x82
        DC24    0x07D8
        DC8     0x82
        DC24    0x07DC
        DC8     0x82
        DC24    0x07E0
        DC8     0x82
        DC24    0x07E4
        DC8     0x82
        DC24    0x07E8
        DC8     0x82
        DC24    0x07EC
        DC8     0x82
        DC24    0x07F0
        DC8     0x82
        DC24    0x07F4
        DC8     0x82
        DC24    0x07F8
        DC8     0x82
        DC24    0x07FC

        END

使用特权

评论回复
沙发
mmuuss586| | 2020-5-17 21:54 | 只看该作者
感谢分享

使用特权

评论回复
板凳
香水城| | 2020-5-18 08:41 | 只看该作者
那你的具体中断服务程序放在哪里的?是跟你的矢量表中指定的地址对应的吗?

建议你下载个AN2659应用笔记,里面有IAP相关例程可以参考。

*
* The interrupt vector table.
*/


        SECTION `.intvec`:CONST

define_vector MACRO
        DC8     0x82
        DC24    _interrupt_\1
        ENDM

        PUBLIC  __intvec
        EXTERN   __iar_program_start
        


__intvec:
        DC8     0x82
        DC24    __iar_program_start          ;; RESET    0x8000
        DC8     0x82
        DC24    0x9004
        DC8     0x82
        DC24    0x9008
        DC8     0x82
        DC24    0x900C
        DC8     0x82
        DC24    0x9010
        DC8     0x82
        DC24    0x9014
        DC8     0x82
        DC24    0x9018
        DC8     0x82
        DC24    0x901C
        DC8     0x82
        DC24    0x9020
        DC8     0x82
        DC24    0x9024
        DC8     0x82
        DC24    0x9028
        DC8     0x82
。。。。。。

使用特权

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

本版积分规则

6

主题

25

帖子

1

粉丝